Skip navigation

API errors

HTTP statuses, error codes, and retry guidance.

Errors

Every failed request returns the same envelope: an HTTP status and a JSON body with a machine-readable code. Branch on error.code, never on error.message — codes are stable, messages are not.

The code does not repeat the HTTP status. 404 Not Found arrives with code 400404; a request without the Authorization header arrives with HTTP 400 and code 100101. Read the status and the code independently.

{
  "error": {
    "code": 400301,
    "message": "invalid uuid format",
    "detail": "see https://en.wikipedia.org/wiki/Universally_unique_identifier"
  }
}

The API returns that link itself. It covers only one of the accepted notations: paths also take a UUID without dashes and a base58 form 21–22 characters long, so a value rejected with this code is not necessarily a malformed UUID.

Validation errors carry invalid_params, one entry per rejected field:

{
  "error": {
    "code": 400400,
    "message": "request parameters didn't validate",
    "invalid_params": [
      { "index": 0, "name": "privacy_type", "reason": "oneof", "message": "anywhere nowhere custom" }
    ]
  }
}

The same code arrives without invalid_params when a required query parameter is missing — the parameter name is then inside message:

{ "error": { "code": 400400, "message": "Parameter 'from' not found" } }

Server errors use a different shape: path and timestamp instead of detail.

{
  "error": {
    "code": 500500,
    "path": "/v1/videos",
    "message": "no message available",
    "timestamp": "2026-09-24T09:25:48.540408556Z"
  }
}

An empty request body is reported separately, with code 1 and message io error.

Fields:

FieldTypeDescription
error.codenumberMachine-readable code. Does not repeat the HTTP status — the full list is below.
error.messagestringShort human-readable explanation, suitable for logs. Not stable: do not branch on it.
error.detailstringOptional. Additional context: the JSON parse position, the rejected value, or a reference link.
error.invalid_paramsarrayOptional. Per-field breakdown of a validation failure. Each entry has index, name (the field), reason (required, oneof, notempty_if, not exists, …) and message with the accepted values.
error.pathstring5xx only. The path that failed.
error.timestampstring5xx only. RFC 3339, UTC.

X-Request-ID. Successful responses and errors 400, 401 and 500 carry this response header — quote it when contacting support. It is not sent on 404 and 405.

HTTP status code summary

CodeNameDescription
200OKRequest succeeded. The response body contains the requested object.
201CreatedResource was created. The response body contains the new object.
204No ContentRequest succeeded; the endpoint has no body to return (typically after a DELETE).
400Bad RequestMalformed request: invalid JSON, unparseable identifier, value outside the allowed set. Also returned when the Authorization header is missing — code 100101.
401UnauthorizedThe token is invalid, revoked, or belongs to another workspace.
402Payment RequiredThe plan or balance does not cover this operation. Not reproduced during verification.
403ForbiddenThe token is authenticated but lacks permission. Not reproduced during verification.
404Not FoundThe object does not exist, or is not visible to this token. Arrives with code 400404.
405Method Not AllowedThe path does not support this method. Arrives with code 400405.
409ConflictState conflict; used by Speak. Not reproduced during verification.
422Unprocessable EntityThe resource is not ready yet; used by Speak. Not reproduced during verification.
429Too Many RequestsRate limit. Not reproduced: 50 parallel requests passed without one. The API sends neither RateLimit-* nor Retry-After.
5xxServer ErrorUnexpected server error. Safe to retry with exponential backoff; contact support if it persists.

Numeric codes returned in error.code. A dash in the Name column means the code has no machine-readable name assigned yet — branch on the number. The Retry column says whether repeating the identical request can help.

Authentication & access codes (1xxxxx)

CodeHTTPNameRetryDescription
1400IO_ERRORnoThe request body could not be read — usually an empty or truncated payload, or a dropped connection.
100101400AUTH_AUTHORIZATION_HEADER_NOT_FOUNDnoThe Authorization header is missing. Note the status: 400, not 401, and no WWW-Authenticate header is sent.
100102401UNAUTHORIZEDnoThe token is invalid, revoked, or expired. A missing header is 100101 instead. Issue a new token.
100103403ACCESS_DENIEDnoThe token is valid but does not grant access to this resource or scope. Check the token permissions.
100104400INVALID_USERNAME_OR_PASSWORDnoThe credentials provided to the sign-in endpoint do not match any account.
100105400INVALID_CONFIRMATION_TOKENnoThe email-confirmation token is unknown or expired. Request a new one.
100106—LIMIT_REACHEDlaterA per-workspace quota has been hit. Check the plan.
100107403USER_IS_NOT_OWNERnoThe action requires workspace-owner privileges.

Bad request & validation codes (4xxxxx)

CodeHTTPNameRetryDescription
400101400JSON_SYNTAX_ERRORnoThe request body is not valid JSON. detail carries the offending character and its context.
400102400JSON_UNMARSHAL_TYPE_ERRORnoA field has an unexpected type — for example a string where a number is required.
400201400HAS_ALREADY_BEEN_TAKENnoA uniqueness constraint was violated.
400202400EMAIL_IS_ALREADY_TAKENnoAn account with this email already exists.
400203400NAME_IS_ALREADY_TAKENnoAn entity with this name already exists in the current scope.
400204400INVITATION_IS_ALREADY_EXISTnoAn invitation has already been sent to this recipient.
400205400INVITATION_IS_ALREADY_APPROVEDnoThe invitation has already been accepted.
400206400BILLING_ACCOUNT_IS_ALREADY_EXISTnoA billing account is already attached to this workspace.
400207400NOT_ENOUGH_MONEYlaterThe workspace balance is insufficient for this operation.
400208400NO_BILLING_ACCOUNTnoThe workspace has no billing account yet.
400209400NO_PAYMENT_METHODnoNo payment method is configured on the billing account.
400210400NOT_ENOUGH_REQUIRED_PRODUCTSnoThe current plan is missing a product this operation depends on.
400211400NOT_ALLOWED_ADDITIONAL_FOR_TRIALnoAdd-ons cannot be purchased on a trial plan.
400212400SUBSCRIPTION_NOT_PAIDlaterThe workspace has unpaid invoices.
400213400EMAIL_NOT_CONFIRMEDlaterThe user's email address has not been confirmed yet.
400214400EMAIL_NOT_FOUNDnoNo account is associated with the given email.
400215400RESET_TOKEN_NOT_FOUND_OR_EXPIREDnoThe password-reset token is unknown or expired.
400216400NOT_ALLOWED_ORDER_FIELDnoThe order parameter names a field this endpoint cannot sort by. The direction is case-sensitive: title.DESC is rejected, title.desc is not.
400236400—noThe referenced folder does not exist — for example parent_id in Copy video. Carries invalid_params; the folder is checked before the video.
400301400—noThe identifier could not be parsed in any accepted notation: UUID with dashes, UUID without dashes, or base58. Not a statement about the object existing.
400302400—noThe identifier is 21–22 characters long but carries a character outside the base58 alphabet (O, I, l). A leading 0 is padding and is accepted; a wrong character anywhere else is not.
400400400—noValidation failed, or a required query parameter is missing. Two shapes: with invalid_params and without — see above.
400404404—noThe object does not exist or is not visible to this token. The most common error in practice.
400405405—noThe path does not support this method. Check the method on the endpoint page.

Other error codes (402 / 404 / 409 / 422 / 500)

CodeHTTPNameRetryDescription
402402402VALIDATION_ERRORnoCarried over from the previous catalogue. Could not be reproduced, and the one example that showed it turned out to be copied from another endpoint. Real semantics require confirmation — use 400400 as the validation code.
404404404NO_SUCH_ENTITYnoListed in this catalog. In practice a missing object returns 400404.
409293409—laterState conflict on a Speak transcript. Known only from the Speak response example; not reproduced.
422100422—yesA Speak transcript is not ready yet. Known only from the Speak response example; not reproduced.
500500500INTERNAL_SERVER_ERRORyesInternal server error. Reproduced on GET /v1/videos?page=0. Retry with exponential backoff; if the same parameters fail repeatedly, retrying will not help.

Handling errors

  • Retries. 5xx responses and network timeouts are safe to retry with exponential backoff; cap the attempts at five. Other 4xx responses should not be retried — fix the request first.
  • Rate limits. The API sends neither RateLimit-* nor Retry-After. The developer guide states 10 requests per second and 300 per minute, but 50 parallel requests passed without a 429, so treat the published figure as unconfirmed and pause at least 5 seconds before repeating after one.
  • Validation. Parse error.invalid_params — name is the field to fix and message lists the accepted values. When invalid_params is absent, the parameter name is inside message.
  • Identifiers. 400301 and 400302 mean the identifier could not be parsed, not that the object is missing. A missing object is 400404.
  • Repeating a POST. Idempotency-Key is not supported in any documented form. Assume that repeating a POST after a timeout creates a second object; check with a list request before retrying.
  • Logging. Log error.code and X-Request-ID, not error.message: codes are stable, messages are not.

Codes and shapes on this page were verified against the production API on 2026-09-24. Rows marked as not reproduced are carried over from the previous catalog or from response examples and still need confirmation.