Skip to main content
Comms returns JSON errors and standard HTTP statuses. Unknown failures stay opaque so engine internals never leak to API clients.

Error shape

Some rate-limit responses include:

Status codes

StatusMeaningWhat to do
200OK — including idempotent duplicate sendsTreat as success
201Created (e.g. webhook)Persist returned id
202Accepted for deliveryPersist message.id
400Bad request / validationFix the payload
401Missing or invalid keyCheck Authorization header
403Valid key, missing scopeMint a key with the right scope
429Rate limitedBack off retry_after seconds (or 60s default)
5xxServer errorRetry with backoff + same idempotency key on sends

Rate limits

Defaults (configurable per environment):
BucketDefaultApplies to
Global Comms API~100 req / min / callerAll authenticated Comms routes
Send~60 req / min / callerPOST /messages only
Caller identity is derived from the API key (or staff session). Limits are per org + caller.

Handling 429

  1. Read retry_after when present.
  2. Sleep / re-queue for at least that many seconds.
  3. Retry sends with the same Idempotency-Key.

Scope errors

Create a new key (or rotate) with the required scopes from Messages API keys.
OperationRetry?Notes
POST /messagesYes, with same idempotency keySafe
GET *YesRead-only
POST /webhooksCarefulMay create duplicates if not checked
POST /contactsCarefulUpsert semantics — usually safe