Objects
Every prefixed id a brand hands out, what it names and the fields it carries, then each live object as a real run served it.
16 objects. Every id a brand hands out starts with its object's prefix. Every object carries the same envelope, and a yes marks each envelope field it carries.
| Prefix | Object | What it is | id | object | livemode | metadata | Explained in |
|---|---|---|---|---|---|---|---|
job_ | job | a job | yes | yes | yes | yes | — |
stp_ | step | a step run on a job | yes | yes | — | — | — |
tsk_ | task | a Task: a role step a Pool fills, at a fee fixed at post, open, held, claimed and done | yes | yes | yes | — | Tasks: offered, never assigned, The packet |
ask_ | ask | an ask: a party acts through its hosted, single-use link | yes | yes | yes | — | Ask the buyer, 'Asks: a ceremony without an account' |
sbj_ | subject | a subject: what outlives the job, keyed by an input or a receipt, with its jobs, its history, its kept facts, its periods and who is of record | yes | yes | yes | — | Subjects, Of record |
clk_ | clock | a clock: a date the world sets on a job or its subject, who answers for it, its rungs, what moves it and the owner's choice at the end. Its owner acknowledges it, satisfies it on evidence and chooses at its date | yes | yes | yes | — | Clocks |
msg_ | message | a message in a job's thread: who said it, what it answers, its status (sent, held, adopted, declined), and its words, which the client reads | yes | yes | yes | — | — |
sbn_ | subscription | a subscription: standing work charged once per cycle, its schedule and events minting jobs that share its subject and policy, and its allowances used and included, reset at renewal. sbn_, not sub_, so it never reads as a subject (sbj_) | yes | yes | yes | yes | Subscriptions, Schedules and triggers |
evt_ | event | an event: one record fact in the brand's ordered feed, with its seq, as its audience sees it | yes | yes | yes | yes | — |
wh_ | watch | a watch: a webhook endpoint, with its whsec_ secret, its events and its deliveries | yes | yes | yes | — | — |
mbr_ | member | a member: a person in a Pool, their application, what the verifier wrote and their availability; never their ledger | yes | yes | yes | yes | — |
po_ | payout | a payout: a member's pay leaving for their account on the Pool's schedule | yes | yes | yes | yes | — |
ch_ | charge | a charge: the buyer's payment for a job, held until its release fact, then captured | yes | yes | yes | yes | — |
rcp_ | receipt | an outside receipt: a submission's status, codes, number and file | yes | yes | yes | — | File it somewhere, Sending to outside systems |
dlg_ | delegated_key | a delegated key: a party's grant to an agent, scoped by Service and time | yes | yes | yes | — | — |
tc_ | test_clock | a test clock: the time every job on it reads, frozen until advanced, only ever forward | yes | yes | yes | — | On a test clock |
tmr_ | timer | a timer: one kind of time, owed once, with its key, its state, owed and fired times, attempt, wakes and the version it was armed under | yes | yes | yes | — | Every timer is on the record |
Each object: its fields, then the object as a brand serves it. A field marked ? can be left out.
The envelope
What these fields mean, on every object that carries them:
| Field | Says |
|---|---|
id | Its id, starting with its object’s prefix. |
object | The object’s name, such as clock: what an agent dispatches on. |
livemode | true for an object a live key made, false for a test key's. |
created | When it was made, an ISO 8601 instant. |
simulated | true: every answer in the sandbox says so. |
job
The canonical job, mid-flight and as a buyer reads it: waiting, on signature, its payment held. Each of its 4 steps is a step object.
| Field | Type | Says |
|---|---|---|
id | JobId | — |
object | 'job' | — |
created | string | When it was ordered. |
livemode | boolean | False on localhost and with a test key: no real money moves. |
simulated | true | Every answer in the sandbox says so. |
service | string | — |
The status narrows the rest: waiting adds on and waiting, delivered and accepted add output and final_at, canceled adds reason, and ended adds end and output. A buyer never reads record: their surfaces strip it, and expand[]=timeline adds timeline.
$ curl http://localhost:8787/jobs/job_7Hq3 # input, price and next left out; a buyer never reads the record
{
"id": "job_7Hq3",step
A step run on a job.
| Field | Type | Says |
|---|---|---|
id | stp_${number} | — |
object | 'step' | — |
step | string | — |
by | string | ai, code, url, service, or a person's role. |
review? | Review | — |
lenses? | number | — |
task
A Task: a role step a Pool fills, at a fee fixed at post, open, held, claimed and done.
| Field | Type | Says |
|---|---|---|
id | TskId | — |
object | 'task' | — |
livemode | false | — |
pool | string | — |
role | string | — |
status | TaskStatus | — |
A member reads a Task as its teaser until it is theirs: fields holds only what the Pool’s sees.teaser names, never a party. The sheet, the packet and the owner’s read are the same Task with more: The packet below, and GET /owner/tasks/:id.
→ GET /reviews/tsk_7Hq2 # as mbr_eligible: the teaser
{
"id": "tsk_7Hq2",ask
An ask: a party acts through its hosted, single-use link.
| Field | Type | Says |
|---|---|---|
id | AskId | — |
object | 'ask' | — |
job | JobId | — |
step | string | — |
to | AskAct | — |
party | Asked | — |
$ curl http://localhost:8787/asks/ask_7Hq2
{
"id": "ask_7Hq2",subject
A subject: what outlives the job, keyed by an input or a receipt, with its jobs, its history, its kept facts, its periods and who is of record.
| Field | Type | Says |
|---|---|---|
id | SbjId | — |
object | 'subject' | — |
livemode | false | — |
kind | string | What it is, in the Service's words: its subject.kind, such as 'taxpayer'. |
key | { field: string; value: string } | The input or receipt field that names it, and its value: { field: 'ein', value: '12-3456789' }. |
created | string | — |
→ GET /subjects/sbj_7Hq2
{
"id": "sbj_7Hq2",clock
A clock: a date the world sets on a job or its subject, who answers for it, its rungs, what moves it and the owner's choice at the end. Its owner acknowledges it, satisfies it on evidence and chooses at its date.
| Field | Type | Says |
|---|---|---|
id | ClkId | — |
object | 'clock' | — |
livemode | false | — |
name | string | Its key under the Service's clocks, such as file. |
service | string | The id of the Service whose clocks declare it. |
job | JobId | The job that opened it, or the last one to move or satisfy it. |
$ npx services.dev clocks get clk_7Hq2 --json
{
"id": "clk_7Hq2",subscription
A subscription: standing work charged once per cycle, its schedule and events minting jobs that share its subject and policy, and its allowances used and included, reset at renewal.
| Field | Type | Says |
|---|---|---|
id | SubId | — |
object | 'subscription' | — |
livemode | false | — |
service | string | The id of the Service ordered, whose price has every. |
status | SubscriptionStatus | active; canceling once canceled, minting until its paid cycle ends; then canceled. |
subject | SbjId | null | The subject every minted job shares, sbj_…, or null. |
$ curl http://localhost:8787/subscriptions/sbn_7Hq2
{
"id": "sbn_7Hq2",event
An event: one record fact in the brand's ordered feed, with its seq, as its audience sees it.
| Field | Type | Says |
|---|---|---|
id | EvtId | — |
object | 'event' | — |
seq | number | Its place in the brand's feed: every event has a higher seq than the one before. |
type | T | — |
created | string | — |
job | JobId | null | — |
$ npx services.dev events list after=0 limit=2
{
"type": "OK",watch
A watch: a webhook endpoint, with its whsec_ secret, its events and its deliveries.
| Field | Type | Says |
|---|---|---|
id | WhId | — |
object | 'watch' | — |
url | string | — |
events | readonly string[] | Event names, or * for every one the buyer receives. |
status | 'enabled' | — |
secret? | Secret | — |
$ npx services.dev watches create https://hooks.example.test/lingua events=job.delivered
{
"id": "wh_1rKV5VS8V3",member
A member: a person in a Pool, their application, what the verifier wrote and their availability; never their ledger.
| Field | Type | Says |
|---|---|---|
id | MbrId | — |
object | 'member' | — |
livemode | false | — |
pool | string | — |
email | string | — |
join | { step: number; of: number; next: string[]; done: boolean } | The /join funnel: the step reached, of how many, the fields the next one asks, and whether it's done. |
verified is the verifier’s latest write, read against the clock now: each write replaces the last, and fresh turns false past the Pool’s fresh. Verify a member walks it.
→ POST /attorneys/join {"email":"grace@hopper.example","answers":{"name":"Grace Hopper","credential":"patent agent","number":"71,234","regions":["US-CA"],"areas":["patents"],"hours":10,"turnaround":"24h","min_fee":120}} # the applicant, in one call
{
"id": "mbr_7Hq2",receipt
An outside receipt: a submission's status, codes, number and file.
| Field | Type | Says |
|---|---|---|
id | RcpId | — |
object | 'receipt' | — |
job | JobId | — |
step | string | — |
to | string | The outside system, by the name the step gives it. |
at | string | When it's filed. A repair resubmitted inside perfect keeps the first submission's time. |
$ curl -s http://localhost:8787/jobs/job_7Hq2 | jq '.receipts[0]'
{
"id": "rcp_7Hq2",test_clock
A test clock: the time every job on it reads, frozen until advanced, only ever forward. Moving one backward answers 409 test_clock_backward, and deleting one voids every job on it.
| Field | Type | Says |
|---|---|---|
id | TcId | — |
object | 'test_clock' | — |
frozen_at | string | The time the clock reads. |
status | 'ready' | 'advancing' | advancing while an advance runs, ready once every timer owed by then has fired, with test_clock.ready on the feed. A second advance waits for it to finish, answered 409 clock_advancing. |
advancing_to? | string | Where a running advance is going. |
default? | true | The dev server's own clock: it follows the wall clock, ahead by its advances. Every job not on another clock is on it. |
Objects a call answers with that carry no id of their own: what a member reads and signs, what the gate freezes, what a buyer is offered, and where a refusal’s rule sits.
packet
What a member reads once they claimed and cleared a Task, and what their attestation binds: the AI’s artifacts with their versions and what changed, the review reports, the client’s answers, the checklist, the record, the signals, the clock and the hash.
| Field | Type |
|---|---|
object | string |
task | string |
job | string |
service | string |
step | string |
act | string |
summary | string |
input | object |
sheet | object |
artifacts | list |
reviews | list |
answers | list |
checklist | list |
stamps | boolean |
record | string |
signals | list |
clock | object |
hash | string |
simulated | boolean |
→ GET /reviews/tsk_7Hq2/packet # as mbr_eligible: the packet
{
"object": "packet",Explained in The packet, What a person can do.
attestation
What the gate freezes on the record when a person attests: who, the credential the verifier holds for them, the region, the hash of what they signed, the rules version the job pinned, and the checklist they affirmed.
| Field | Type | Says |
|---|---|---|
member | string; credential: string; region: string | null; hash: Hash; rules: string; fields?: readonly string[]; affirmed?: readonly string[] | — |
reservation? | { path: string; sha256: Hash } | Attested, qualified: the reservation the member wrote, kept as its own file, which travels with the output. |
Explained in What a person can do, Rules: how a Service meets licensing by design.
offer
A buyer’s answer when the price is over their max or their key’s cap: the price, its sentence and terms, and the exact next call.
| Field | Type | Says |
|---|---|---|
type | 'OFFER' | — |
object | 'offer' | — |
service | string | — |
title | string | — |
price | { usd: number; approved_usd?: number; sentence: string } | — |
eta | Within | — |
$ curl -X POST http://localhost:8787/jobs -H 'content-type: application/json' -d '{"service":"certified-translation","document":{"url":"https://example.com/lease.pdf","name":"lease.pdf"},"to":"fr","country":"FR","max_usd":189,"key":"lease-fr-3"}'
← 402 · {
"type": "OFFER",Explained in 'Answers: OK, EMPTY, OFFER, BLOCKED'.
rule_ref
Where a refusal’s rule sits: the rules table’s version, the row, the position counsel gives for it, and what the row cites.
| Field | Type |
|---|---|
version | string |
at | string |
position | string |
cite? | readonly string[] |
→ POST /matters {"service":"litigate","max_usd":500,"key":"sue-initech"}
{
"type": "BLOCKED",Explained in Rules: how a Service meets licensing by design, Refusals and cures.