Errors
Every error, and what to do about it.
Failures are application/problem+json per RFC 9457,
one shape across the whole platform. The type field
of any error response links straight to its entry below.
| Situation | Status | Type |
|---|---|---|
| Key missing or malformed | 401 | invalid-api-key |
| Key revoked | 401 | revoked-api-key |
| Key not allowed on this endpoint | 403 | endpoint-not-allowed |
| Malformed payload | 400 | invalid-request |
| Per-minute rate exceeded | 429 | rate-limit-exceeded |
| Monthly quota exhausted | 402 | quota-exceeded |
| Batch too large | 413 | batch-too-large |
| Job unknown, expired, or owned by another account | 404 | job-not-found |
| The request could not be served as sent | 400 | request-failed |
| A dependency of ours is unreachable | 503 | service-unavailable |
| A bug on our side | 500 | internal-error |
401
Key missing or malformed.
invalid-api-key
Send the key as `Authorization: Bearer wk_live_...`. A key that was copied without its prefix, or with a trailing newline, arrives as this error rather than as a key we can recognise.
401
Key revoked.
revoked-api-key
The key was revoked from the dashboard and will never work again. Issue a new one and deploy it. Revocation takes effect on the next request, so a running deployment stops immediately.
403
Key not allowed on this endpoint.
endpoint-not-allowed
Keys carry the set of endpoints they may call. Widen it from the dashboard, or use the key that was issued for this endpoint. Retrying does not help.
400
Malformed payload.
invalid-request
The payload could not be read. The `detail` field says which field and why. Send JSON, with the field the endpoint documents.
429
Per-minute rate exceeded.
rate-limit-exceeded
Too many calls in one minute. `Retry-After` says how long to wait, and `limit` is the ceiling on your plan. Wait, then retry: this one is safe to back off on.
402
Monthly quota exhausted.
quota-exceeded
The monthly allowance for this endpoint is spent, and `resets_at` says when it returns. Retrying will not help before then, which is why this is 402 and not 429. Change plan or wait.
413
Batch too large.
batch-too-large
A single batch is capped. `submitted` and `limit` are in the payload. Split the list and submit it as several jobs.
404
Job unknown, expired, or owned by another account.
job-not-found
No job with that id belongs to this account. The same answer covers a job that never existed, one that passed its 48 hour retention, and one belonging to somebody else, because telling those apart would confirm which job ids are real.
400
The request could not be served as sent.
request-failed
The request reached us but could not be served as sent: a method or a route that does not exist. Check the URL and the verb against the reference.
500
A bug on our side.
internal-error
Our bug. The detail is deliberately empty because the message would leak internals; the specifics are in our logs. Retrying is reasonable once. If it persists, the response and the time it happened are enough for us to find it.