Error response format
Every response also carries an
X-Request-Id HTTP header that matches meta.request_id verbatim. Always include request_id when contacting support.
Retryable + Retry-After
Theretryable field tells you whether retrying the same request is likely to succeed. Defaults follow this policy:
When
retryable is true for a 429 or 503, the response also carries a Retry-After HTTP header with the recommended wait in seconds. Honour that value rather than retrying immediately.
Service status
Check current service availability before retrying persistent
503 responses.idempotency_conflict is false: the client should either wait for the in-flight request to finish or use a fresh key for a different request.
Validation errors with multiple issues
When a request body fails schema validation on multiple fields, the error envelope carries anerrors array so you can surface every issue in a single round-trip.
param at the top of the error matches the first issue’s field for backwards compatibility. The full list lives in errors[]. Status is 400 for syntactic problems (invalid_parameter) and 422 for semantic violations (validation_error).
Error codes
authentication_required
HTTP 401: The request has noAuthorization header or the API key is invalid, expired, or revoked.
insufficient_permissions
HTTP 403: The API key is valid but lacks the required permission for this endpoint. Check the permission table to see which permission each endpoint requires.invalid_parameter
HTTP 400: A query parameter has an invalid format or value. Theparam field identifies which parameter is at fault.
missing_parameter
HTTP 400: A required query parameter is missing from the request.not_found
HTTP 404: The requested resource does not exist, or it belongs to a different team than the one associated with your API key.conflict
HTTP 409: The request cannot be applied because of the resource’s current state. Examples include deleting a domain while mailboxes still use it, creating a mailbox whose email address already exists, or sending a write with a staleIf-Match header. Re-fetch the resource and reconcile before retrying.
limit_exceeded
HTTP 409: Your team has hit the create limit for this resource. The limit can apply to domains, mailboxes, sending accounts, webhooks, or active API keys. A Free team must delete an existing item or upgrade to Pro before retrying. See Team limits.idempotency_conflict
HTTP 409: Returned when anIdempotency-Key request header is reused while the original request is still running, or with a request body whose fingerprint differs from the original. Wait and retry for an in-flight request. Use a fresh key for a different request. See the Idempotency guide.
validation_error
HTTP 422: A request body parsed cleanly as JSON but fails a semantic rule. Common cases include choosing an unsupported mailbox storage tier, shrinking mailbox storage below its current usage, referencing a provider or delivery group from a different team, or submitting more than 1,000 filter rules in a single request. Theparam field identifies the first offending field. The errors array lists every issue.
rate_limit_exceeded
HTTP 429: You have exceeded the rate limit of 600 requests per minute. The response carries aRetry-After HTTP header with the recommended wait in seconds. Back off until then before retrying. retryable is true.
payload_too_large
HTTP 413: The request body exceeds the server-side size limit. Trim the body or split it into smaller requests.service_unavailable
HTTP 503: A required service is temporarily unavailable. The response may carry aRetry-After header. Requests are safe to retry with exponential backoff because retryable is true. If this persists for more than a few minutes, contact support with the request_id from the response.
internal_error
HTTP 500: An unexpected server error occurred.retryable is true because the failure is server-side. If it persists, contact support with the request_id from the response.