Errors and rate limits
Slovio API errors and rate limits explained: the error JSON, validation errors with field paths, authentication errors, HTTP 429 limits and when to retry.
4 min readUpdated
When a Slovio API request fails, you get an HTTP 4xx or 5xx status and a JSON body with a message that says what went wrong. Requests are also rate limited per API key, per minute. Over the limit you get HTTP 429, and you should wait and retry.
What an error response looks like
Most errors use the same envelope as a successful response, with statusCode set to "10001":
{
"statusCode": "10001",
"status": 400,
"message": "Invalid API key. Please check your API key and try again"
}| Key | Meaning |
|---|---|
statusCode |
"10000" on success, "10001" on failure. It is a string. |
status |
The HTTP status, repeated in the body. |
message |
A readable reason. Show it in your logs. |
A 404 also includes url, the path you requested:
{
"statusCode": "10001",
"status": 404,
"message": "Call not found",
"url": "/v1/comms/calls/api-3f9c0b1e7d2a4c58b6e1f0a9d8c7b6a5e4d3c2b1"
}Validation errors
When a field is missing, has the wrong format, or is not allowed, you get HTTP 400 with a different shape: message plus an errors list. There is no statusCode or status key in this body.
{
"message": "to must be E.164 format (e.g. +12025550100)",
"errors": [
{
"message": "to must be E.164 format (e.g. +12025550100)",
"path": "body.to"
}
]
}pathis one string, joined with dots. It starts with the part of the request that failed:body,queryorparams. For examplebody.to,body.variables.first name, orquery.limit.messagein each item is the validator's text for that field. The top-levelmessagerepeats the first one.- If you send a field the endpoint does not accept, the path is
bodyand the message starts withUnrecognized key(s) in object.
Authentication errors
| HTTP | Message | Cause |
|---|---|---|
| 401 | Unauthorized |
The x-access-key or Authorization header is missing. |
| 400 | Secret token is missing |
Authorization has no token after Bearer. |
| 400 | Invalid API key. Please check your API key and try again |
The access key is wrong. |
| 400 | Secret token is Invalid. Please include a valid secret token in the request |
The secret key is wrong. |
| 403 | API key is not active. Please contact support to activate your API key |
The key has been switched off. |
| 403 | Your account is suspended. Please contact support. |
The account is suspended. |
| 403 | Feature not available in your plan. Please upgrade to access this feature. |
Your plan does not include the API, or the feature you called. |
Rate limits
Limits are counted per API key over a one-minute window. Every request counts, including ones that fail.
| Endpoint | Limit per minute |
|---|---|
POST /v1/comms/messages |
600 by default |
POST /v1/public/api/send-template/ |
600 by default (shared with the line above) |
POST /v1/public/api/rcs/send-template/ |
600 by default (shared with the line above) |
POST /v1/public/api/rcs/broadcast |
30 |
POST /v1/comms/calls (place a call) |
60 |
GET /v1/comms/calls/{callId} |
600 |
The 600 per minute for message sends is the platform default. It can be set higher for a single API key, for example for a high-volume OTP sender. Ask Slovio support if you need it. The call and broadcast limits are fixed.
Contacts, template lists and status lookups have no per-minute limit, but poll sensibly.
Rate limit headers
Limited endpoints return these headers on every response:
RateLimit-Policy: 600;w=60
RateLimit-Limit: 600
RateLimit-Remaining: 587
RateLimit-Reset: 42
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 587
X-RateLimit-Reset: 1790838660RateLimit-Reset is seconds until the window resets. X-RateLimit-Reset is the same moment as a Unix time.
The 429 response
Over the limit you get HTTP 429 with a Retry-After header in seconds. The body is plain text, not JSON:
Too many messages — please slow down and try again in a minuteThe call endpoints say Too many call requests — please slow down and try again in a minute, and the broadcast endpoint says Too many broadcast requests — please slow down and try again in a minute.
When to retry
- Retry 429 after the
Retry-Aftertime. - Retry 5xx with exponential backoff, for example after 1 s, 2 s, then 4 s.
- Don't retry other 4xx errors. Fix the request first.
- Send an
Idempotency-Keyheader on message sends and calls. A retry with the same key never sends or dials twice. See Send messages and Calls API.
Common questions
Why does my validation error have no statusCode?
Validation errors are returned before the request reaches the endpoint, so they use the shorter { "message", "errors" } shape. Check the HTTP status (400) rather than statusCode.
What does "body.to" mean in the path?
It is the field that failed: to inside the request body. Paths are dot-joined, so a bad variable name in a call request looks like body.variables.first name.
Can I get a higher limit than 600 messages per minute?
Yes. The limit for message and template sends can be raised for your API key. Contact Slovio support with your expected volume.
Is the call placing limit the same as how fast calls go out?
No. 60 per minute is how many call requests the API accepts. Your calling line also paces calls. If it is busy you get a 400 saying Your calling line is busy — try again in N second(s).
Do failed requests count toward the limit?
Yes. Every request in the window counts, so a loop of failing requests can use up your limit.
Stuck, or is something here out of date? Tell the team — we reply within a working day.