Skip navigation

API errors

HTTP statuses, error codes, and retry guidance.

Errors

The API uses conventional HTTP status codes to signal outcome, and a structured JSON body to describe the reason. Every error response has the same shape — code, short message, and optional detail with extra context.

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

Fields:

FieldTypeDescription
error.codenumberA fine-grained application-level code. Combines the HTTP status with a reason category — the full list is below.
error.messagestringShort human-readable explanation, suitable for logs.
error.detailstringOptional. Additional context — a list of failing fields for validation errors, a link to external docs, or the specific value that was rejected.

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 RequestThe request is malformed — missing required fields, wrong types, or invalid parameter values.
401UnauthorizedAuthentication is missing, invalid, or expired. Check the Authorization header.
402Payment RequiredThe workspace plan or balance does not cover this operation.
403ForbiddenThe token is authenticated but lacks permission for this resource or action.
404Not FoundThe resource does not exist, or it exists but is not visible to this token.
429Too Many RequestsRate limit exceeded. Respect the Retry-After response header before retrying.
5xxServer ErrorUnexpected server error. Safe to retry with exponential backoff; contact support if it persists.

Numeric codes returned in error.code. The first three digits of each code always match the HTTP status of the response.

Authentication & access codes (1xxxxx)

CodeNameDescription
1IO_ERRORThe request body could not be read — usually an empty or malformed payload, or a dropped connection mid-upload.
100101AUTH_AUTHORIZATION_HEADER_NOT_FOUNDThe Authorization header is missing from the request.
100102UNAUTHORIZEDThe token is missing, invalid, or expired.
100103ACCESS_DENIEDThe token is valid but does not grant access to this resource or scope.
100104INVALID_USERNAME_OR_PASSWORDThe credentials provided to the sign-in endpoint do not match any account.
100105INVALID_CONFIRMATION_TOKENThe email-confirmation token is unknown or expired. Request a new one.
100106LIMIT_REACHEDA per-workspace quota or rate limit has been hit.
100107USER_IS_NOT_OWNERThe action requires workspace-owner privileges; the current user is not the owner.

Bad request & validation codes (4xxxxx)

CodeNameDescription
400101JSON_SYNTAX_ERRORThe request body is not valid JSON.
400102JSON_UNMARSHAL_TYPE_ERRORA field in the body has a type that the API did not expect (e.g. a string where a number is required).
400201HAS_ALREADY_BEEN_TAKENA uniqueness constraint was violated — a value with the given key already exists.
400202EMAIL_IS_ALREADY_TAKENAn account with this email address already exists.
400203NAME_IS_ALREADY_TAKENAn entity with this name already exists in the current scope (workspace, project, folder).
400204INVITATION_IS_ALREADY_EXISTAn invitation has already been sent to this recipient.
400205INVITATION_IS_ALREADY_APPROVEDThe invitation has already been accepted — it cannot be accepted again.
400206BILLING_ACCOUNT_IS_ALREADY_EXISTA billing account is already attached to this workspace.
400207NOT_ENOUGH_MONEYThe workspace balance is insufficient for this operation.
400208NO_BILLING_ACCOUNTThe workspace has no billing account yet. Create one before using paid features.
400209NO_PAYMENT_METHODNo payment method is configured on the billing account.
400210NOT_ENOUGH_REQUIRED_PRODUCTSThe current plan is missing one or more products this operation depends on.
400211NOT_ALLOWED_ADDITIONAL_FOR_TRIALAdd-ons cannot be purchased while the workspace is on a trial plan.
400212SUBSCRIPTION_NOT_PAIDThe workspace has unpaid invoices. Clear them before continuing.
400213EMAIL_NOT_CONFIRMEDThe user's email address has not been confirmed yet.
400214EMAIL_NOT_FOUNDNo account is associated with the given email.
400215RESET_TOKEN_NOT_FOUND_OR_EXPIREDThe password-reset token is unknown or expired. Start the reset flow again.
400216NOT_ALLOWED_ORDER_FIELDThe order parameter refers to a field that this endpoint cannot sort by.
400301One of the UUID parameters in the URL, query, or body has an invalid format.
400400UNEXPECTED_VALUEA parameter value is outside the set of allowed values (usually an enum).

Other error codes (402 / 404 / 500)

CodeNameDescription
402402VALIDATION_ERROROne or more fields failed validation. The detail field typically lists the failing fields and the reasons.
404404NO_SUCH_ENTITYThe referenced object does not exist, has been deleted, or is not visible to this token.
500500INTERNAL_SERVER_ERRORAn unexpected error occurred on the server. Safe to retry with exponential backoff.

Handling errors

  • Retries. 5xx responses and network timeouts are safe to retry. Use exponential backoff and cap the number of attempts. 4xx responses other than 429 should not be retried — fix the request.
  • Rate limits. On 429, pause for the number of seconds in the Retry-After header before retrying. Do not retry immediately.
  • Validation. For 402402 VALIDATION_ERROR, expect error.detail to contain the field-level breakdown. Surface those messages to the user so they can correct the input.
  • Logging. Log error.code rather than error.message for alerting and analytics — codes are stable, messages are not.