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.
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.
Send next: the same call under a fresh key. To get the first answer back, resend it with its original body.
not_waiting
409
job.send_back, job.approve
The job isn't waiting on a person.
Read the job with get_job. Accept or send back a delivered one.
not_delivered
409
job.accept, job.send_back
Only a delivered job can be accepted or sent back.
Wait for delivery with get_job.
not_cancelable
409
job.cancel
The job is already delivered. Send it back instead.
Send it back with a note, and the AI redoes it.
nothing_to_redo
409
job.send_back
This job's work came from another Service that already delivered, so there's nothing to redo.
Accept the job as delivered.
end_not_allowed
409
job.end, job.approve, task.attest
The job can't end that way now.
Read the reason.
not_terminal
409
job.again
Only an ended job is ordered again.
Wait for it to end, or cancel.
period_taken
409
service.order, job.again
A 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_used
409
clock.satisfy
That evidence closed another clock already: evidence closes one clock.
Send what proves this clock itself. next reads the clock the evidence closed.
clock_closed
409
4 operations
The 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_due
409
clock.choose
The 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_on
409
clock.ack, clock.satisfy, clock.choose
The 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_passed
409
job.approve, task.attest
The 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_behind
409
test_clock.advance
A 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_advancing
409
test_clock.advance
The test clock is advancing already: one advance at a time.
Wait for the advance in flight, then read the clock and send yours.
task_taken
409
9 operations
Another member holds this Task, or has it offered to them first.
Read your feed for the Tasks offered to you now.
needs_direction
409
task.attest
A 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_contestable
409
task.contest
There 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_ended
409
9 operations
The job has ended, for good.
Order it again with next.
question_open
409
task.message
A 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_expired
410
ask.complete, ask.reissue
This ask expired.
Hand over the new link in next.
ask_voided
410
ask.complete, ask.reissue
This link no longer works: used, reissued or voided.
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.
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).
Field
Type
predicate
Predicate
needs
string
holds
string
cure
string
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
→ 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"}
$ 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
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
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.
Code
Category
Exit
Means
usage
invalid_request
2
The command is missing something it needs.
unknown_command
invalid_request
2
No command by that name.
not_running
api_error
10
Nothing is running at that URL.
not_a_brand
invalid_request
2
This 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.