1) Build A Valid Event Payload
Required:- type
- at least one contact identifier: email or uid
- source
- action
- feature
- plan
- amount
- status
- upgrade
- idempotency_key
- external_id
- ts
- metadata
2) Send The Event
Single event endpoint:- POST /api/v1/client/events
- POST /api/v1/client/events/bulk
3) Expect Async Processing
- Client sends event payload.
- API accepts request.
- Event enters incoming inbox processing.
- On success, canonical event is created.
- On failure, inbox shows error and retry state.
- create may return accepted or success depending on sync mode and environment behavior
- canonical event may appear shortly after inbox entry
4) Verify In Incoming Events
Use:- GET /api/v1/public/authenticated/events/incoming
- status
- process_error
- retryable
- retry_count
- event_id
5) Verify In Canonical Events
Use:- GET /api/v1/public/authenticated/events
- event_type
- source
- status
- from
- to
- q
6) Idempotency Strategy
Use a deterministic key for retriable client operations. Recommended key pattern:<event_type>-<contact_identifier>-<logical_event_time_or_sequence>
- purchase-user_123-20260622T103000Z
7) Polling Strategy
Recommended UI pattern:- Load Events and Incoming Events in parallel.
- Poll Incoming Events every 5 to 15 seconds while page is visible.
- Stop polling when no rows are received or processing.
Common Integration Mistakes
- missing contact identity fields
- inconsistent event type naming across clients
- non-deterministic idempotency keys
- assuming canonical list updates instantly
- ignoring terminal failures in incoming events

