Errors

Every error is JSON with a stable envelope:

json
{
  "error": {
    "code": "invalid_request",
    "message": "`to` must be a valid US/Canada number in E.164 format.",
    "param": "to"
  }
}

Codes

StatusCodeMeaning
400invalid_requestA parameter is missing or malformed — param names it.
401invalid_api_keyMissing, malformed, revoked, or unknown key.
403live_access_requiredNeeds live access (or a live key before approval).
403test_mode_onlySandbox-only endpoint called with a live key.
403tenant_suspendedAccount suspended.
403forbiddenKey is valid but can't act on this resource (e.g. a from you don't own).
404not_foundNo such resource on your account.
409idempotency_conflictIdempotency-Key reused with a different payload.
429rate_limitedToo many requests — check Retry-After.
429quota_exceededA daily quota was reached.
502carrier_errorUpstream provider failure — retry with backoff.
500internal_errorOur fault. Retry, and tell us if it persists.

Rate limits

Default 60 requests/minute per key. 429s include a Retry-After header. Successful quota-limited calls include X-Quota-Remaining.