Skip to content

Errors: what each code means

Every failure from the API carries a stable code. This page says what each one means and what to change.

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 the client what happened.

Each failure is an RFC 9457 problem document, sent as application/problem+json, and its type points at its code's section on this page. Messages are written for a person reading a log and may be reworded. The codes are a contract.

The catalogue

Code HTTP status
unauthorized 401
access_pending 403
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.

access_pending

HTTP 403 · type ends in errors#access_pending

The account has asked for programmatic access, and the request is still open. Wait for the email: nothing else is needed.

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 does not hold a grant of programmatic access, or no longer does. Access is requested in Aurora Intelligence, as Get access describes.

terms_not_accepted

HTTP 403 · type ends in errors#terms_not_accepted

The mint named a version of the Terms that is not the current one, or the key was minted under earlier Terms. The response names where to read the current Terms and what changed in them, and a key refused this way can still read the current version from GET /api-keys/terms. Mint a new key once you accept them.

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 account. 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 succeeded, 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 exceeds a documented cap, which the problem document names. Limits states every cap.

bulk_rna_coverage_too_low

HTTP 422 · type ends in errors#bulk_rna_coverage_too_low

The bulk RNA profile covers too few of the model's genes to be used, so it is refused. The missing genes are not filled in for you. The problem document states how many it needs.

calibration_failed

HTTP 422 · type ends in errors#calibration_failed

The submitted embeddings were not produced the way this model reads them. Re-run the embedding with the package against the model's card. auroraomics doctor --model checks a machine first.

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.

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. The problem document's hint names what this model does accept. Another model in the catalogue may take the input as it is.

unsupported_modality

HTTP 422 · type ends in errors#unsupported_modality

No model this service runs takes that kind of input at all, so choosing a different model will not help. Check GET /v1/models: the catalogue's accepts is the whole of what can be submitted. This is not model_does_not_accept, which is one model declining a kind another model takes.

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 names the counter, how much of it is used, and its window. The counter starts again on the next calendar day or month in UTC.

rate_limited

HTTP 429 · type ends in errors#rate_limited

Too many requests in too short a window. Wait for the seconds in Retry-After, then retry.

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.

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 model's runtime is already holding as much waiting work as the service will queue, so the submission was refused rather than queued. Nothing was charged and no job was created. Wait for the seconds in Retry-After and send the same request again, with the same Idempotency-Key if you used one. quota_exceeded is the code about the key's own allowance.

What every error carries

Field What it holds
type the address of the code's section on this page
title the code, in words
status the HTTP status, which the code is always sent with
code the stable code from the catalogue: branch on this
detail what was wrong with this request, when there is more to say
param the field at fault, when there is one
hint what to do next
request_id the request identifier, also sent as the X-Request-Id header: quote it in a report

Quote the request identifier in any report: it is how a failure is looked up without being reproduced. A 429 or a 503 also carries Retry-After.