When a request fails, the API answers with an HTTP error status and a JSON body like this one:
{ "error": { "code": "NOT_FOUND", "message": "Not found.", "details": {} }}codenames what went wrong. Codes never change once they ship, so branch on the code.messageis a sentence you can show a person or pass to an agent. Its wording can change.detailsappears on some codes with more context, such as the problems in a runner order.
When a code means you can try again later, such as RATE_LIMITED, the response also has a Retry-After header with the seconds to wait. The MCP server passes the message and the code to your agent.
| Code | Status | Message |
|---|---|---|
AGENT_NOT_ALLOWED
|
403 | Agent tokens can't call this route. |
CANNOT_DELETE_SELF
|
400 | You can't delete your own account here. |
CANNOT_DEMOTE_SELF
|
400 | You can't remove your own operator role. |
DEVICE_CODE_CLAIMED
|
403 | Another account already approved or denied this request. Run `relayrunner connect` again for a new code. |
DEVICE_CODE_EXPIRED
|
400 | That code has expired. Run `relayrunner connect` again for a new one. |
DEVICE_CODE_INVALID
|
400 | That code doesn't match a sign-in request. Check it against your terminal. |
DEVICE_CODE_USED
|
409 | That code has already been used. |
FORBIDDEN
|
403 | You don't have access to that. |
GITHUB_APP_NOT_CONFIGURED
|
500 | The GitHub App isn't set up. |
GITHUB_RATE_LIMITED
|
503 | GitHub's API limit was reached. Try again shortly. |
GITHUB_UNAVAILABLE
|
502 | GitHub didn't answer. Try again shortly. |
INTERNAL_ERROR
|
500 | Something went wrong on our side. |
INVALID_REQUEST
|
400 | The request isn't valid. |
INVALID_TOKEN
|
401 | The token is invalid, expired or revoked. |
LEGAL_TERMS_OUTDATED
|
409 | The terms changed since you opened this page. Reload it to read the new version. |
MACHINE_NOT_OWNED
|
403 | Only a machine with an owner can do this. |
METHOD_NOT_ALLOWED
|
405 | That method isn't allowed here. |
NO_ACTIVE_WORKSPACE
|
409 | Pick a workspace first. |
NOT_A_MEMBER
|
403 | You aren't a member of that workspace. |
NOT_FOUND
|
404 | Not found. |
PAYLOAD_TOO_LARGE
|
413 | The request body is too large. |
PRICE_EXISTS
|
409 | That rate already has a price from that day. Remove it first to correct it. |
PRICE_INVALID
|
400 | Check the price and date. |
PROVIDER_EXISTS
|
409 | There's already a provider with that id. |
PROVIDER_ID_INVALID
|
400 | Use lowercase letters, numbers and dashes for the id. |
PROVIDER_INVALID
|
400 | Fill in a name, summary and labels, and use https:// links. |
PROVIDER_NOT_CONNECTED
|
404 | That provider isn't connected. |
PROVIDER_PREFIX_TAKEN
|
409 | Another provider, or GitHub's own runners, already use labels like that. |
PROVIDER_PREFIXES_INVALID
|
400 | Add at least one label prefix, three or more characters each. |
PROVIDER_TOKEN_REJECTED
|
400 | The provider didn't accept that token. Check it and its scope. |
PROVIDER_UNKNOWN
|
400 | There's no provider with that id. |
PROVIDER_UNREACHABLE
|
502 | The provider's API didn't answer. Try again shortly. |
RATE_LIMITED
|
429 | Too many requests. Try again shortly. |
RUNNER_ORDER_INVALID
|
400 | The runner order isn't valid. |
TELEMETRY_ENDPOINT_INVALID
|
400 | Use an https URL on the internet, like https://api.honeycomb.io. |
TELEMETRY_HEADER_MISSING
|
400 | Enter a value for each header. |
TELEMETRY_NOT_CONFIGURED
|
404 | Telemetry isn't set up for this workspace. |
TOKEN_STORAGE_UNAVAILABLE
|
503 | Saving provider tokens isn't set up on this server yet. |
UNAUTHENTICATED
|
401 | Sign in first. |
USER_HAS_SHARED_WORKSPACES
|
409 | The user is in workspaces with other members. Remove them from those first. |
WEBHOOK_ENQUEUE_FAILED
|
503 | The delivery couldn't be queued. Redeliver it from the App's settings. |
WEBHOOK_SECRET_NOT_CONFIGURED
|
500 | The webhook secret for this App isn't set up on this server. |
WEBHOOK_SIGNATURE_INVALID
|
401 | The webhook signature is missing or doesn't match the App's secret. |
WEBSOCKET_REQUIRED
|
426 | Connect with a WebSocket upgrade. |
WORKSPACE_REQUIRED
|
409 | This token reads more than one workspace. Name one with the x-relayrunner-workspace header. |