client.created Event

Emitted when a new Client is created on a Listo instance.

PropertyValue
Typeclient.created
Data version1
Entityentity.type = "client", entity.id = data.clientId
Fan-outOne 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

FieldTypeDescription
clientIdstringPublic client ID (lglsocli_…). Same value as entity.id.
namestringClient display name at the moment of emit.
address.address1string | nullFirst address line.
address.address2string | nullSecond address line.
address.citystring | nullCity.
address.isoCountryCodestring | nullISO-3166 alpha-2 country code.
address.postalCodestring | nullPostal/ZIP code.
address.zoneCodestring | nullState / province / region code.
links.selfstringPath 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 (= data envelope's top-level id).
  • Order is not guaranteed. Two client.created events for the same installation may arrive out of occurredAt order. 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.