Skip to content
Current

The Current API is not open yet. These pages describe how it works; you can't create keys or connect apps until it opens.

Errors: the one error shape

Every REST refusal has the same shape: a code with its HTTP status, a sentence you can show a person, a reason where one applies, and a request id for support.

Last updated 6 min read

On this page · 4 sections
  1. Every code and status
  2. What to do
  3. Every reason
  4. Common questions

Every refusal from the REST API comes back in one shape. A code keeps one HTTP status, except bad_request: 400, or 405 for a method the address does not take, or 413 for a body over 64 KB. The OAuth endpoints answer in the standard OAuth error shape, and the MCP server answers with JSON-RPC errors.

{
  "error": {
    "code": "conflict",
    "message": "Someone changed this first. Read it again, then retry.",
    "reason": "owner_moved",
    "request_id": "3d9a6c1e-8f42-4b07-9e5d-2c7a1f4b6e93"
  }
}
  • code: what went wrong, one of the codes below.
  • message: one sentence written for a person. It never carries database text, so you can show it as it is.
  • reason: a narrower reason beside some refusals, or null. Your code can branch on it.
  • request_id: quote it when you contact support.

Every code and status

StatusCodeWhat it means
400bad_requestThe request was not in the expected shape.
401unauthorizedThis token was not accepted.
403not_allowed, frozen, module_offThis agent is not allowed to do that. This workspace is read only right now, so nothing can be changed. The API is not switched on for this workspace.
404not_foundNothing was found with that id, or this agent cannot see it.
405bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does.
409conflictSomeone changed this first. Read it again, then retry.
413bad_request (body_too_large)The request body is larger than 64 KB.
429rate_limited, send_cappedToo many requests from this token. Wait, then try again. This token has sent its limit of customer emails for now. Try again later.
503degradedCurrent is busy. Try again in a minute.

What to do

When you seeDo this
401 unauthorizedCheck the key, its expiry and its allowed addresses. A key from outside its allowlist gets this same answer.
403 not_allowedThe agent's role does not allow it. Give the agent a role that does.
403 module_off or frozenThe API, or the workspace, is switched off or paused. Nothing to retry until a tenant admin changes it.
404 not_foundThe record does not exist, this agent cannot see it, the key lacks the scope, or writes are switched off. These answers are the same on purpose.
409 conflictSomeone changed it first, or a request_id was reused with different details. Read it again, then retry with a new request_id.
429 rate_limitedWait for the seconds in Retry-After, then try once more (see Limits).
503 degradedCurrent is busy. Try again in a minute.
504 degradedCurrent took longer than 90 seconds to start answering, so the API's edge stopped waiting. Try again in a minute.

Every reason

ReasonWhat it means
request_id_missingSend a request_id (a uuid you mint) with every change.
request_id_reusedThat request_id was already used for a different change. Mint a new one.
in_progressThat request is still being worked on. Wait a moment, then send it again.
body_lengthThe text must be 1 to 15,000 characters.
nothing_to_changeGive a status, a priority or both.
use_closeClose a ticket with tickets_close, not by setting its status.
waiting_reason_needs_waitingA waiting reason goes only beside a waiting status.
finishedThat ticket is resolved or closed. Take the close back first, or ask a person to reopen it.
changedThe ticket changed since you read it. Read it again, then retry.
owner_movedSomeone changed who has this ticket since you read it, so nothing moved.
assignee_not_allowedThat person cannot own desk tickets here. Pick a desk staff member, yourself or nobody.
already_closedThat ticket is already closed.
not_holderOnly the ticket's owner, the person who raised it, or a desk manager can take a close back.
not_finishedThat ticket is not resolved or closed, so there is nothing to take back.
not_closedThat ticket is not closed, so it cannot go back to resolved.
mergedThat ticket was merged into another one, so its close can't be taken back here. A person can undo the merge.
undo_window_passedThe 24 hours to take this back have passed. A person can reopen the ticket.
resolved_needs_personThis workspace surveys after every close, so a person takes a close back to resolved.
resolved_has_askThe customer's "Did this fix it?" question would come back, so a person takes this close back to resolved. Take it back to open instead.
same_ticketName two different tickets.
not_nativeOnly tickets made in Current can be merged.
no_companyBoth tickets need a company before they can be merged.
different_companyThe two tickets are on different companies, so they cannot be merged.
merge_closedThe ticket to fold in is already closed.
keep_closedThe ticket to keep is closed.
merge_already_mergedThe ticket to fold in was already merged.
keep_already_mergedThe ticket to keep was already merged into another ticket.
psa_in_flightThe ticket to fold in is being sent to the PSA right now. Try again in a minute.
time_in_flightTime on the ticket to fold in is being sent to the PSA right now. Try again in a minute.
psa_twin_pendingThe ticket to fold in is still being copied to the PSA. Try again shortly.
keep_not_in_psaWork on the ticket to fold in is waiting for the PSA, and the ticket to keep is not in the PSA. Keep the other ticket instead.
not_allowedThis agent's role cannot do that.
not_desk_staffThat person cannot own desk tickets here.
work_columnsThis agent's role cannot change that field.
stale_ownerSomeone changed who has this ticket since you read it, so nothing moved.
cursor_invalidThat cursor was not issued for this list or this workspace. Start again from the first page.
secret_not_acceptedCurrent makes every key and secret itself. Remove the field that carries one.
not_jsonThe request body must be a JSON object.
body_too_largeThe request body is larger than 64 KB.
method_not_allowedThat address does not accept this method. The Allow header lists the ones it does.
bad_argumentsOne of the fields is missing or not in the expected shape. The message names it.
What does a Current API error look like?

A REST refusal is always the same shape: error with code, message, reason and request_id. Each code keeps one HTTP status: 400 bad_request (405 for a wrong method, 413 for a body over 64 KB), 401 unauthorized, 403 not_allowed, module_off or frozen, 404 not_found, 409 conflict, 429 rate_limited, 503 degraded. The OAuth endpoints use the standard OAuth error shape and the MCP server uses JSON-RPC errors. See the current-api-errors article. The Current API is not open yet.

Why does the Current API answer 404 for a ticket I know exists?

Because the agent's role cannot see it. The API answers not_found for a record that does not exist and for one the agent may not see, so a key can never learn what lies outside its reach. The Current API is not open yet.

Was this helpful?