Developers
Errors
One error envelope for everything. Code first (so machines can branch), message second (so humans get a clue), details third (so debugging doesn't require a tail of the server log).
Envelope
{
"error": {
"code": "invalid_request",
"message": "channels[0].id must be a uuid",
"details": { "field": "channels[0].id" }
}
}Status codes
Retry semantics
- 4xx errors will not change on retry unless you change the request — fix and re-send.
- 5xx errors are usually transient. Re-send the request with the same
Idempotency-Key. - For 429, honor
Retry-After; for 5xx, exponential backoff (1s → 2s → 4s, capped at 30s) is a sane default.