Quickstart

This guide gets a service integrated with ZB Customer 360 in a few steps: obtain a c360_ API key from an admin, point your client at the base URL, post your first event, and read it back from the feed. Every integration talks to one base URL, https://c360-api.lioncapventures.com, and every route lives under /v1/.


Get a key

Customer 360 keys are minted by a Customer 360 admin, not self-service. Ask the admin for a key bound to your service's callerId with only the scopes you need:

  • A producer that emits events needs ingest. To read its own events back it also takes read:own.
  • A consumer that reads the global feed and insights takes read.
  • A service that reads unified customer profiles takes profile.
  • The SmileRewards loyalty bridge takes loyalty.

The key is prefixed c360_ and is returned to the admin exactly once (only its SHA-256 hash is stored). Store the plaintext in your own project's Secret Manager; cross-project secret references do not work, so each consumer keeps its own copy. See Authentication & scopes for the full scope model.

Your project env

C360_API_URL=https://c360-api.lioncapventures.com
C360_API_KEY=c360_QmFzZTY0VXJsU2FmZVJhbmRvbUtleQ

Set your base URL

Point your HTTP client at the base URL and send the key in the X-API-Key header on every call. There is no login and no token refresh.

Use the production base URL https://c360-api.lioncapventures.com for live traffic, and the staging base URL https://c360-api-staging.lioncapventures.com while you develop. A staging key never works against production and vice versa.

Authenticated request

curl https://c360-api.lioncapventures.com/v1/events/counts \
  -H "X-API-Key: $C360_API_KEY"

POST/v1/events

Post your first event

Producers POST /v1/events with a batch of 1 to 500 envelopes. Each envelope carries a producer-stable eventId (the idempotency key), a type from the registry, an occurredAt, an identity block, and a type-specific payload. The request returns 200 when the request shape is valid; each event's fate is reported inline as accepted, duplicate, or invalid, so one bad event never fails the batch.

Choose an eventId that is stable for the real-world fact so a retry is a safe no-op. See Events for the envelope, the full type registry, and the money convention.

Request

POST
/v1/events
curl -X POST https://c360-api.lioncapventures.com/v1/events \
  -H "X-API-Key: $C360_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "events": [
      {
        "eventId": "mall-order-paid-ord_abc123",
        "type": "order.paid",
        "occurredAt": "2026-08-10T09:15:00.000Z",
        "identity": {
          "platform": "smilemall",
          "userId": "42",
          "zbIdSubject": "b1e5c8a0-1111-2222-3333-444455556666"
        },
        "payload": {
          "orderId": "ord_abc123",
          "subtotal": "40.00",
          "total": "44.00",
          "currency": "USD"
        }
      }
    ]
  }'

Response (200)

{
  "success": true,
  "data": {
    "results": [
      { "eventId": "mall-order-paid-ord_abc123", "status": "accepted" }
    ],
    "accepted": 1,
    "duplicates": 0,
    "invalid": 0
  }
}

GET/v1/events/feed

Read it back

Consumers page the feed with an afterId cursor and persist their own position. Key your processing on eventId, never on customerId: a late merge repoints historical events' customerId onto the survivor. Delivery is at-least-once, so make processing idempotent.

A read key sees the whole cross-source stream; a read:own key sees only its own source, which is the partner-safe way to read back what you ingested. See Event feed & parity for the cursor contract, ordering modes, and reconciliation.

Request

GET
/v1/events/feed
curl "https://c360-api.lioncapventures.com/v1/events/feed?afterId=0&limit=50" \
  -H "X-API-Key: $C360_API_KEY"

Response (200)

{
  "success": true,
  "data": {
    "events": [
      {
        "id": 1234,
        "publicId": "evt_9f2c...",
        "source": "smilemall",
        "eventId": "mall-order-paid-ord_abc123",
        "type": "order.paid",
        "occurredAt": "2026-08-10T09:15:00.000Z",
        "customerId": "cus_a1b2c3",
        "zbIdSubject": "b1e5c8a0-...",
        "payload": { "orderId": "ord_abc123", "subtotal": "40.00" }
      }
    ],
    "nextAfterId": 1234,
    "hasMore": false,
    "count": 1
  }
}

Was this page helpful?