API v1Private beta. The API is stable; send limits are low while the shared domain warms up.

Reference

Errors & limits

Error format and codes, idempotency, pagination and limits.

Error format

Every error has the same shape and a stable code to branch on:

{
  "error": {
    "code": "recipient_not_allowed",
    "message": "This inbox can only reply to people who emailed it first (free plan). Not allowed: stranger@example.com",
    "param": "to",
    "request_id": "8c1f…"
  }
}

Include request_id when you contact support. It's also in the x-request-id response header.

Codes

StatusCodeMeaning
400invalid_requestA field is missing or invalid; param names it
401unauthorizedMissing, malformed, unknown or revoked API key
402plan_limit_reachedInbox limit for your plan
403forbiddenThe key lacks the scope, or the action isn't allowed for this key
403recipient_not_allowedReply-only inbox or free plan: the recipient never wrote first
403sending_pausedSending paused (complaint or bounce rate); receiving still works
404not_foundDoesn't exist, or isn't visible to this key
404route_not_foundWrong method or path
409address_takenThat address is in use (or was used before; addresses are never reused)
409idempotency_in_progressA request with this Idempotency-Key is still running. Retry shortly.
410message_expiredThe message is past its inbox's retention period: its raw download and forwarding are gone
422recipient_suppressedThe address bounced or complained before
422idempotency_key_reusedThe same Idempotency-Key was used with a different request
429daily_limit_reachedDaily send limit (UTC) reached
429rate_limitedToo many requests; wait Retry-After seconds. See rate limits
502send_failedThe mail server rejected the message; the message is marked failed
503send_temporarily_failedA temporary sending problem. Safe to retry.
500internal_errorOur fault. It's logged; retry with the same Idempotency-Key.

Idempotency

Send Idempotency-Key: <unique string> on every POST. A retry with the same key and the same body returns the stored response, with Idempotent-Replayed: true, instead of doing the work again. Keys last 24 hours and are scoped to your account. The SDK adds one automatically and reuses it across its own retries.

Pagination

List endpoints return newest first:

{ "object": "list", "data": [ … ], "next_cursor": "MjAyNi0xMC0wNlQx…" }

Pass cursor=<next_cursor> for the next page; next_cursor is null on the last one. limit is 1–100 (default 20). Cursors stay stable while new items arrive.

Limits

Limit
Inboxes (free plan)5
Sends per day, new accounts50 (UTC day; rises with a clean record)
Recipients per message50
Inbound message size25 MiB
Message content kept1 to 30 days per inbox (retention_days, default 7); rows go after 35 days
wait timeout120 s per request (the SDK chains requests for longer waits)
Webhooks per account20
Webhook response timeout10 s
Download links15 minutes
Requests per API key600 a minute, 60 of them sends (rate limits)

On this page