Skip to content

Errors

Every failure from the API is an RFC 9457 problem document, sent as application/problem+json, carrying a stable code from the catalogue below. The document's type points at the section for that code on this page, so an error can be read by following its own link.

Branch on code, not on the HTTP status and not on the message. Several codes share a status — the status tells a proxy what to do, the code tells you. Messages are written for a human reading a log and may be reworded; the codes are a contract.

A problem document also carries the request identifier from the response's request-id header. Quote it in any report: it is how a failure gets looked up without you having to reproduce it.

The catalogue

Code HTTP status
unauthorized 401
forbidden 403
not_approved 403
terms_not_accepted 403
model_not_found 404
not_found 404
idempotency_conflict 409
job_not_cancelable 409
result_not_ready 409
upload_incomplete 409
result_expired 410
payload_too_large 413
bulk_rna_coverage_too_low 422
calibration_failed 422
checksum_mismatch 422
gene_ambiguous 422
gene_unknown 422
input_spec_mismatch 422
model_does_not_accept 422
unsupported_modality 422
validation_failed 422
quota_exceeded 429
rate_limited 429
internal 500
lane_disabled 503
queue_full 503

What each one means

unauthorized

HTTP 401 · type ends in errors#unauthorized

No usable credential was presented. The key may be missing, malformed, revoked or expired.

forbidden

HTTP 403 · type ends in errors#forbidden

The credential is valid but its scopes do not include this operation.

not_approved

HTTP 403 · type ends in errors#not_approved

The account behind this key has not been approved for programmatic access.

terms_not_accepted

HTTP 403 · type ends in errors#terms_not_accepted

The current Terms have not been accepted by this account.

model_not_found

HTTP 404 · type ends in errors#model_not_found

No model with that identifier is served. Identifiers include the release, and a retired release stops resolving.

not_found

HTTP 404 · type ends in errors#not_found

No resource of that kind with that identifier belongs to this key. A resource owned by someone else answers the same way, so that an identifier cannot be probed.

idempotency_conflict

HTTP 409 · type ends in errors#idempotency_conflict

The idempotency key has already been used with a different payload. Use a new key, or re-send the identical request.

job_not_cancelable

HTTP 409 · type ends in errors#job_not_cancelable

The job has already reached a terminal state and cannot be canceled.

result_not_ready

HTTP 409 · type ends in errors#result_not_ready

The job has not reached a terminal state, so there is no result to download.

upload_incomplete

HTTP 409 · type ends in errors#upload_incomplete

The upload has not been completed, so it cannot be submitted yet. Finish the parts, then complete it.

result_expired

HTTP 410 · type ends in errors#result_expired

The retention window for this result has passed and the file has been deleted.

payload_too_large

HTTP 413 · type ends in errors#payload_too_large

The request or the part exceeds the documented cap. The cap is enforced before the bytes are written, not after.

bulk_rna_coverage_too_low

HTTP 422 · type ends in errors#bulk_rna_coverage_too_low

The bulk table covers too few of the model's input genes to be informative, so it is refused rather than silently padded.

calibration_failed

HTTP 422 · type ends in errors#calibration_failed

The submitted embeddings could not be reconciled with the encoder's calibration reference, so the model would be reading them in the wrong units.

checksum_mismatch

HTTP 422 · type ends in errors#checksum_mismatch

The bytes received for an upload part do not hash to the digest that was declared for them. Re-send the part.

gene_ambiguous

HTTP 422 · type ends in errors#gene_ambiguous

A gene name in the request resolves to more than one identifier. Send the identifier instead of the symbol.

gene_unknown

HTTP 422 · type ends in errors#gene_unknown

A gene name in the request is not in the gene table. Resolve it first; the table is versioned and includes previous symbols and aliases.

input_spec_mismatch

HTTP 422 · type ends in errors#input_spec_mismatch

The submission and the model's input_spec disagree on a field, which the problem document names. Re-prepare the input against the model's spec.

model_does_not_accept

HTTP 422 · type ends in errors#model_does_not_accept

The model's card does not declare the observation or covariate kinds this submission carries.

unsupported_modality

HTTP 422 · type ends in errors#unsupported_modality

The kind of input named in the request is not one this API accepts.

validation_failed

HTTP 422 · type ends in errors#validation_failed

The request did not satisfy the schema. The problem document names the field.

quota_exceeded

HTTP 429 · type ends in errors#quota_exceeded

A counter for this key has reached its limit for the window. The response says which counter and when it resets.

rate_limited

HTTP 429 · type ends in errors#rate_limited

Too many requests in too short a window. Wait for the interval the response gives.

internal

HTTP 500 · type ends in errors#internal

The failure is in the service, not in the request. The response carries a request identifier; quote it in a report rather than retrying blindly.

lane_disabled

HTTP 503 · type ends in errors#lane_disabled

The runtime this model needs is not currently accepting work.

queue_full

HTTP 503 · type ends in errors#queue_full

The queue is at its bound. Retry after the interval the response gives.

What is never in an error

An error body says what was wrong with the request. It does not name a configuration value, a file on a server, or anything about how the service is put together — not as a courtesy, but because that is the kind of detail an error body has historically leaked to whoever was probing for it.