Error shape
Status codes
| Status | Meaning | What to do |
|---|---|---|
| 200 | OK — including idempotent duplicate sends | Treat as success |
| 201 | Created (e.g. webhook) | Persist returned id |
| 202 | Accepted for delivery | Persist message.id |
| 400 | Bad request / validation | Fix the payload |
| 401 | Missing or invalid key | Check Authorization header |
| 403 | Valid key, missing scope | Mint a key with the right scope |
| 429 | Rate limited | Back off retry_after seconds (or 60s default) |
| 5xx | Server error | Retry with backoff + same idempotency key on sends |
Rate limits
Defaults (configurable per environment):| Bucket | Default | Applies to |
|---|---|---|
| Global Comms API | ~100 req / min / caller | All authenticated Comms routes |
| Send | ~60 req / min / caller | POST /messages only |
Handling 429
- Read
retry_afterwhen present. - Sleep / re-queue for at least that many seconds.
- Retry sends with the same
Idempotency-Key.
Scope errors
Retry policy (recommended)
| Operation | Retry? | Notes |
|---|---|---|
POST /messages | Yes, with same idempotency key | Safe |
GET * | Yes | Read-only |
POST /webhooks | Careful | May create duplicates if not checked |
POST /contacts | Careful | Upsert semantics — usually safe |

