Skip to main content
Errors return a JSON body with a human-readable error string:

Size limits

Rate limits

Limits apply per project, and 429 responses include a Retry-After header (seconds): Management limits are counted per resource group, not per endpoint: all campaign operations (create, list, detail, edit, status, deliveries) share one budget, as do all goal operations and the two user reads; media uploads, the events list, and agent runs each have their own.

Retry behavior

The SDK surface is designed for fire-and-forget browser ingestion, and every SDK endpoint is safe to retry:
  • GET /messages creates deliveries idempotently — fetching again returns the same delivery, not a duplicate.
  • identify upserts and track appends; a duplicate event from a rare retry race is acceptable noise for behavioral data.
  • Delivery feedback sets state on one row; repeating it is harmless.
The official SDK swallows failures rather than throwing into your app — do the same in custom clients: in-app messaging should never break the host product. Management writes are not blindly retryable: retrying a successful POST /api/v1/campaigns creates a second campaign. On a network error, list campaigns first to check whether the create landed.