401Unauthorized
Missing or invalid API key.
Send a valid live key in X-API-Key or Authorization: Bearer ....
402Payment Required
The account is in a hard-blocked billing state (e.g. canceled grace expired, payment failed past dunning window).
Visit the action_url returned in the error payload to update billing, or contact support. The error body includes code and message describing the exact alert.
403Forbidden
API key does not have the calls:write scope.
Use an API key that has calls:write.
403Number suppressed
to_number is on your account's do-not-call list (code: number_suppressed). The response says which source suppressed it: an entry you added, the person's own request, or a STOP they texted one of your numbers. No call was created.
Do not retry: nothing about this number changes the answer. Drop it from the list you dial from. If the entry was added in error and is yours to lift, release it with POST /suppressions/{id}/release — entries recording the person's own request cannot be released.
404Not Found
No agent exists with that ID.
Check the agent ID with GET /agents.
422Missing from_number
No from_number was provided in the request body.
Send a from_number that is registered to your account with outbound enabled.
422Unprocessable Entity (from_number not registered)
The resolved from_number is not registered to this account. Error body: invalid_recipients: [{..., reason: "not_registered"}].
Register the number via POST /api/v1/phone-numbers/{provider}/register first, then retry.
422Unprocessable Entity (outbound disabled)
The resolved from_number is registered but has outbound calling disabled. Error body: invalid_recipients: [{..., reason: "outbound_disabled"}].
Enable outbound on the number via PATCH /api/v1/phone-numbers/{id}.
422Unprocessable Entity (validation)
agent_id empty, to_number missing or not E.164, from_number not E.164, or invalid dynamic_variables.
Send a non-empty agent_id, a to_number matching ^\+[1-9]\d{1,14}$, a valid E.164 from_number, and dynamic_variables as a flat object of scalars.
429Too Many Requests
Your account or the shared capacity pool is at its limit. The response includes a Retry-After header.
Honor the Retry-After header and retry. If you hit this consistently, your plan needs more concurrent-call capacity.
503Service temporarily unavailable
We're at capacity right now.
Retry the request after a short back-off. If it persists, contact our team at [email protected].
503Suppression list unreadable
The do-not-call list could not be read (code: suppression_check_unavailable), so the call was refused rather than placed. Transient, and deliberately not a 403: silence from the list is never permission.
Retry after Retry-After seconds. The same request is safe to send again; no call was created.