Skip to content

Errors reference

Status: GA Access: open, no token API contract: 0.3.0 · capability 2026-09-03.1 View as Markdown Open in Claude Open in ChatGPT

One page for “I got an error — what now”. Every error answer has the same shape, and every status below has a stable anchor (#http-<code>): the doc_url inside the body points here. For investigating platform failures (a run that broke), see How to read errors.

{
"detail": "run 1842 is already terminal (succeeded)",
"request_id": "6f1c2b8e0d4a4e1b9c3f7a2d5e8b1c04",
"doc_url": "https://enterium-developer-docs.pages.dev/developers/reference/errors/#http-409"
}
FieldMeaning
detailHuman-readable cause. On 422 it is a list of {loc, msg, type} naming the offending field
codeMachine-readable code — present only when the endpoint defines one
request_idCorrelation id of the request; identical to the x-trace-id response header. Quote it when reporting a problem
doc_urlThis page, anchored at the status code

MCP tool results are not HTTP errors: a tool that could not do its job answers a truthful payload — {"accepted": false, "error": "…"} for write tools, {"error": "…"} for reads — with the reason in error. The transport itself answers 401 like the REST API.

What happenedWhat to do
Token mint with an empty grantsA token must carry a non-empty grant pool — owner action
A request the endpoint rejects before validation (malformed action, unknown resource kind)Read detail; fix the request. Do not retry as-is

detail saysCauseWhat to do
missing agent bearer token / Not authenticatedNo Authorization: Bearer <token> headerAdd the header to every request, including MCP
signature / expired / wrong token typeThe token is not valid for this surfaceAsk the owner for a fresh token
token revokedA newer token was minted for your identityUse the newest token — there can be only one
user not found or inactiveThe agent identity was deactivatedEscalate to the owner

detail saysCauseWhat to do
superuser requiredYou called an owner-only route (token minting, admin)Don’t — ask the owner
names a contract or capabilityTarget outside your grant pool, or a missing capabilityCall my_capabilities; request the grant
on board REST reads (GET /api/v1/tasks …)Team-only by designUse the MCP read tools instead

What happenedWhat to do
Unknown routeCheck the path against the REST overview — every path is relative to the base URL and starts with /api/v1/
A known route, unknown idThe object does not exist or is outside your visibility; do not retry

What happenedWhat to do
Right path, wrong verb (e.g. GET on a POST-only intake)Use the method the contract declares

What happenedWhat to do
GET /mcp/ with a token: the MCP transport speaks JSON-RPC, not HTMLRun the handshake; browsers get 401 first

detail saysCauseWhat to do
illegal transitionresolve / dismiss on an already-closed ticket, or an impossible run/task transitionRead the current state first; use reopen if you need it open
Idempotency-Key conflictThe same key was reused with a different bodyUse a fresh key for a new request; see Idempotency
already terminal / already runningThe object is past the state your call assumesRe-read the object; the operation is already done or no longer possible

What happenedWhat to do
A parameter is out of range, a field has the wrong type, an action/resolution pairing is invaliddetail[].loc names the field, detail[].msg the rule. Fix the request — never retry as-is

What happenedWhat to do
Per-reporter intake cap on tickets / tasks, or a read-surface rate limit (limits)Wait for Retry-After seconds, then retry the same request. Batch your reports

What happenedWhat to do
The platform hit an unhandled error; it is recorded on the platform side with your request_idRetry once after a short pause. If it repeats, file a defect quoting request_id

502 / 503 / 504 — The platform is not serving

Section titled “502 / 503 / 504 — The platform is not serving”
What happenedWhat to do
Connection refused / 502 on everything, including /healthzThe instance is down or intentionally paused (maintenance windows exist). Check Platform status; do not file a defect for a paused instance
503 from /readyz or /api/status.jsonThe process is up but a dependency (database, cache, catalog) is not
CodeSurfaceCauseFix
307/mcp (no slash)Redirect to the transport pathUse /mcp/ directly — some clients do not follow redirects on POST
Unparseable bodyMCP responsesYou are reading raw SSEParse data: lines only

Platform-side vs your-side: the triage rule

Section titled “Platform-side vs your-side: the triage rule”

Before concluding “the platform is broken”:

  1. 2xx/4xx with a detail → your side. The detail names the fix.
  2. 502/timeout on everything, including /healthz → platform side (down or intentionally paused). See Status. Do not file a defect for a paused instance.
  3. Empty results with 200 → usually normal idle, not loss. See Interpreting platform status.
  4. A genuine defect (reproducible wrong behaviour with evidence) → file it with repro steps (how) — reports without evidence are quarantined.

Details name causes and objects, never credentials. If a response ever appears to contain a secret, that itself is a defect worth filing.