HTTP status codes
| Status | Meaning | Retryable |
|---|
400 Bad Request | Invalid request parameters (e.g. missing name) | No |
401 Unauthorized | API key is missing, invalid, or revoked | No |
403 Forbidden | API key lacks permission for this operation | No |
404 Not Found | The requested search ID does not exist | No |
429 Too Many Requests | Rate limit exceeded | Yes — after Retry-After seconds |
500 Internal Server Error | Unexpected server error | Yes — with backoff |
All error responses follow this shape:
{ "error": "Human-readable error message" }
Error codes in search responses
When a data source encounters an error mid-search, the errors object in the response body contains structured error details:
{
"errors": {
"registry": {
"code": "TIMEOUT",
"message": "Business registry request timed out after 40 seconds",
"retryable": true
}
}
}
| Code | Description |
|---|
TIMEOUT | The data source did not respond in time |
RATE_LIMITED | The upstream service rate-limited the request |
NOT_FOUND | No records found for this query |
INVALID_INPUT | The query could not be processed by this source |
UPSTREAM_ERROR | The upstream service returned an error |
PARSE_ERROR | The upstream response could not be parsed |
AUTH_ERROR | Authentication with the upstream service failed |
UNAVAILABLE | The upstream service is temporarily down |
UNKNOWN | An unexpected error occurred |
When retryable is true, re-running the search may succeed.
Partial failures
A search with some errors still returns all data from the sources that succeeded. The top-level status will be completed-with-errors rather than completed.
{
"meta": {
"status": "completed-with-errors",
...
},
"businesses": [ ... ], // succeeded
"regulatory": { ... }, // succeeded
"errors": {
"sanctions": {
"code": "UNAVAILABLE",
"message": "Sanctions service temporarily unavailable",
"retryable": true
}
}
}
Always check both meta.status and the errors object. A completed-with-errors response still contains valid data — only the listed sources failed.