Error codes, failure reasons and limits

Open in ClaudeOpen in ChatGPT.md

Errors and rate limits

Every error has the same shape:

json
{ "error": { "code": "insufficient_credits", "message": "Not enough credits. Top up your balance and try again.", "details": { "available": 12, "required": 40 } } }

Rely on code (stable), not on message (may change).

HTTPcodeMeaningWhat to do
400validation_errorInvalid body/parameter; details lists fieldsFix the request. Unknown fields are rejected
400idempotency_key_requiredMissing Idempotency-Key on a sendAdd a unique UUID per logical send
401unauthorizedKey missing, wrong, expired or revokedCheck the key
402insufficient_creditsNot enough creditsBuy a package in the portal
403insufficient_scopeThe key lacks the scopeCreate a key with the right scope
403sender_not_verifiedThe sender name is not approved for your accountUse a name from GET /senders or request one in the portal
403forbidden / org_suspendedNo access / account suspendedContact support
404not_foundResource does not exist (or belongs to another account)—
409idempotency_conflictSame key with a different request, or the original is still processingUse a new key for a new request
422invalid_destinationNo valid destination; see details.rejectedCheck the numbers
429rate_limited / otp_rate_limited / daily_limit_exceededLimit exceededWait retry_after seconds
500/503internal_error / service_unavailableTemporary problemRetry with the same Idempotency-Key

Delivery failure reasons (reason)

undeliverable, network_failure, expired, kosher_phone (a "kosher" number that blocks SMS), send_window (sending not allowed at this hour), blocked (recipient blocked messages — auto-added to your blacklist), invalid_content, no_coverage, rejected, cancelled, temporary_unavailable, internal_error.

Rejection reasons in a send response (rejected[].reason): invalid_phone, international_not_allowed, blacklisted, recently_messaged, duplicate, body_too_long, empty_body.

Rate limits

KindLimit per key
Send (POST)60 requests / minute
Read (GET)600 requests / minute
OTP to the same phone3 per 10 minutes, 10 per hour

Every response includes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset; a 429 also has Retry-After. For high volume use /messages/batch (up to 2,500 messages per request) instead of one request per message.

New accounts are limited to 500 messages per day until business details are verified.

☰