Errors
Every error is an RFC 9457 problem document, sent as
application/problem+json:
{
"type": "https://docs.dialerbee.com/errors/insufficient-scope",
"title": "Not permitted",
"status": 403,
"detail": "The API client does not hold the scope this operation requires.",
"instance": "urn:dialerbee:request:req_01K6BZ3M9X4T7Q2V8N5R6P1W0C",
"code": "insufficient_scope",
"request_id": "req_01K6BZ3M9X4T7Q2V8N5R6P1W0C"
}
| Field | Meaning |
|---|---|
type |
A link to the page that explains the code. |
title |
A short, stable summary. |
status |
The HTTP status. |
detail |
A human-readable explanation. Never parse it. |
instance |
The request, as a URN. |
code |
The stable, machine-readable code. Branch on status and code. |
request_id |
The same value as the X-Request-ID header. Quote it to support. |
errors |
Present on validation_failed: one entry per problem, as a JSON pointer and a code. |
Rules
- Branch on the HTTP status and
code, never ondetailortitletext. - New codes can be added inside
v1. Treat an unknown code by its HTTP status. - Every 429 and 503 carries
Retry-Afterin seconds. Wait at least that long. - A 409
outcome_unknownmeans the platform could not confirm whether a write happened: never retry it with a newIdempotency-Key. See Idempotency. - Unknown paths answer 404
route_not_available; a known path with another method answers 405method_not_allowedwith anAllowheader. - Every response, error or not, carries an
X-Request-ID. It isreq_and a ULID when the API answered, for examplereq_01K6BZ3M9X4T7Q2V8N5R6P1W0C, oredge_and 32 hexadecimal characters when the edge answered before the request reached the API (an unknown route, a body that is too large, the per-address rate limit, or the API unavailable), for exampleedge_7c1e9a3f5b2d4c6e8a0f1b3d5e7c9a2b.
Every code
Authentication
| Status | Code | Title | Retry |
|---|---|---|---|
| 401 | invalid_api_key | Invalid API key | No |
| 401 | api_key_expired | API key expired (reserved: Not sent in v1) | No |
| 401 | api_key_revoked | API key revoked (reserved: Not sent in v1) | No |
Access
| Status | Code | Title | Retry |
|---|---|---|---|
| 403 | api_access_disabled | API access disabled | No |
| 403 | ip_not_allowed | IP address not allowed | No |
| 403 | insufficient_scope | Not permitted | No |
| 403 | tier_not_enabled | Capability not enabled | No |
| 403 | webhooks_disabled | Webhooks not enabled | No |
| 403 | sending_suspended | Sending is stopped | No |
| 403 | outbound_not_approved | Outbound not approved yet | No |
Request
| Status | Code | Title | Retry |
|---|---|---|---|
| 404 | route_not_available | Not found | No |
| 405 | method_not_allowed | Method not allowed | No |
| 400 | credential_in_url | Credential in URL | No |
| 400 | credential_in_body | Credential in body | No |
Validation
| Status | Code | Title | Retry |
|---|---|---|---|
| 400, 422 | validation_failed | Invalid request | No |
| 400 | invalid_cursor | Invalid cursor | No |
| 400 | invalid_date_range | Invalid date range | No |
| 400 | batch_too_large | Batch too large | No |
| 413 | payload_too_large | Payload too large | No |
| 415 | unsupported_media_type | Unsupported media type | No |
| 422 | webhook_url_refused | Webhook URL refused | No |
Idempotency
| Status | Code | Title | Retry |
|---|---|---|---|
| 400 | idempotency_key_required | Idempotency-Key required | No |
| 409 | conflict | Request in progress | Yes |
| 409 | idempotency_conflict | Idempotency key reused | No |
| 409 | duplicate_client_reference | Duplicate client reference | No |
| 409 | outcome_unknown | Outcome unknown | No |
Resource
| Status | Code | Title | Retry |
|---|---|---|---|
| 404 | not_found | Not found | No |
| 410 | recording_deleted | Recording deleted | No |
| 403 | recording_on_legal_hold | Recording on legal hold | No |
State
| Status | Code | Title | Retry |
|---|---|---|---|
| 409 | campaign_not_importable | Campaign not importable | No |
| 409 | campaign_not_running | Campaign not running | No |
| 409 | campaign_not_paused | Campaign not paused | No |
| 409 | callback_not_pending | Callback not pending | No |
| 409 | appointment_not_modifiable | Appointment cannot be changed | No |
| 409 | webhook_limit_reached | Webhook endpoint limit reached | No |
| 409 | replay_unavailable | Replay unavailable | Yes |
| 409 | agent_unavailable | Agent not available | Yes |
| 402 | insufficient_balance | Balance too low | No |
Compliance
| Status | Code | Title | Retry |
|---|---|---|---|
| 409 | registry_stale_blocked | Launch blocked by do-not-call list status | No |
| 422 | dial_refused | Call refused by a compliance check | No |
| 422 | message_refused | Message refused by a compliance check | No |
| 422 | on_dnc | Destination is on DNC | No |
| 422 | blocked_country | Destination country blocked | No |
| 503 | dnc_screen_unavailable | Do-Not-Call screen unavailable | Yes |
Capacity
| Status | Code | Title | Retry |
|---|---|---|---|
| 429 | replay_limit_reached | Replay limit reached | No |
| 429 | rate_limit_exceeded | Too many requests | Yes |
| 429 | daily_cap_reached | Daily limit reached | Yes |
| 429 | spend_cap_reached | Daily estimated-spend limit reached | Yes |
| 503 | temporarily_unavailable | Temporarily unavailable | Yes |
| 503 | upstream_unavailable | Temporarily unavailable | Yes |
Concurrency
| Status | Code | Title | Retry |
|---|---|---|---|
| 412 | precondition_failed | Precondition failed | No |
| 428 | precondition_required | Precondition required | No |
Server
| Status | Code | Title | Retry |
|---|---|---|---|
| 502 | upstream_invalid_response | Upstream error | No |
| 500 | internal_error | Internal error | No |