Errors, Limits, and Retry
Error response format
All error responses use the RFC 7807 ProblemDetails structure:
{
"type": "https://tools.ietf.org/html/rfc7807",
"title": "Validation error",
"status": 422,
"detail": "The 'to' field must be a valid E.164 phone number.",
"traceId": "00-abc123-def456-00"
}
The traceId field correlates to distributed tracing. Include it in support requests.
Status code reference
| Code | Title | Recommended action |
|---|---|---|
400 |
Bad Request | Fix request syntax |
401 |
Unauthorized | Refresh token or verify API key |
403 |
Forbidden | Check API key rights or account policy |
404 |
Not Found | Verify ID and account ownership |
409 |
Conflict | Check existing state before retrying |
422 |
Validation Error | Inspect detail for constraint violation |
429 |
Too Many Requests | See rate limits below |
500 |
Internal Server Error | Retry with backoff; file support ticket if persistent |
Rate limits
When a rate limit is exceeded the response includes a Retry-After header (when present):
{
"type": "https://arelhub.com/errors/rate-limit",
"title": "Too Many Requests",
"status": 429,
"detail": "Request rate limit exceeded. Retry after 30 seconds.",
"retryAfter": 30
}
Quota limits
Quota depletion returns a distinct 429. Check remaining quota before bulk sends:
GET /v1/user/quota/subaccounts/{subaccountId}
Authorization: Bearer eyJ...
Retry posture
| Error | Retry? | Strategy |
|---|---|---|
400, 422 |
No | Fix request and resubmit |
401 |
Conditional | Refresh token, then retry once |
403 |
No | Contact support if unexpected |
404 |
No | Verify resource ID |
429 |
Yes | Respect Retry-After; exponential backoff |
500 |
Yes | Exponential backoff with jitter; cap at 3-5 attempts |
| Network timeout | Yes | Treat timed-out requests as idempotent; check status first |
Exponential backoff formula
delay = min(base x 2^attempt, maxDelay) + random(0, jitter)
// Recommended: base=1s, maxDelay=30s, jitter=500ms
Idempotent requests
Message submission is not idempotent by default. If a POST /v1/accounts/{accountId}/messages
request times out, check status before retrying. Use the externalId field on submission to correlate
your internal request ID with ArelHub's message ID.
Support
For persistent errors or incidents, include in your support request: traceId, request timestamp
(UTC), endpoint and HTTP method, and anonymized request body.