Buyer, client, party

The running jobjob_7Hq2 · waiting · on approval · $49.00 held

The buyer pays and holds the key. A party is a person the work is for or about, named in the input, who acts only through their own single-use link. The buyer can be the client, or order for one.

Who is a job for, and who may act on it? Two different people, often.

The buyer orders and pays. They hold the key (sk_test_ on localhost), and their key, or their agent, reads the job, accepts it, sends it back or cancels it.

A party is a person the input names with the type word party: a client, an applicant, a recipient, the founders. A party never holds a key. Each act the work needs of them is an ask, opened to them alone, through a hosted link that works once and needs no account. The buyer can be the client, ordering for themselves, or order for a client who acts through their own links.

The buyerA party
Iswhoever orders and paysa person the input names, as party or party[]
Holdsa key, or an agent with onea link per ask, single-use, that expires and can be reissued
Canorder, read, accept, send back, cancel, endconsent, answer, upload, sign, decide, name who does a declined step
Neversign, consent or decide for a partysee the brand's internals or a member's contact

A Service whose Pool shows parties to its members asks the client's consent before any member reads the matter. A sandbox party who signs consents at once; one who declines ends the job at $0:

Call
→ POST /private-translation {"document":"memo.pdf","to":"de","client":{"name":"Ada Lovelace","email":"signs@example.test"},"max_usd":59,"key":"consents","metadata":{"sandbox":{"asks":{"register":"informal"}}}}
magic values: client.email = signs@example.test, metadata.sandbox.asks = { register: informal }, client.email = declines@example.test
← job_7Hq2 · delivered · memo.de.pdf · $59.00 charged
  record  consent · client · consent | register · client · decide · decided informal | translate · ai | review · ai · pass
  ledger  +$59.00 · AI $0.84 · you $58.16
Call
→ POST /private-translation {"document":"memo.pdf","to":"de","client":{"name":"Ada Lovelace","email":"declines@example.test"},"max_usd":59,"key":"declines"}
magic values: client.email = signs@example.test, metadata.sandbox.asks = { register: informal }, client.email = declines@example.test
← job_7Hq3 · ended · declined · $0
  record  declined · ended · Ada Lovelace declined consent.
  ledger  you $0.00

When the buyer is the client, their consent is the session that ordered, and no link is sent. sheet_without_consent fails a Pool whose sheet names parties with no consent ask ahead of the first role step.

A key, the owner or an agent that tries a party's act is refused needs_the_party, and handed the link to pass on:

API
curl -X POST http://localhost:8787/jobs/job_7Hq3/accept -H 'content-type: application/json' -d '{}'
403 · magic values: none
{
  "type": "BLOCKED",
  "category": "blocked",
  "code": "needs_the_party",
  "reason": "sign waits on Ada Lovelace to sign. Only they can, through their own link. Hand them the link in next.",
  "param": "ask_7Hq2",
  "party": "Ada Lovelace",
  "next": {
    "do": "hand_to_person",
    "url": "http://localhost:8787/a/ask_7Hq2?t=cHGjprSn08ODyOp_8zLIVH",
    "arguments": {
      "ask": "ask_7Hq2"
    },
    "party": {
      "name": "Ada Lovelace",
      "email": "ada@example.com"
    },
    "to": "sign",
    "expires_at": "2026-11-01T14:02:11.000Z",
    "tool": null,

An agent ordering for a person reads the same next, hand_to_person with the link, on every surface, and never the act itself.

PatternWho paysWho acts as the party
The client orders for themselvesthe clientthe client: their consent is the session that ordered
A buyer or their agent orders for a clientthe buyerthe client, through each link the buyer hands on
A reseller orders for its customerthe reseller, with a tenant keyits customer, through the same links

The party's links, their reminders and expiry are in Ask the buyer. What a member may learn of a party, and when, is in What a member sees.