Errors and rate limits
Errors
Every error returns a JSON body with the same fields:
{
"message": "Rate limit exceeded for this API key",
"error": "...",
"timestamp": "2026-10-23T10:15:00.000Z",
"statusCode": 429
}error is a short name for the error type. Use statusCode to decide what to do, and message to log what happened.
| Status | When | message |
|---|---|---|
400 | A query parameter is invalid, for example an unknown period, a currency that is not a 3-letter code, or fromYear later than toYear | The message names the parameter |
401 | The x-api-key header is missing or does not match a key | Invalid or missing API key |
401 | The key has been disabled | API key is disabled |
401 | The key has passed its expiry date | API key has expired |
404 | No company matches the country and ticker | Company not found |
429 | The key has sent more requests than its limit in the current minute | Rate limit exceeded for this API key |
A 401 means the key needs attention. Check the key with the Vitati360 team. Retrying the same request will not succeed.
Rate limits
Each API key has a limit on the number of requests it can send per minute. The default is 60. The team sets a different limit when the key is issued.
- The limit counts requests per key, per minute.
- A request over the limit returns
429. Wait until the next minute, then retry. - A request with a missing, disabled, or expired key returns
401and does not count toward the limit. - A request for an unknown company returns
404and does count toward the limit.
If you need a higher limit, ask the Vitati360 team.
Caching
Responses are marked cacheable for 5 minutes, with stale responses allowed for up to a day while they refresh:
Cache-Control: public, max-age=300, stale-while-revalidate=86400Browsers and shared caches can reuse a response for 5 minutes. Use this when you build your own cache on top of the API.
Compression
Responses are stored compressed. Send Accept-Encoding: gzip and the response arrives compressed. Requests without that header receive plain JSON. Both return the same data.
curl --compressed -H "x-api-key: YOUR_API_KEY" \
"https://api.vitati360.com/proxy/external/v1/company/qa/qnbk/financials"