Errors & limits

Errors return JSON with a human message and a stable code: { "error": "...", "code": "quota_exceeded" }. Handle codes, not messages.

Error codes

StatusCodeMeaning
401invalid keyThe API key is missing, malformed, or revoked.
402billing_requiredProduction sending needs an active plan.
403quota_exceededMonthly quota (or the pay-as-you-go safety ceiling) reached.
403account_pausedThe deliverability autopilot paused sending — check Metrics.
403attachments_require_paidProduction attachments are a paid-plan feature.
403contact_limit_reachedYour plan's contact allowance is full.
409domain_not_readyThe from-domain isn't verified yet.
409recipient_suppressedA recipient is on your suppression list.
409broadcast_not_draftBroadcasts can only be sent once.
422invalid_payloadValidation failed — the error message says which field.
422mixed_simulationSimulator and real recipients can't share one send.
429daily_limit_reachedWarm-up ramp or plan daily cap hit; limits grow automatically.
429rate_limitedToo many requests — respect Retry-After.

Limits

Recipients per message10 across to/cc/bcc
Batch size100 emails per call
Content sizehtml ≤ 1MB, text ≤ 500KB, attachments ~5MB decoded total
API rate120 requests/min per key on send (30/min on the Free tier); Retry-After on 429
Idempotency keys≤ 256 chars, replay returns the original result
OveragePaid plans keep sending past quota at $0.50/1k up to a 10x safety ceiling — no hard cutoff