Skip to main content

Error codes

Errors carry a machine-readable code alongside a human-readable message. Use the code for logic — it is stable — and the message for display. The message text is written for end users and may change.

Authentication​

CodeMeaning
INVALID_CREDENTIALSWrong email or password
EMAIL_NOT_VERIFIEDThe account has not verified its email
MISSING_TOKENNo session token was supplied
INVALID_TOKENThe token is malformed
ACCOUNT_INACTIVEThe account is suspended

Session refresh​

CodeMeaning
REFRESH_TOKEN_INVALIDThe refresh token is not recognised
REFRESH_TOKEN_EXPIREDPast its lifetime
REFRESH_TOKEN_REUSEDAn already-used token was presented — treated as a theft signal

Email verification and password reset​

CodeMeaning
VERIFICATION_TOKEN_EXPIREDThe verification link has expired
RESET_TOKEN_EXPIREDThe reset link has expired
RESET_TOKEN_ALREADY_USEDReset links are single-use

Identity​

CodeMeaning
EMAIL_ALREADY_EXISTSThat email is already registered
EMAIL_TAKENEmail conflict on update

Organisation and members​

CodeMeaning
ORG_FORBIDDENYour role does not permit this
SLUG_EXHAUSTEDNo unique slug could be generated from the name
PLAN_FORBIDDENOnly the owner can change the plan
MEMBER_FORBIDDENYou cannot modify this membership
INVITE_FORBIDDENYou cannot manage invitations
ALREADY_MEMBERAlready a member of this organisation
INVITATION_NOT_PENDINGAlready accepted or cancelled
INVITATION_EXPIREDPast the 7-day window
INVITATION_ORG_LIMITYou belong to too many organisations

Projects​

CodeMeaning
PROJECT_FORBIDDENYour role does not permit this
PROJECT_SLUG_TAKENThat slug is used in this organisation
PROJECT_ALREADY_MEMBERAlready a project member

API keys​

CodeMeaning
INVALID_API_KEYThe key is invalid or revoked
MISSING_API_KEYNo X-API-Key header was sent
API_KEY_PROJECT_MISMATCHThe key belongs to a different project
API_KEY_NAME_TAKENA key with that name exists in the project
API_KEY_FORBIDDENYour role does not permit managing keys
API_KEY_LIMITKey limit reached

Test runs​

CodeMeaning
RUN_FORBIDDENYour role does not permit this
CASE_ALREADY_IN_RUNThat case is already in this run
RUN_ALREADY_CLOSEDThe run is closed and cannot be modified
RUN_NOT_ACTIVEThe operation requires an active run
ASSIGNEE_INELIGIBLEAssignee must be an active owner, admin, or tester

Comments and attachments​

CodeMeaning
COMMENT_FORBIDDENYou can only delete your own comment
ATTACHMENT_FORBIDDENYou can only delete your own attachment

CI​

CodeMeaning
CI_FORBIDDENYour role does not permit this
CI_JOB_NOT_CANCELLABLEThe job already finished

Plans and quotas​

CodeMeaning
PLAN_LIMIT_MEMBERSMember limit reached
PLAN_LIMIT_PROJECTSProject limit reached
PLAN_LIMIT_TEST_CASESTest case limit reached
PLAN_FEATURE_UNAVAILABLEThat feature is not in your plan

AI​

CodeMeaning
AI_FEATURE_GATEDAI requires Pro or Enterprise
AI_PROVIDER_FORBIDDENYour role does not permit configuring the provider
AI_KEY_VALIDATION_FAILEDThe provider rejected the key

Webhooks​

CodeMeaning
WEBHOOK_LIMIT_REACHEDMaximum 20 endpoints per project

Generic​

CodeMeaning
NOT_FOUNDThe resource does not exist, or you cannot see it
RATE_LIMITEDToo many requests; honour retry_after_seconds

Handling errors in a client​

  1. Branch on code, not on the message. Messages are user-facing and may be reworded.
  2. Handle RATE_LIMITED by waiting retry_after_seconds before retrying.
  3. Treat NOT_FOUND carefully. A resource you lack permission to see may also return NOT_FOUND, deliberately, so that the API does not reveal what exists.
  4. Re-authenticate on the refresh codes. REFRESH_TOKEN_REUSED in particular means the session should be considered compromised — clear it and prompt for login rather than retrying.