Skip to content

DocsReference

Errors

The shape of every error answer, the fifteen error codes with what to do about each, request ids, and how a failed job reports why.

Every error answers with RFC 9457 problem details, Content-Type: application/problem+json. The code is stable and documented on this page, and so is its reason when it has one: programs branch on them. detail is for people and may change.

JSON
{
  "type": "https://videxo.io/docs/errors#invalid_request",
  "title": "The request is not valid. `errors` lists each field that is wrong.",
  "status": 400,
  "detail": "outputs[1].fade.out: fade.out needs the output's length: set trim.duration or trim.end (or an end on every concat part).",
  "code": "invalid_request",
  "reason": "invalid_fields",
  "retryable": false,
  "request_id": "req_7h2m4x9q0c3v8k1n5r6t2b4z",
  "errors": [
    {
      "pointer": "#/outputs/1/fade/out",
      "detail": "fade.out needs the output's length: set trim.duration or trim.end (or an end on every concat part)."
    }
  ]
}
MemberAlwaysMeaning
typeyeshttps://videxo.io/docs/errors#<code>: the code's section below.
titleyesThe code's fixed sentence.
statusyesThe HTTP status, repeated.
detailyesWhat happened this time; it names the first wrong field when there is one.
codeyesThe stable error code.
reasonwhen the code has reasonsThe documented finer case, listed under each code.
retryableyesWhether sending the same request again later can succeed without a change.
request_idyesThe id of this request, also in the Request-Id header.
errorswith invalid_requestOne entry per wrong field: a detail and where the field is, one of pointer (a JSON Pointer into the body, #/outputs/0/resize/width; # is the whole body), parameter (a query or path parameter) or header.
problemswith command_invalidWhy the command is not accepted. Their codes are listed in Command rules.

An unknown body field is refused, one errors entry each, so a typo never silently does nothing. The same body is the content of an MCP tool error.

Request ids#

Every answer carries a Request-Id header (req_ and 24 letters and digits), successes included, and an error repeats it as request_id. Quote it when you contact support. The browser upload URL exposes the header to scripts too.

Failed jobs#

A failed job is not an error answer: GET /v1/jobs/{id} answers 200 with state: "failed" and an error object, and the webhook and MCP tools carry the same job:

MemberMeaning
codeOne of the codes below that a job can carry.
reasonThe documented finer case, or null.
messageWhat happened, for people; it may change.
retryableWhether creating the same job again can succeed without a change.
log_tailWith processing_failed and ffmpeg_error: ffmpeg's last lines about your media, at most 20 lines and 4 KB, with URLs, keys and our own file paths and options removed (inputs appear as {{in_...}}); otherwise null.

A cancelled job has error: null. We retry what can pass on its own (an input server that answered an error for a moment, a lost connection, a restart on our side) before a job fails; a job that fails with internal_error or service_unavailable uses no credits.

Codes#

Answers with 401 carry WWW-Authenticate: Bearer; answers with 429 and 503 carry Retry-After in seconds.

authentication_failed#

The API key, client token or access token is missing, malformed, unknown, revoked or expired.

A request answer; HTTP 401; trying again without a change fails the same way.

What to do: Send a valid key from the dashboard as Authorization: Bearer <key>. In an app, send a client token from your backend; ask your backend for a fresh one when it has expired. An MCP client that signs in follows the challenge and signs in again.

ReasonMeaning
missing_api_keyNo API key was sent.
invalid_api_keyThe key is malformed, unknown or deleted.
api_key_revokedThe key was revoked in the dashboard. Create a new one.
api_key_expiredThe key has expired. Create a new one.
missing_client_tokenNo client token was sent to a client route.
invalid_client_tokenThe client token is malformed, unknown or was changed.
client_token_expiredThe client token has expired. Ask your backend for a fresh one.
client_token_supersededA newer token of the same chain is in use. Use that one.
client_token_revokedThe client token was revoked, with its chain or the key that created it.
missing_credentialsThe MCP server got no credentials. Sign in, send an API key, or use the public address for the tools that need neither.
invalid_tokenThe access token is malformed or unknown, or was not issued for this server. A revoked token usually reads this way. Sign in again.
token_expiredThe access token has expired. Refresh it.
token_revokedThe app's access has ended: it was revoked, the member left the organization, or the organization was deleted. Sign in again.

permission_denied#

The request is not allowed.

A request answer; HTTP 403; trying again without a change fails the same way.

What to do: For a disabled account, contact support. For a signed link, ask for a fresh one. For a role, ask an owner or admin of the organization. For a scope, sign in again and allow it.

ReasonMeaning
account_disabledThe account is disabled and cannot create jobs.
link_invalidThe signed link is not valid: it was changed or belongs to another file.
origin_not_allowedThis browser origin may not make this call.
role_insufficientYour role in the organization does not allow this. Ask an owner or admin.
token_scopeA client token cannot do this: it works only on the client routes its grant allows.
client_token_requiredThis route takes a client token, never an API key. Keep API keys on your server.
insufficient_scopeThe access token does not cover this call. The WWW-Authenticate header names the scopes it needs: sign in again with them.

invalid_request#

The request is not valid. errors lists each field that is wrong.

A request answer; HTTP 400, 415, 416; trying again without a change fails the same way.

What to do: Fix the fields that errors names.

ReasonMeaning
invalid_fieldsA header, parameter or body field is missing or wrong.
not_jsonThe body is not JSON, or its content type is not application/json. (HTTP 415)
range_not_satisfiableThe requested byte range does not fit the file. (HTTP 416)
size_mismatchThe uploaded body is not size_bytes long. Create a new upload with the exact length.

command_invalid#

The command contains unsupported or invalid arguments. problems lists each one.

A request answer; HTTP 400; trying again without a change fails the same way.

What to do: Change the command; the command rules list what is supported.

not_found#

There is no such resource in this account, or no such route.

A request answer; HTTP 404; trying again without a change fails the same way.

What to do: Check the id, and that the API key belongs to the account that owns it.

ReasonMeaning
jobNo job with this id in this account.
fileThe file does not exist or has been deleted.
outputThe job has no output with this name.
uploadNo completed, retained upload with this id in this account.
webhook_endpointNo webhook endpoint with this id in this account.
webhook_deliveryNo webhook delivery with this id in this account.
routeThere is no such route.
subscriptionThe account has no subscription to change.
ticketNo support ticket with this id in this account.
client_tokenNo client token with this id in this account.

conflict#

The resource's state does not allow this now.

A request answer; HTTP 409; trying again without a change fails the same way.

What to do: Read reason: wait for the job or the delivery, create a new upload, change the endpoint with PATCH, or use a new Idempotency-Key for a new request.

ReasonMeaning
job_activeThe job is still queued or running. Its files can be deleted once it ends.
upload_usedThis upload URL has already been used. Create a new upload.
webhook_endpoint_existsThe account already has its webhook endpoint. Change it with PATCH or delete it first.
webhook_delivery_pendingThe delivery is still being attempted. Send it again once it is delivered or failed.
idempotency_key_reusedThis Idempotency-Key was used in the last 24 hours with a different request.
checkout_pendingA checkout for another plan is open. Finish it, or start again in 30 minutes.
subscription_existsThe account already has a subscription. Change its plan instead.
same_planThe account is already on this plan.
ticket_closedThe ticket is closed. Reopen it to write again.

resource_expired#

The file, the upload or the signed link has expired.

A request answer; HTTP 410; trying again without a change fails the same way.

What to do: Ask for a fresh link while the file is retained, or upload the file again.

ReasonMeaning
link_expiredThe signed link has expired. Ask for a fresh one.
file_expiredThe file passed the plan's retention and was deleted.
upload_expiredThe upload expired 24 hours after it was created.

limit_exceeded#

A plan or request limit was passed.

A request answer or a failed job; HTTP 413; trying again without a change fails the same way.

What to do: Use smaller inputs or a shorter job, or move to a plan with larger limits (limits).

ReasonMeaning
request_body_sizeThe request body is larger than the API accepts.
upload_sizeThe upload is larger than the plan's input limit or the 100 MB direct upload limit.
input_sizeThe job's inputs passed the plan's total input size.
output_sizeThe job's outputs passed the plan's total output size.
job_durationThe job ran past its time limit: the plan's longest job, or less when the period's credits left less room.
member_limitThe organization has as many members as its plan allows.
organization_limitYou own as many organizations as allowed.
token_uploadsThe client token's chain has created as many uploads as its grant allows.
subtitles_sizeA subtitles file is larger than a job accepts.

usage_cap_reached#

The plan's overage cap for this period is reached.

A request answer or a failed job; HTTP 402; trying again without a change fails the same way.

What to do: Wait for the next period, or upgrade the plan.

out_of_credits#

The prepaid credit balance is at zero.

A request answer or a failed job; HTTP 402; trying again without a change fails the same way.

What to do: Credits cannot be bought yet: payments are not connected. Write to us if you need more.

rate_limited#

Too many requests. Try again after the number of seconds in the Retry-After header.

A request answer; HTTP 429; safe to try again.

What to do: Wait for Retry-After, then send the request again.

service_unavailable#

We could not complete this in time, after retrying on our side. Quote the request id to support if it repeats.

A request answer or a failed job; HTTP 503; safe to try again.

What to do: Send the request again after Retry-After. After cancel_unconfirmed, read the job before cancelling again. A job that failed with queue_timeout can be created again.

ReasonMeaning
temporaryPart of the service did not answer in time. Quote the request id to support if it repeats.
cancel_unconfirmedCancellation could not be confirmed. Read the job before trying again.
queue_timeoutThe job waited 24 hours without a free slot, for the account or for the service.

internal_error#

Something failed on our side. Quote the request id to support if it repeats.

A request answer or a failed job; HTTP 500; safe to try again.

What to do: Send the request again with the same Idempotency-Key; it answers the job if one was made. Create a failed job again with a new key. If it repeats, contact support with the request id or the job id. A job that failed this way uses no credits.

input_unreachable#

An input could not be read.

A failed job; no HTTP status: GET /v1/jobs/{id} answers 200 with the failed job; trying again without a change fails the same way.

What to do: Make the URL publicly reachable over http or https on the default port, or upload the file again.

ReasonMeaning
url_refusedThe URL could not be reached, or is not a public http or https address on the default port.
http_statusThe server of the URL answered with an error.
networkThe URL could not be reached, after several tries.
redirectsThe URL redirected more than 5 times.
too_slowFetching the inputs took longer than 20 minutes.
upload_expiredThe upload expired before the job could read it.

processing_failed#

The media could not be processed with these settings.

A failed job; no HTTP status: GET /v1/jobs/{id} answers 200 with the failed job; trying again without a change fails the same way.

What to do: Fix the command, the settings or the media, then create the job again.

ReasonMeaning
ffmpeg_errorffmpeg stopped with an error.
output_emptyAn output came out empty.
time_past_endA requested time or trim is past the end of the input.
subtitles_invalidThe subtitles could not be read: check their format and encoding.
media_unreadableAn input could not be read as audio, video or an image.

Codes before November 2026#

The list was shorter and plainer from 2026-11-05 (changelog). Each earlier code answers as:

BeforeNow
missing_api_keyauthentication_failed, reason missing_api_key
invalid_api_keyauthentication_failed, reason invalid_api_key
api_key_revokedauthentication_failed, reason api_key_revoked
api_key_expiredauthentication_failed, reason api_key_expired
account_disabledpermission_denied, reason account_disabled
file_signature_invalidpermission_denied, reason link_invalid
idempotency_conflictconflict, reason idempotency_key_reused
job_activeconflict, reason job_active
upload_usedconflict, reason upload_used
webhook_endpoint_existsconflict, reason webhook_endpoint_exists
webhook_delivery_pendingconflict, reason webhook_delivery_pending
job_not_foundnot_found, reason job
file_not_foundnot_found, reason file
upload_not_foundnot_found, reason upload
webhook_endpoint_not_foundnot_found, reason webhook_endpoint
webhook_delivery_not_foundnot_found, reason webhook_delivery
file_expiredresource_expired
upload_too_largelimit_exceeded, reason upload_size
upload_size_mismatchinvalid_request, reason size_mismatch
range_not_satisfiableinvalid_request, reason range_not_satisfiable
runner_unavailableservice_unavailable, reason cancel_unconfirmed
input_too_largelimit_exceeded, reason input_size
output_too_largelimit_exceeded, reason output_size
time_limitlimit_exceeded, reason job_duration
ffmpeg_failedprocessing_failed, reason ffmpeg_error
queue_timeoutservice_unavailable, reason queue_timeout