Skip to main content

Conventions

Pagination

List responses share one envelope:
limit defaults to 50 (max 100; search caps at 100). Pass ?limit=&page_token= to walk. Ordering is newest-first unless ascending=true.

Errors

Branch on code. Validation failures come back as validation_error with an errors payload. Common codes: unauthenticated (401), missing_permission (403), not_found (404), rate_limited (429 + Retry-After header).

Idempotency

  • Sends: Idempotency-Key header on POST …/emails/send — replays return the original email.
  • Creates (inbox, draft, webhook, domain, project): pass client_id — replays return the original object.

Rate limits

600 requests/minute per key. Exceeding it returns 429 rate_limited with a Retry-After header. Back off and retry.

Wire format

snake_case everywhere, ISO-8601 timestamps, 200 on creates (not 201), empty {} on deletes. The machine-readable route list lives at GET /v0/openapi.json (138 entries).