Errors
Conerix uses conventional HTTP status codes. Every error returns the same JSON shape so your code only needs one error path.
Error shape
{
"success": false,
"error": {
"type": "invalid_request_error",
"code": "invalid_request",
"message": "The 'to' field is required.",
"param": "to"
},
"meta": { "request_id": "req_dXp9k...", "api_version": "v1" }
}
HTTP status codes
| Status | Type | When you see it |
|---|---|---|
200 | – | OK |
201 | – | Created — message accepted, sender registered, etc. |
400 | invalid_request_error | Missing/invalid parameter. Details in error.details. |
401 | authentication_error | Missing or invalid API key. |
402 | balance_error | Insufficient balance. |
403 | authorization_error | Key lacks required permission, or IP not on allowlist. |
404 | invalid_request_error | Resource not found. |
422 | invalid_request_error | Request couldn't be processed (semantic issue). |
429 | rate_limit_error | Rate limit exceeded. |
500 | api_error | Something went wrong on our side. Safe to retry idempotently. |
502 | provider_error | All providers in the fallback chain failed. |
503 | api_error | Temporary unavailability. Retry with backoff. |
Common error codes
| Code | Meaning |
|---|---|
invalid_request | One or more parameters failed validation. |
unauthorized | API key missing, invalid, disabled, or expired. |
forbidden | Key valid but lacks permission, or request IP not allowed. |
insufficient_balance | Account balance is below the cost of the message. |
rate_limit_exceeded | Per-key per-minute limit exhausted. |
not_found | The requested resource (or it doesn't belong to your account) was not found. |
provider_unavailable | All providers in the chain returned retryable failures. |
internal_error | Unexpected server error. Already logged on our side. |
What's never in an error response
- Raw exception messages or stack traces.
- SQL queries or table names.
- Provider credentials or secrets.
- Other accounts' resource IDs.
Have an obscure error? Include the response's
meta.request_id in
your support request. We can trace every byte of that request from edge to provider in seconds.