client.created Event
Emitted when a new Client is created on a Listo instance.
| Property | Value |
|---|---|
| Type | client.created |
| Data version | 1 |
| Entity | entity.type = "client", entity.id = data.clientId |
| Fan-out | One delivery per matching subscription (no per-client fan-out — clients are per-instance) |
Sample delivery
POST /your/webhook/path HTTP/1.1
Host: hooks.your-domain.com
Content-Type: application/json
User-Agent: ListoGlobal-Gateway/1.0
webhook-id: lglsoevt_uZJK2rPmA1nGqvE5w
webhook-timestamp: 1746178472
webhook-signature: v1,3v+OYVnOwzbGcpRz1aRr7T0pYXukB0z2yDoa2QH1vNw=
{
"id": "lglsoevt_uZJK2rPmA1nGqvE5w",
"type": "client.created",
"specVersion": 1,
"dataVersion": 1,
"occurredAt": "2026-05-02T10:14:32.184Z",
"entity": { "type": "client", "id": "lglsocli_uZIIHfKqYBwyaRGGs" },
"data": {
"clientId": "lglsocli_uZIIHfKqYBwyaRGGs",
"name": "Hudson - Mraz - EOR",
"address": {
"address1": "Emile Bypass",
"address2": null,
"city": "Horaciofort",
"isoCountryCode": "ET",
"postalCode": "61092-4164",
"zoneCode": null
},
"links": {
"self": "/v1/instance-integrations/inst_abc123xyz/clients/lglsocli_uZIIHfKqYBwyaRGGs"
}
}
}data schema
data schema| Field | Type | Description |
|---|---|---|
clientId | string | Public client ID (lglsocli_…). Same value as entity.id. |
name | string | Client display name at the moment of emit. |
address.address1 | string | null | First address line. |
address.address2 | string | null | Second address line. |
address.city | string | null | City. |
address.isoCountryCode | string | null | ISO-3166 alpha-2 country code. |
address.postalCode | string | null | Postal/ZIP code. |
address.zoneCode | string | null | State / province / region code. |
links.self | string | Path to fetch the current state of this client. Already substituted with your instanceIntegrationId before signing. |
Snapshot semantics
The name and address.* fields are a snapshot at emit time. If the client is edited between the producer emitting the event and your handler running it (typical with retries or a delayed consumer), the snapshot may not reflect current state.
When you need fresh data, fetch via the public REST API:
GET https://gateway.listoglobal.com{links.self}
x-api-key: <your-key>
Nested resources (workers, users, organization structure) are not embedded in this payload. Pull them on demand from the related sub-resource endpoints in the API reference keyed by clientId.
Ordering and duplication
- Duplicates are normal. Listo will deliver up to 3 times per subscription on a non-2xx, network error, or timeout. Dedupe on
webhook-id(=dataenvelope's top-levelid). - Order is not guaranteed. Two
client.createdevents for the same installation may arrive out ofoccurredAtorder. Don't rely on arrival order for correctness.
See Delivery & retries for the full contract.
Common patterns
"Mirror new clients into our CRM"
1. Verify signature.
2. SELECT 1 FROM webhook_deliveries WHERE id = :webhook_id.
If found → 200 OK, return.
3. INSERT INTO webhook_deliveries (id, ...).
4. enqueue(MirrorClient.new(client_id: data.clientId,
instance_integration_id: <derived from your config>))
5. 200 OK.The mirroring job calls GET /v1/instance-integrations/{instanceIntegrationId}/clients and finds the matching clientId, rather than relying solely on the embedded snapshot — this is robust to retried deliveries with stale snapshots.
"Provision per-client resources on creation"
client.created is a strong signal that a new tenant has appeared. Use it to seed default settings, notify your sales-ops team, or kick off any per-client pipelines. Pair with worker.onboarded to reach steady state once workers begin signing contracts under that client.
Updated 1 day ago
