Error registry

Every error code the API can return, with retry semantics. This registry is closed and append-only — codes are never removed or repurposed within v1. Machine-readable at GET https://api.primateintelligence.ai/v1/errors.

retryable = safe to retry the same request unchanged (with backoff). idem = idempotent to retry with the same Idempotency-Key.

HTTP errors

invalid_api_key

HTTP 401 · retryable: no · idem: no

API key is invalid. Check the key, env var, and whitespace.

key_revoked

HTTP 401 · retryable: no · idem: no

This API key has been revoked. Rotate or create a new key.

key_expired

HTTP 401 · retryable: no · idem: no

This API key has expired. Create a new key.

token_expired

HTTP 401 · retryable: no · idem: no

Client token has expired. Mint a new token from your server (client tokens are never refreshable).

insufficient_scope

HTTP 403 · retryable: no · idem: no

The key does not carry the scope required for this operation.

account_restricted

HTTP 403 · retryable: no · idem: no

Account is restricted. Complete signup/verification.

test_mode_only

HTTP 403 · retryable: no · idem: no

Operation not available in this key mode.

test_key_fixture_only

HTTP 403 · retryable: no · idem: no

Test keys can only analyze the provided fixture video. Create a live key to analyze your own uploads.

validation_failed

HTTP 400 · retryable: no · idem: no

Request validation failed. All violations are listed in error.errors[].

unsupported_media_type

HTTP 415 · retryable: no · idem: no

Send video/mp4 or video/quicktime with a correct Content-Type.

payload_too_large

HTTP 413 · retryable: no · idem: no

Payload exceeds the 100MB multipart cap. Use the presigned upload path.

resource_not_found

HTTP 404 · retryable: no · idem: no

No such resource. IDs are account-scoped; check the ID and prefix.

resource_conflict

HTTP 409 · retryable: no · idem: no

Invalid state transition. GET the resource for its current state.

idempotency_key_reused

HTTP 409 · retryable: no · idem: no

Idempotency-Key was reused with a different request body.

idempotency_unavailable

HTTP 409 · retryable: yes · idem: yes

Idempotency store unavailable. Retry with the same key after Retry-After.

stream_already_active

HTTP 409 · retryable: no · idem: no

An active stream already exists on this account. End it (POST /v1/streams/{id}/end) or wait for it to finish.

upload_incomplete

HTTP 400 · retryable: no · idem: no

Upload incomplete or size mismatch. Re-create the video and complete within 24h.

video_unreadable

HTTP 400 · retryable: no · idem: no

Container/codec unsupported. Re-encode to H.264 MP4.

video_too_large

HTTP 400 · retryable: no · idem: no

Video exceeds the 2 GiB limit.

video_too_long

HTTP 400 · retryable: no · idem: no

Video exceeds the plan duration limit. Upgrade or trim.

url_fetch_failed

HTTP 400 · retryable: yes · idem: no

Source URL unreachable or timed out.

url_forbidden

HTTP 400 · retryable: no · idem: no

URL scheme or host blocked by the ingest policy.

prompt_empty

HTTP 400 · retryable: no · idem: no

Provide prompt or query.

prompt_too_long

HTTP 400 · retryable: no · idem: no

Prompt exceeds 2000 characters.

query_invalid

HTTP 400 · retryable: no · idem: no

Body fails the CompiledQuery schema; param names the field.

parse_failed

HTTP 422 · retryable: yes · idem: no

The compiler could not produce a query. Rephrase or send a structured query.

model_not_found

HTTP 400 · retryable: no · idem: no

Unknown model. See GET /v1/models.

model_deprecated

HTTP 400 · retryable: no · idem: no

Model is deprecated. Pin a supported version; see the changelog.

analysis_not_cancelable

HTTP 409 · retryable: no · idem: no

Analysis is already in a terminal state.

rerun_not_eligible

HTTP 409 · retryable: no · idem: no

This analysis is not eligible for a free re-run. Eligible: failed during a platform incident (rerun_eligible: true on the failed analysis) and not already re-run.

rate_limit_exceeded

HTTP 429 · retryable: yes · idem: yes

Rate limit exceeded. Back off per Retry-After.

concurrency_limit_exceeded

HTTP 429 · retryable: yes · idem: yes

Concurrent analysis limit reached. Wait for an active analysis to finish.

quota_exceeded

HTTP 429 · retryable: no · idem: no

Quota exceeded for a metered limit. See details.meter.

insufficient_credits

HTTP 402 · retryable: no · idem: no

Insufficient credits. Add credits or enable auto-refill.

grant_exhausted

HTTP 402 · retryable: no · idem: no

Free grant exhausted. Claim a full account via POST /v1/keys/request to continue.

capacity_exhausted

HTTP 503 · retryable: yes · idem: yes

Platform queue is full. Honor Retry-After.

sandbox_limit_exceeded

HTTP 429 · retryable: yes · idem: yes

Sandbox provisioning limit reached for this IP. Retry after the window resets, or sign up for a live key.

upgrade_limit_exceeded

HTTP 429 · retryable: no · idem: no

Too many upgrade attempts from this IP. Retry after the window resets.

github_verification_required

HTTP 403 · retryable: no · idem: no

A verified GitHub account is required for the free grant. Complete the GitHub device flow and retry with github_token.

github_token_invalid

HTTP 401 · retryable: no · idem: no

The github_token could not be verified with GitHub. Complete the device flow again and retry.

github_account_already_used

HTTP 409 · retryable: no · idem: no

This GitHub account has already claimed a free grant. One free grant per GitHub account, ever.

device_code_expired

HTTP 410 · retryable: no · idem: no

Device code has expired or been consumed. Start a new request.

inference_unavailable

HTTP 503 · retryable: yes · idem: yes

Transient inference backend outage. Retry with backoff.

upstream_error

HTTP 502 · retryable: no · idem: no

Inference upstream returned an error. Message is sanitized — no internal paths or stack traces.

db_unavailable

HTTP 503 · retryable: yes · idem: yes

Transient database outage. Retry with backoff.

internal_error

HTTP 500 · retryable: yes · idem: yes

Internal error. Includes request_id; contact support if persistent.

webhook_endpoint_limit

HTTP 400 · retryable: no · idem: no

At most 10 webhook endpoints per account.

Resource-level errors

These never appear as HTTP responses — only in analysis.error.code / video.error.code on failed resources.

inference_error

Model failed on this input. Safe to create a new analysis; persistent failures on one video → support with request_id.

stuck_timeout

The platform lost the job past the sweep window. Not billed; resubmit.

Prefer raw text? This page is available as markdown.