Errors and limits
Errors are JSON with a stable code you can program against; message is for humans and may
change.
{ "statusCode": 403, "code": "access.denied", "message": "This key is not allowed to do this" }
| Status | Code | Meaning |
|---|---|---|
| 400 | resource.unknown_filter, resource.bad_filter_op, resource.bad_filter_value, resource.bad_sort, resource.bad_limit, resource.bad_parameter, resource.bad_id |
Fix the request |
| 401 | credential.invalid |
Missing, unknown, revoked or expired key or token |
| 402 | billing.inactive |
No active subscription |
| 403 | access.denied |
Outside the grants |
| 403 | credential.ip_not_allowed |
Key used outside its IP allowlist |
| 403 | exact.division_disabled |
Administration not enabled in the dashboard |
| 403 | exact.forbidden |
Exact Online refused (the connected Exact user lacks rights) |
| 404 | resource.unknown, exact.not_found |
No such resource or record |
| 404 | exact.not_connected |
An administrator must connect Exact Online |
| 409 | exact.needs_reauth |
An administrator must reconnect Exact Online |
| 422 | exact.rejected |
Exact Online rejected the request's content |
| 429 | rate_limited, exact.rate_limited |
Slow down; honour Retry-After |
| 502 | exact.unavailable |
Exact Online is unavailable; retry later |
| 503 | exact.paused |
The gateway paused calls to a failing Exact endpoint; retry after Retry-After |
Rate limits
- 60 requests per minute per API key or connected app on the data API and MCP, plus a per-address limit on everything else.
- Exact Online's own limits apply per administration (60 per minute, 5,000 per day). The gateway
stops calling an endpoint that keeps failing (
exact.paused) instead of burning your error budget. - Enable the organization's cache to answer repeated reads without calling Exact.
Every 429 and retryable 503 carries Retry-After (seconds). Retry with backoff; never retry
4xx other than 429.