Skip to content

Errors

Every error response carries a JSON body in the same shape:

{
"error": {
"code": "<machine-readable>",
"message": "<human-readable>",
"request_id": "<uuid>",
"correlation_id": "<uuid>"
}
}

Branch on error.code, not on the message text. Include request_id when contacting support. Both ids are also returned as the X-Request-ID and X-Correlation-ID headers.

HTTP status code summary
400Bad RequestMalformed query parameters or path values
401UnauthorizedNo Authorization header
401UnauthorizedKey invalid, expired, or revoked
403ForbiddenKey valid but lacks the required dataset scope
404Not FoundResource not found
406Not AcceptablePinned schema version not supported
410GonePinned schema version has been withdrawn
422Validation errorUnknown sources key, or a parameter that failed validation
429Too Many RequestsRate limit exceeded; Retry-After set
500Internal Server ErrorServer-side error; request_id required for support
503Service UnavailableTemporarily unavailable; retry with backoff
Error types
bad_requestMalformed query parameters or path values
auth_missingNo Authorization header
auth_invalidKey invalid, expired, or revoked
scope_missingKey valid but lacks the required dataset scope
not_foundResource not found
schema_unsupportedPinned schema version not supported
schema_withdrawnPinned schema version has been withdrawn
validation_errorParameter failed a type or enum check
invalid_sourceUnknown or empty sources key
rate_limitedRate limit exceeded; Retry-After set
internalServer-side error; request_id required for support
unavailableTemporarily unavailable; retry with backoff

A streaming response sends its 200 OK before the body, so a failure partway through cannot change the HTTP status. The error envelope arrives in-band as the final record, with error.code set to upstream_unavailable:

{"id":"eu-fsf-1003", ...}
{"id":"un-sc-6907993", ...}
{"error":{"code":"upstream_unavailable","message":"sanctions stream interrupted","request_id":"…","correlation_id":"…"}}

In the default json format the envelope is the last element of the array, and the array still closes normally. In jsonl it is the last line.

Always inspect the last record of a stream. If it is an error envelope, the records before it are valid but the dataset is incomplete. Retry the pull.

See Streaming and snapshots for recovery options after an interrupted stream.