Errors

The running jobjob_7Hq2 · delivered · document.fr-CA.pdf · $49.00 charged

Every code a call or check can return, with its category, its HTTP status and the operations that return it. A buyer’s or member’s code renders on the brand’s own /docs/errors/<code>.

52 codes a call can answer with, and 31 gates check can fail. Every refusal takes one shape, on all four surfaces: Answers covers it, and next, the call that fixes it when one can.

Output
magic values: none

$ curl http://localhost:8787/jobs/job_0000
← 404 · {
  "type": "EMPTY",
  "category": "invalid_request",
  "code": "not_found",
  "reason": "No job job_0000.",
  "param": "id",

Every refusal’s type is its AXP envelope, the word an agent dispatches on: EMPTY for a 404, an id nothing has, and BLOCKED for every other no. Its category is the kind of no, and says whether the same call can ever work.

Each code renders on the brand’s own site at /docs/errors/<code>, the doc_url its refusal carries, in the brand’s words. A code more than three calls can answer shows their count; Operations names, for each call, every code it can answer.

invalid_request codes

CodeHTTPOperationsMeansFix
input_invalid42236 operationsThe order doesn't match the Service's input.Fill the fields next.fill names, then send next.
not_found40458 operationsNothing has that id.Read /.well-known/agents.json for the Services, and use the id an answer returned.
route_unknown404—No operation is served at that HTTP method and path.Read /openapi.json for every route, or /llms.txt for every operation.
body_invalid40046 operationsThe body isn't JSON.Send a JSON object with content-type: application/json.
version_unknown400every operationThis brand doesn't serve that Services-Version.Leave Services-Version out, or send one the answer names.
policy_invalid422service.order, job.again, job.policyA policy value is out of bounds; the reason lists each.Fix the values next.fill names.
evidence_required422clock.satisfyA clock closes on evidence on the record: a file, or a receipt or file the job already holds.Send evidence: a file { url, name }, or the id of a receipt (rcp_…) or the sha256 of a file the job holds.
event_id_required422event.inboundAn event that mints a job on a subscription is one occurrence: it needs your id for it.Send id: your own id for the event, such as the notice number. The same id sent again answers replayed: true and mints nothing more.
defects_required422task.send_backA send-back names its defects: what is wrong, for the step it returns to.Send defects, and to: the step it returns to, when it is not the one before.
memo_required422task.declineA decline carries a reasoned memo, which only the client reads.Send memo: why you decline. The decline is paid, and never scored.
evidence_missing422task.completeThe step completes on evidence items that are not all present.Capture each missing item the refusal names, then complete again.

conflict codes

CodeHTTPOperationsMeansFix
key_reused40915 operationsThat key was already sent with a different body.Send next: the same call under a fresh key. To get the first answer back, resend it with its original body.
not_waiting409job.send_back, job.approveThe job isn't waiting on a person.Read the job with get_job. Accept or send back a delivered one.
not_delivered409job.accept, job.send_backOnly a delivered job can be accepted or sent back.Wait for delivery with get_job.
not_cancelable409job.cancelThe job is already delivered. Send it back instead.Send it back with a note, and the AI redoes it.
nothing_to_redo409job.send_backThis job's work came from another Service that already delivered, so there's nothing to redo.Accept the job as delivered.
end_not_allowed409job.end, job.approve, task.attestThe job can't end that way now.Read the reason.
not_terminal409job.againOnly an ended job is ordered again.Wait for it to end, or cancel.
period_taken409service.order, job.againA job of this Service already holds the subject's period: one live or ended job per period.Send next: the follow-on the job's end offers, such as an amendment, ordered from that job. A canceled job frees its period.
evidence_used409clock.satisfyThat evidence closed another clock already: evidence closes one clock.Send what proves this clock itself. next reads the clock the evidence closed.
clock_closed4094 operationsThe clock is closed: it was satisfied, or its owner chose at its date.Read the clock with GET /clocks/:id: a closed clock takes no more calls. A recurring one brings its next occurrence when it is satisfied, and stays open.
clock_not_due409clock.chooseThe owner chooses at the clock's date.Read the clock with GET /clocks/:id: its rungs and its date. The choice opens at clock.due.
clock_moved_on409clock.ack, clock.satisfy, clock.chooseThe clock is at another occurrence than the due you sent: it moved, or recurred, since you read it.Send next: the same call, with due set to the date the clock is at now. Read it first if you need to decide again.
date_passed409job.approve, task.attestThe step is barred: a hard date on the job passed unsatisfied, and nothing moves it.Read the clock with GET /clocks/:id: its owner chooses among its lapse options. A charge that waits on a barred step never releases.
clock_behind409test_clock.advanceA test clock only moves forward, and that time is behind it.Send to: a time after frozen_at, or a span. Sending the time it reads already changes nothing.
clock_advancing409test_clock.advanceThe test clock is advancing already: one advance at a time.Wait for the advance in flight, then read the clock and send yours.
task_taken4099 operationsAnother member holds this Task, or has it offered to them first.Read your feed for the Tasks offered to you now.
needs_direction409task.attestA member declined, and only the client's direction moves the job on: another member, or an end.Hand the client the direct ask in next; nothing else moves it.
not_contestable409task.contestThere is no send-back on this attested work to contest, or it is already contested or ruled.Read the Task: a contest answers a send-back your attested work received, once.
job_ended4099 operationsThe job has ended, for good.Order it again with next.
question_open409task.messageA question to the client is out already, and their reply comes through the thread.Wait for the reply, or post a note: a note expects none.
ask_expired410ask.complete, ask.reissueThis ask expired.Hand over the new link in next.
ask_voided410ask.complete, ask.reissueThis link no longer works: used, reissued or voided.Use the link in next.
signature_void409ask.completeWhat was signed changed past its tolerance.Sign the new version in next.

authentication codes

CodeHTTPOperationsMeansFix
key_missing40138 operationsNo key: send Authorization: Bearer sk_test_….Send the key dev printed, as Authorization: Bearer sk_test_….
key_invalid40138 operationsThat key isn't one of this brand's.Send the key dev printed, as Authorization: Bearer sk_test_….

blocked codes

CodeHTTPOperationsMeansFix
needs_a_person40332 operationsA person approves and signs, in the app. A key or a tool never can.Wait for the job with get_job; it carries on once the person acts.
merits_not_yours403job.policyOnly the client sets the merits.Ask the client to set it through their own call, POST /jobs/:id/policy, with their key.
needs_the_owner403clock.ack, clock.satisfy, clock.chooseOnly the clock's owner can do this: acknowledge it, satisfy it, or choose at its date.Hand the clock to its owner: next is where they act on it.
needs_grant403job.approveA grant this step needs isn't live: not given yet, expired or revoked.Hand the party the grant link in next; the step runs once they grant it.
ineligible4035 operationsThe member can't take this Task: the answer names the first eligibility predicate they fail, and its cure.Read predicate and cure. A credential, a region or coverage is cured at /join and by the verifier; availability by setting it on.
not_cleared4035 operationsThe packet opens only to the member who claimed the Task and cleared it.Claim the Task, then clear it: attest each statement on its sheet.
not_on_site403task.arrive, task.completeThe check-in is outside the site radius, or outside the window's early and late marks.Check in from the site, inside the window. The refusal names the distance and the time.
reserved403task.attestThe rules reserve this act to a credential the person who attested doesn't hold. Nothing was charged.A person who holds reserved_to attests it, in the region the rule names. The refusal names the act, who it is reserved to and the row it cites.
act_refused403service.orderThe rules refuse this act here: it is never performed by this brand. Nothing was charged.Follow cure.route: the act is performed there, never here. The refusal names the act and the row it cites.
talk_off403job.message, job.thread, task.messageThis Service's jobs have no thread: its talk is off.Reach the brand another way, or order a Service whose talk is on.
needs_the_party4036 operationsOnly the party can do this, through their own link.Hand them the link in next.

guard codes

CodeHTTPOperationsMeansFix
guard_refused422job.approve, task.attestA guard refused the output, and says why.Fix that value; the step stays open.

unavailable codes

CodeHTTPOperationsMeansFix
not_live403service.order, job.againThis Service takes no orders yet.Join the waitlist in next.
region_not_ratified403service.orderThe rules don't ratify this act in the job's region yet. Nothing was charged.Join the waitlist in next, and you hear when the region is ratified.
brand_unverified403service.orderA credential the brand itself holds is unverified or stale, so the act it covers waits. Nothing was charged.Join the waitlist in next, and you hear when the brand's verifier renews it.

api_error codes

CodeHTTPOperationsMeansFix
api_error500every operationSomething failed on our side.Send the same call again with the same Idempotency-Key; quote the request_id if it fails twice.

Every refusal carries the one shape. These codes add fields of their own, typed on the code, so e.code === 'ineligible' narrows to its predicate and its cure. Each is typed on its code, then shown as a call answers it. A field marked ? can be left out.

not_on_site fields

A check-in or a check-out outside the site's radius, or outside the window's marks.

FieldType
distance_mnumber
within_mnumber
window{ from: string; to: string }

reserved fields

A reserved act a person who doesn't hold its credential tried to perform.

FieldType
actstring
reserved_tostring
ruleRuleRef

act_refused fields

An act the rules refuse here, ordered by name or performed by a Service: where it is performed instead.

FieldType
actstring
ruleRuleRef
cure{ route: string | null }
captured/legal-refused.txt · 403 · magic values: none
→ POST /matters {"service":"litigate","max_usd":500,"key":"sue-initech"}

ineligible fields

A member who can't take a Task: the first predicate they fail, what it needs, what they hold, the cure in words, and in next the call that cures it (none for conflict or separation, by design).

FieldType
predicatePredicate
needsstring
holdsstring
curestring
captured/people-refusals.txt · 403 · ineligible · magic values: member = mbr_out_of_region, member = mbr_lapsed_coverage, member = mbr_eligible
→ POST /reviews/tsk_7Hq2/claim {}   # as mbr_out_of_region

region_not_ratified fields

A reserved act outside the regions its row is ratified in.

FieldType
actstring
regionstring | null
regionsreadonly string[]
ruleRuleRef
captured/legal-region.txt · 403 · magic values: none
→ POST /matters {"service":"contract-review","contract":{"url":"data:text/plain,A%20lease.","name":"lease.pdf"},"client":{"name":"Ada Lovelace","email":"ada@example.com"},"client_region":"US-FL","max_usd":99,"key":"lease-fl"}

brand_unverified fields

An act under a credential the brand holds while that credential is unverified or stale.

FieldType
actstring
credentialsreadonly string[]
ruleRuleRef
captured/brand-credential.txt · 403 · magic values: metadata.sandbox.brand = verified, metadata.sandbox.brand = stale
→ POST /jobs {"service":"extension","year":2025,"max_usd":25,"key":"stale","metadata":{"sandbox":{"brand":"stale"}}}

needs_the_party fields

Only the party can do it: their own link, or their own signed-in session, in next.

FieldType
party?string
captured/hand-to-person.txt · 403 · magic values: none
→ POST /asks/ask_7Hq2 {"items":{"terms":{"answer":"Lessee"}}}   # its key, without the link

period_taken fields

The subject's period is held: the subject, the period, the job that holds it, and the follow-on Services its end offers.

FieldType
subjectstring
periodstring
jobstring
followreadonly string[]
captured/period-tabs.txt · 409 · magic values: none
$ curl -X POST http://localhost:8787/glossary -H 'content-type: application/json' -d '{"account":"acme","year":"2025","terms":["Premises"],"max_usd":19,"key":"glossary-2025-again"}'   # a second order for 2025

rule fields

A refusal the rules bring names its row in rule, a RuleRef, printed as rules <version> · <row>. Objects shows it inside a body.

FieldType
versionstring
atstring
positionstring
cite?readonly string[]

The rest of the codes a member’s session or a client’s link meets, each as a real run answered it: its frame is titled with its code, and its body is whole on "Show all".

captured/people-refusals.txt · 403 · not_cleared · magic values: member = mbr_out_of_region, member = mbr_lapsed_coverage, member = mbr_eligible
→ GET /reviews/tsk_7Hq2/packet   # as mbr_eligible, before clearing it
captured/people-refusals.txt · 409 · task_taken · magic values: member = mbr_out_of_region, member = mbr_lapsed_coverage, member = mbr_eligible
→ POST /reviews/tsk_7Hq2/claim {}   # as mbr_lapsed_coverage, once mbr_eligible holds it
captured/people-refusals.txt · 422 · memo_required · magic values: member = mbr_out_of_region, member = mbr_lapsed_coverage, member = mbr_eligible
→ POST /reviews/tsk_7Hq2/decline {}   # as mbr_eligible: a decline with no memo
captured/people-refusals.txt · 422 · defects_required · magic values: member = mbr_out_of_region, member = mbr_lapsed_coverage, member = mbr_eligible
→ POST /reviews/tsk_7Hq2/send_back {}   # as mbr_eligible: a send-back with no defects
captured/people-refusals.txt · 409 · needs_direction · magic values: member = mbr_out_of_region, member = mbr_lapsed_coverage, member = mbr_eligible
→ POST /matters/job_7Hq2/cancel   # the buyer, once a member declined

A failing gate exits 1 and prints its code in check --json. All 31, each one's meaning, its fix and its failing file, are on check’s gates.

Before any brand answers, npx services.dev can fail on its own. With --json, or SERVICES_DEV_JSON=1, each prints the same shape with one of these codes, its doc_url this page's anchor. The exit code is the code's, so an agent branches on it without reading the words.

CodeCategoryExitMeans
usageinvalid_request2The command is missing something it needs.
unknown_commandinvalid_request2No command by that name.
not_runningapi_error10Nothing is running at that URL.
not_a_brandinvalid_request2This folder has no Services, or one fails to load.

A refusal from a brand exits by its category: invalid_request 3, authentication 4, blocked 5, unavailable 7, conflict 6, guard 6, rate_limited 10, api_error 10. A failing check exits 1, and usage 2. The CLI lists every command.