Standard error object
JSON
{
"error": {
"code": "rate_limited",
"message": "Too many requests",
"request_id": "req_01J4N7"
}
}Classify before retrying
| Status | Meaning | Action |
|---|---|---|
| 400 | Request validation failed | Fix the request; do not retry unchanged |
| 401 | Authentication required or invalid | Repair or rotate the credential |
| 404 | Dataset, release, or build not found | Verify the stable identifiers |
| 429 | Rate limit exceeded | Wait for Retry-After, then retry with jitter |
| 500 | Temporary service failure | Retry safe reads with exponential backoff |
Treat methods differently
GET operations are safe to retry after transient network, 429, or 5xx failures. POST /datasets/{dataset_id}/query is a read-like operation and can be retried with the same body. POST /builds creates work and has no public v1 idempotency key, so reconcile an ambiguous result before resubmitting.
Keep incident context
- 1Log request_id when present
- 2Log the route template rather than secrets or full URLs
- 3Keep dataset, release, and build IDs
- 4Record attempt count and elapsed time
- 5Separate permanent validation failures from transient availability failures