| 400 | invalid_request | The request is wrong; the message names the field | No: fix it |
| 401 | unauthenticated | No key, a mistyped key, or a revoked or expired key | No |
| 401 | session_revoked | A panel session from before a password change | Sign in again |
| 403 | forbidden | The key doesn’t hold the permission, or the record isn’t yours | No |
| 403 | ip_not_allowed | The request came from an address the key doesn’t allow | Add the address to the key |
| 403 | ip_allowlist_required | An old key with no IP allowlist, past its grace | Add addresses to the key |
| 403 | console_destination | From the panel console: a real call to a number that isn’t yours | Use a dry run or a test number |
| 404 | not_found | No such record, or not one you can see (never “exists but forbidden”) | No |
| 409 | conflict | Clashes with an existing record, for example a name or number | No |
| 409 | idempotency_mismatch | This Idempotency-Key was used with a different body | Use a new key |
| 409 | idempotency_in_progress | The first request with this key is still running | Yes, shortly |
| 409 | no_callback_secret | A callback URL was given, but there’s no secret to sign with | Create the secret |
| 409 | wrong_status | For example, pausing a campaign that isn’t running | No |
| 409 | not_registered | The extension to ring has no phone signed in | When it does |
| 422 | refused | A call was checked and refused: no route, billing, or your own number | No |
| 422 | not_ready | A campaign can’t start yet; the message says why | After fixing it |
| 429 | rate_limited | Over the key’s rate; wait Retry-After seconds | Yes, after the wait |
| 502 | originate_failed, provider_error | The phone system or an AI provider refused | Maybe |
| 500 | internal | Our fault | Yes, with backoff |