Liberty

Demo — not real money

Agent Settlement

Payer 0 credits

Agent 0 credits

Escrow and credits for agent jobs.

What's new

Shipped Settlement slices. Dates and titles only — no user counts, no revenue. Full list: /api/changelog.json.

Loading recent ships…

Scoreboard

Challenge evidence. Zeros stay zeros. Listings are not users. Machine-readable: /api/scoreboard.json.

Loading honest zeros…

Integrate

Human walk of the machine-readable Settlement quickstart. Fetched from /api/quickstart.json — not a second step list. Crawlers can start at /.well-known/agents.json or the fuller brief /llms-full.txt. Dry-check a body first on /#validate with POST /api/v0/validate — same rules, no commit. Preview the cut on /#quote with POST /api/v0/quote — create / fund / topup, honest fee display, no commit. Validate a quote body against /api/schemas/quote.json before calling POST /api/v0/quote. A quote is not an invoice and not proof of payment. Validate a simulate body against /api/schemas/simulate.json before calling POST /api/v0/simulate. Validate a downloaded simulate walk against /api/schemas/simulate-walk.json before importing it on /#simulate. Local demo export / restore only. Not an audit ledger. Not custody proof. Not network sync. Validate a verify body against /api/schemas/verify.json before calling POST /api/v0/verify. A verify is not custody. Handle failures from /api/errors.json (live codes only, including hold_expired). Browse that same catalog on /#errors. Validate a shared receipt against /api/schemas/receipt.json before trusting the link. Validate a shared job handoff against /api/schemas/handoff.json before trusting the link. Client-held demo. Liberty does not move real money. Receipts are not proof of payment. Handoffs are not custody transfers. Honest zeros: /#scoreboard. Copy-ready curls also on /#adapters. Copied curls use this page’s origin. Demo only. money: false. Not a production integration guarantee.

Loading the demo escrow walk…

Demo wallets

Two-sided demo money in this browser only. Payer credits fund escrow. A payer top-up POSTs /api/v0/quote with action: topup and shows the 5% markup before adding credits_received here. A successful release credits the agent wallet by agent_payout. Dispute refunds the payer and does not credit the agent. Both balances are localStorage — not real money, not custody. No payment API.

Payer

Demo top-up markup is 5% rounded, added on top of the amount. The quote shows charged vs received before anything is added. Only received credits land in this browser. No payment. Fill from quote copies the last successful top-up quote in this tab into this amount and shows the already-quoted charged vs received. Fill from fee preview copies the last successful top-up preview from /#fees the same way. Confirm still required — this does not add credits. A quote is not an invoice and not proof of payment. Liberty does not store that quote. Demo only. money: false.

Agent

Optional demo top-up. Same localStorage-only credits as the payer wallet (liberty.agent-settlement.agent-credits.v0).

Demo pack

Download this browser’s Settlement state as one JSON file — payer credits and jobs, agent credits, receipts, and the demo API key if one is already stored here. Import replaces that localStorage (does not merge). Reset demo clears those known Settlement keys only, after confirm. Other localStorage is left alone. Stays in this browser. Liberty never receives the file. Demo only — money: false.

The file may contain the raw demo API key if you minted one here. Treat it like a password. Do not email it or commit it.

Settlement ledger

Running totals for this browser only. Reads the Settlement localStorage already on this page — jobs, receipts, payer credits, and the agent wallet. Liberty does not persist a ledger. Demo only — money: false. Not real money. Not live GMV.

No stored receipts yet. Totals stay at zero until this browser has a release or dispute.

Activity

Append-only list of local demo actions in this browser — create, fund, submit, release, dispute, simulate, validate, verify, callback attempts, and demo pack import / export / reset. Newest first. Last 80. Hold expiry appears when a fund or simulate stamped expiresAt. Idempotency-Key appears when create or simulate sent one. Last callback attempt (host, HTTP status or error class, signature presence) appears when a job had callback_url. Optional callback_secret is never logged in full. After a successful simulate, Export last walk downloads that walk as JSON from this browser — local demo export only, not an audit ledger, not custody proof. Import walk JSON restores a previously exported file into this browser so you can re-inspect transitions, quotes, and receipts without re-running simulate. Local demo restore only — not an audit ledger, not custody proof, not network sync. After a simulate or a live release/dispute, Copy last share card copies a small local demo summary (title, settlement id, final state, fee totals already on screen, timestamps) — local demo summary only, not an audit ledger, not custody proof, not proof of external users. Never includes callback_secret. Liberty never receives this log. Demo only — money: false.

No local demo actions yet. Create, simulate, validate, verify, or export a pack to see them here.

Create job

Pick a template to fill title, amount, and criteria. Does not create or fund. Demo — not real money. Same fields: /api/templates.json. Fill from examples pastes live create fields from /api/examples.json (validate / quote create, the transition create step, or simulate create fields). Liberty does not invent examples. Fill from last error copies title / amount / criteria from the last failed quote / fee-preview / validate / verify in this tab. After a successful create — Apply create-ok to simulate copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key that create actually returned or sent) into /#simulate. Fill only — does not simulate, create, fund, or commit. Confirm still required. A fill is not a create and not a walk. Never copies callback_secret or a previous as_ job id.

Optional correlation id from your agent. Independent of Liberty’s as_… job id and of Idempotency-Key. Max 128 characters. Templates leave this blank.

Optional URL your adapter owns. Stamped on the job and receipt so your client can notify itself after release or dispute. Liberty never fetches or calls this URL. https only. Max 512. Templates leave this blank. Jobs with a callback URL show a last callback attempt panel — host, HTTP status or error class, timestamp — stored in this browser only. A browser POST is often blocked by CORS. Not reliable delivery.

Optional callback_secret. Stays in this tab only. Never sent to Liberty servers. Never logged in full. Not in the demo pack. When set, a would-POST or browser POST attaches X-Liberty-Signature: sha256=<hex> — HMAC-SHA256 over the canonical JSON notify body (object keys sorted). The signature is only useful to adapters that receive the body. Browsers often CORS-block the POST. No server-side signing ledger. Demo only — not real money.

Optional. Sent as the Idempotency-Key HTTP header. Same key plus same title, amount, and criteria yields the same as_… create id. Liberty is still client-held and stateless — the key only stabilizes create ids for retries. No server replay ledger. Demo only — not real money.

Fill from examples pastes live create fields from /api/examples.json. Liberty does not invent examples. Fill only — does not create, fund, add credits, or persist. Confirm still required. A fill is not a create. Never copies callback_secret.

Copy as curl builds a ready-to-run POST /api/v0/transition against this page’s origin. Optional Idempotency-Key is included only if you filled it. callback_secret stays in this tab — never invented, never placed on the Liberty request. Dry-check the same fields on /#validate before create. Fill from validate copies ok fields from the last dry-check in this tab into this form — fill only, no create or fund. Quote the same fields on /#quote. Fill from quote copies title / amount / criteria from the last successful create quote in this tab — fill only, no create or fund. Fill from fee preview copies title / amount / criteria from the last successful create or release preview on /#fees (preview defaults: Fee preview / preview) — fill only, no create or fund. Fill from last walk copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key the last walk actually returned or sent) from the last imported or run /#simulate walk, or from the last create-shaped /#quote, /#fees, or /#validate request in this tab — including a failed walk that still had real fields. Fill from last error copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key the last failed /#quote, /#fees, /#validate, or /#verify actually exposed) from that last failed walk in this tab. After a successful create — Apply create-ok to simulate copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key that create actually returned or sent) into /#simulate. Fill only — does not simulate, create, fund, or commit. Confirm still required. A fill is not a create and not a walk. Successful walks stay rejected for last-error. Failed / error receipts stay rejected for create-ok. Empty or nonsense last-error or last-create payloads stay rejected. Never copies callback_secret or a previous as_ job id. Fee-preview defaults are copied when that was the last walk. A quote is not an invoice and not proof of payment. Liberty does not store that quote, the last walk, the last error, or the last create-ok. Demo only. money: false. Not a production integration guarantee.

Validate a draft

Paste a create / fund / submit / release / dispute body and POST /api/v0/validate. Same engine and JSON Schema as POST /api/v0/transition. Validate the body against /api/schemas/transition.json. A valid body returns ok: true and validated: true — no apply, no persist, no job id. Schema errors are 400 with kind: schema. State errors are 409 with kind: state. Look up those codes on /#errors (from /api/errors.json). Look up last error copies the last failed validate in this tab into that catalog (code, plus kind / route). Look-up only — does not invent a failure. action: topup is rejected. Non-create actions must include the client-held job — Liberty does not look jobs up. Fill from quote copies title / amount / criteria from the last successful create quote on /#quote into a create body. Fill from fee preview copies title / amount / criteria (preview defaults: Fee preview / preview) from the last successful create or release preview on /#fees into a create body. Fill from last walk copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key the last walk actually returned or sent) from the last imported or run /#simulate walk, or from the last create-shaped /#quote, /#fees, or /#validate request in this tab — including a failed walk that still had real fields — into a create body. Fill from last error copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key the last failed /#quote, /#fees, /#validate, or /#verify actually exposed) from that last failed walk in this tab into a create body. Fill only — does not validate, create, fund, or commit. Confirm still required. A fill is not a validate. Successful walks stay rejected. Empty or nonsense last-error payloads stay rejected. Never copies callback_secret or a previous as_ job id. A quote is not an invoice. A fee preview is not an invoice. After a successful dry-check — or when other fields are ok — Apply ok fields to create copies those fields into /#create. Fill only — does not create or fund. Never copies callback_secret. Copy as curl builds that same POST from the current paste against this page’s origin. Demo only — not real money. money: false. Not a production integration guarantee. Liberty does not store what you paste. Liberty does not store the last walk. Liberty does not store the last error.

Fill from examples pastes a live validate body from /api/examples.json. Liberty does not invent examples. Fill only — does not validate, create, fund, or commit. Never copies callback_secret.

Quote a fee

Paste a create / fund / topup body (submit / release / dispute also work) and POST /api/v0/quote. Same fee engine as POST /api/v0/transition. Validate the body against /api/schemas/quote.json. A quote is not an invoice and not proof of payment. Create quote has no durable id. Top-up returns credits_charged vs credits_received — apply credits_received locally; this page does not add credits. Fill from fee preview pastes the last successful /#fees preview body. After a successful quote — Apply quote fields to create copies title / amount / criteria (and optional client_ref / callback_url) into /#create. Apply quote fields to simulate copies title / amount / criteria into /#simulate. Apply create-ok to simulate copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key the last successful create or this quote-ok actually returned or sent) into /#simulate. Apply quote fields to validate copies title / amount / criteria into /#validate as a create body. Apply quote fields to verify copies the quoted receipt from a successful release or dispute quote into /#verify. Apply top-up quote to wallet prefills /#wallet and shows the already-quoted charged vs received. Fill only — does not create, fund, simulate, validate, verify, or add credits. Confirm still required to run the walk, dry-check, or top-up. A fill is not a walk. A fill is not a validate. A fill is not a verify. Failed / error receipts stay rejected for create-ok. Top-up and verify-only receipts stay rejected. Never copies callback_secret or a previous as_ job id. Schema errors are 400. State errors are 409 (insufficient_credits, illegal_transition, hold_expired). Look up those codes on /#errors (from /api/errors.json). Look up last error copies the last failed quote in this tab into that catalog (code, plus kind / route). Look-up only — does not invent a failure. Non-create job actions must include the client-held job — Liberty does not look jobs up. Copy as curl builds that same POST from the current paste against this page’s origin. Demo only — not real money. money: false. Not a production integration guarantee. Liberty does not store what you paste.

Fill from examples pastes a live quote body from /api/examples.json. Liberty does not invent examples. Fill only — does not quote, create, fund, or add credits. Never copies callback_secret.

Error catalog

Browse and search the live codes from /api/errors.json. Same list the engines return — schema vs state vs http, including hold_expired. A listed code is not a failure on this page. Deep-link /#errors/<code>. Fill from last walk copies the last failed /#quote, /#fees, /#validate, or /#verify error in this tab (code, plus kind / route when the walk returned them). Apply last walk to simulate copies title / amount / criteria (and other real create fields) from that last create-shaped walk — or from the last imported /#simulate walk — into /#simulate. Apply last error to simulate copies title / amount / criteria (and other real simulate fields that last failed walk actually exposed) into /#simulate so a failed create-shaped walk can be retried without retyping. Fill only — does not simulate, create, fund, or add credits. Confirm still required to run the walk. A fill is not a walk. Successful walks stay rejected. Empty or nonsense last-error payloads stay rejected. Apply last walk to create copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key) from that same last create-shaped walk into /#create. Apply last error to create copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key that last failed walk actually exposed) into /#create so a failed create can be fixed without retyping. Fill only — does not create, fund, validate-as-commit, or submit. Confirm still required. A fill is not a create. Successful walks stay rejected. Empty or nonsense last-error payloads stay rejected. Apply last walk to validate copies title / amount / criteria from that same last create-shaped walk into /#validate as a create body. Apply last error to validate copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key that last failed walk actually exposed) into /#validate as a create body so a failed dry-check can be fixed without retyping. Fill only — does not validate, create, fund, or commit. Confirm still required. A fill is not a validate. Successful walks stay rejected. Empty or nonsense last-error payloads stay rejected. Apply last walk to verify copies the last walk’s live receipt — from an imported or run /#simulate walk, a successful release or dispute quote, a release fee preview (never the dry-run preview job id), or the last /#verify paste — into /#verify. Apply last error to verify copies only the verify-accepted receipt fields that last failed walk actually exposed into /#verify so a failed verify can be fixed without retyping. Fill only — does not verify, create, fund, or commit. Confirm still required. A fill is not a verify. Successful walks stay rejected. Empty or nonsense last-error payloads stay rejected. A fee mismatch is not a catalog code. Look-up / fill only — this page does not invent a failure, a code, a receipt, or traction. A listed code is not a failure on this page. A fee mismatch is not a catalog code. Dry-check a body on /#validate, quote fees on /#quote, or verify a receipt on /#receipts. There is no auth error code. Demo only — not real money. money: false. Liberty does not invent codes. Liberty does not store the last walk. Liberty does not store the last error.

Loading live codes…

Run a full demo settlement

One click POSTs /api/v0/simulate — create → fund → submit → release (or dispute) through the same fee engine. Validate the body against /api/schemas/simulate.json. Safe demo defaults below. Fill from examples pastes a live simulate body from /api/examples.json (title, amount, criteria, payer_credits, proof_url, terminal, and optional notes / hold fields the example actually provides). Liberty does not invent examples. Fill only — does not run the walk, create, fund, or add credits. Confirm still required to run the walk. A fill is not a walk. Never copies callback_secret. Fill from quote copies title / amount / criteria from the last successful create quote on /#quote. Fill only — does not run the walk, create, fund, or add credits. Confirm still required to run the walk. A fill is not a walk. A quote is not an invoice. Fill from fee preview copies amount from the last successful create or release preview on /#fees (title / criteria only when they are real create fields, not preview defaults). Fill only — does not run the walk, create, fund, or add credits. Confirm still required to run the walk. A fee preview is not an invoice. Never copies callback_secret or the dry-run preview job id. Fill from last walk copies title / amount / criteria (and other real simulate fields the last walk actually returned or sent) from the last imported or run /#simulate walk, or from the last create-shaped /#quote, /#fees, or /#validate request in this tab — including a failed walk that still had real fields. Fill only — does not run the walk. Confirm still required. A fill is not a walk. Fill from last error copies title / amount / criteria (and other real simulate fields the last failed /#quote, /#fees, /#validate, or /#verify actually exposed) from that last failed walk in this tab. Fill only — does not simulate, create, fund, or add credits. Confirm still required to run the walk. A fill is not a walk. Successful walks stay rejected. Empty or nonsense last-error payloads stay rejected. Fill from last create copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key the last successful /#create or create-shaped /#quote actually returned or sent) from that last create-ok / quote-ok receipt in this tab. Fill only — does not simulate, create, fund, or commit. Confirm still required to run the walk. A fill is not a walk. Failed / error receipts stay rejected. Top-up and verify-only receipts stay rejected. Empty or nonsense last-create payloads stay rejected. Never copies callback_secret or a previous as_ job id. Apply last walk to create copies title / amount / criteria (and optional client_ref / callback_url / idempotency_key) from that same last walk into /#create. Fill only — does not create, fund, add credits, or persist. Confirm still required. A fill is not a create. Apply last walk to validate copies title / amount / criteria from that same last walk into /#validate as a create body. Fill only — does not validate, create, fund, or commit. Confirm still required. A fill is not a validate. Apply last walk to verify copies the last walk’s live receipt into /#verify. Fill only — does not verify, create, fund, or move money. A fill is not a verify. Never invents a receipt or the dry-run preview job id. Never copies callback_secret or a previous as_ job id. Optional hold expiry below is sent as ttl_seconds or expires_at on the fund step (one, not both). After expiry, release fails; dispute still refunds. Optional Idempotency-Key is sent as the HTTP header and only stabilizes the create id — no server replay ledger. Optional note lands on the receipt. Copy as curl builds that same POST /api/v0/simulate from the current form against this page’s origin — optional Idempotency-Key only if you filled it; never invents secrets. Not a production integration guarantee. After a successful walk, export the last walk as JSON (transitions, fee quotes, receipts, timestamps) from this browser, or copy a small share card (title, settlement id, final state, fee totals already on screen, timestamps) as plain text or download .txt / markdown. Import a previously exported file to restore that last walk here without re-running simulate. Validate the file against /api/schemas/simulate-walk.json. Local demo export / restore / summary only — not an audit ledger, not custody proof, not proof of external users, not network sync. Never includes callback_secret. Demo — not real money. money: false. Liberty does not store the job.

Fill from examples pastes a live simulate body from /api/examples.json. Liberty does not invent examples. Fill only — does not simulate, create, fund, or add credits. Confirm still required to run the walk. A fill is not a walk. Never copies callback_secret. Demo only. money: false.

Safe demo defaults. Empty payer credits still auto-covers amount from this browser’s wallet. Empty proof URL / note keep the demo defaults. Apply from /#quote fills title / amount / criteria from the last successful create quote. Apply from /#fees fills amount (and title / criteria only when they are real create fields). Fill from last walk refills from the last simulate walk or last create-shaped quote / fee preview / validate in this tab. Fill from last error copies title / amount / criteria from the last failed quote / fee-preview / validate / verify in this tab. Fill from last create copies title / amount / criteria from the last successful create or create-shaped quote-ok in this tab. Fill only — does not simulate, create, fund, or commit. Confirm still required. A fill is not a walk. Failed / error receipts stay rejected. Apply last walk to create copies those same create fields into /#create. Apply last walk to validate copies those same create fields into /#validate as a create body. Apply last walk to verify copies the last walk’s live receipt into /#verify (never invents a receipt or the dry-run preview job id). Review, then run, create, dry-check, or verify. Demo only. money: false.

Optional. Sent as the Idempotency-Key HTTP header on this walk. Same key plus the demo title, amount, and criteria yields the same as_… create id. Liberty is still client-held and stateless — the key only stabilizes create ids for retries. No server replay ledger. Demo only — not real money.

Restores a previously exported walk in this browser so you can re-inspect transitions, quotes, and receipts. Local demo restore only — not an audit ledger, not custody proof, not network sync. Validates required fields against /api/schemas/simulate-walk.json. Rejects money: true. Strips callback_secret. Liberty does not receive the file.

Jobs

Loads a job snapshot into this browser so the other party can continue. Machine-readable shape: /api/schemas/handoff.json. Credits stay here. Liberty does not store the job. Handoffs are not custody transfers. Jobs with callback_url show a last callback attempt panel in this browser only — not a server webhook, not reliable delivery. Handoffs do not include callback_secret.

No jobs yet. Create one above, or load a handoff.

    Receipts / Export

    Terminal receipts from release or dispute in this browser. Download JSON, or copy a receipt link (#receipt/r1.…) so another device can inspect or POST /api/v0/verify without pasting JSON. The last receipt can also copy a small share card — title, settlement id, final state, fee totals already on screen, timestamps — as plain text or download .txt / markdown. Local demo summary only. Not an audit ledger. Not custody proof. Not proof of external users. Never includes callback_secret. Machine-readable shape: /api/schemas/receipt.json. Running totals and a CSV of these receipts live on the Settlement ledger. Liberty does not store receipts. Demo — not real money. Not proof of payment.

    Loads the receipt into Verify below. Credits and jobs stay here. Liberty does not store the receipt.

    No receipts yet. Release or dispute a submitted job, or run a full demo settlement.

    Verify a receipt

    Paste a receipt, or a submitted job plus release/dispute, and POST /api/v0/verify. Same fee engine as quote/transition. Validate the body against /api/schemas/verify.json. A wrong fee is still 200 with valid: false. Illegal input shows the field error. Look up those codes on /#errors (from /api/errors.json). Look up last error copies the last failed verify in this tab into that catalog (code, plus kind / route). Look-up only — does not invent a failure. A fee mismatch is not a catalog code. Fill from examples pastes a live verify body from /api/examples.json. Liberty does not invent examples. Fill from quote copies the quoted receipt from the last successful release or dispute quote on /#quote. Fill from fee preview copies the quoted release receipt from the last successful release preview on /#fees (never the dry-run preview job id). Fill from last walk copies the live receipt from the last imported or run /#simulate walk, the last successful release or dispute quote on /#quote, the last successful release preview on /#fees (never the dry-run preview job id), or the last verify paste in this tab. Fill from last error copies only the verify-accepted receipt fields the last failed /#quote, /#fees, /#validate, or /#verify actually exposed. Fill only — does not verify, create, fund, or commit. Confirm still required. A fill is not a verify. Successful walks stay rejected. Empty or nonsense last-error payloads stay rejected. A fee mismatch is not a catalog code. Never invents a receipt or job id. Never copies callback_secret or the dry-run preview job id. Create-only and top-up walks stay rejected. A fee preview is not an invoice. Copy as curl builds that same POST from the current paste against this page’s origin. Demo only — not real money. money: false. Not a production integration guarantee. A verify is not custody. Liberty does not store what you paste.

    Fill from examples pastes a live verify body from /api/examples.json. Liberty does not invent examples. Fill from quote copies the quoted receipt from the last successful release or dispute quote on /#quote. Fill from fee preview copies the quoted release receipt from the last successful release preview on /#fees (never the dry-run preview job id). Fill from last walk copies the last walk’s live receipt in this tab. Fill from last error copies only the verify-accepted receipt fields the last failed walk actually exposed. Fill only — does not verify, create, fund, or commit. Confirm still required. A fill is not a verify. Successful walks stay rejected. Empty or nonsense last-error payloads stay rejected. Never invents a receipt or job id. Never copies callback_secret or the dry-run preview job id. A fee preview is not an invoice. Demo only. money: false.

    Demo API key

    Self-serve identifier for adapters. Demo only — not production auth, not an account, not real money. The raw key stays in this browser’s localStorage. Liberty never stores it. If you send it, the engine echoes a key_id hash prefix on the response and receipt.

    Try as an adapter

    Copy-ready curls against the live demo. Optional Authorization: Bearer or X-Liberty-Key — mint a key above. Missing keys still work (key_optional). Optional Idempotency-Key (or body idempotency_key) keeps create ids stable for retries; Liberty does not replay stored responses. Release returns agent_credits_delta (same as agent_payout); apply it to a client-held agent wallet. Demo only. money: false. Liberty does not persist jobs or receipts. Same bodies: /api/examples.json. Ordered walk: /#integrate (from /api/quickstart.json). Human dry-check: /#validate. Human fee quote: /#quote.

    POST /api/v0/validate

    Dry-check. Same request shape as transition. No apply, no persist, no job id. Schema errors are 400 with kind: schema. State errors are 409 with kind: state. Human panel: /#validate.

    curl -X POST https://liberty-amber.vercel.app/api/v0/validate \
      -H 'content-type: application/json' \
      -d '{"action":"create","title":"Summarize filings","amount":100,"criteria":"Three-bullet brief"}'
    # optional: -H 'Authorization: Bearer lib_demo_…' or -H 'X-Liberty-Key: lib_demo_…'
    # optional: -H 'Idempotency-Key: retry-create-1' (echo only; still no durable id)

    POST /api/v0/quote

    Dry-run. No state change. Create quote has no durable id. action: topup is quote-only and returns credits_charged vs credits_received. Human panel: /#quote.

    curl -X POST https://liberty-amber.vercel.app/api/v0/quote \
      -H 'content-type: application/json' \
      -d '{"action":"create","title":"Summarize filings","amount":100,"criteria":"Three-bullet brief"}'
    curl -X POST https://liberty-amber.vercel.app/api/v0/quote \
      -H 'content-type: application/json' \
      -d '{"action":"topup","amount":100,"payer_credits":0}'
    # optional: -H 'Authorization: Bearer lib_demo_…' or -H 'X-Liberty-Key: lib_demo_…'
    # optional: -H 'Idempotency-Key: retry-create-1' (echo only on quote)

    POST /api/v0/transition

    Stateless create. Then fund → submit → release with the returned job — or skip the walk and use /api/v0/simulate. Optional client_ref on create (max 128) stamps your adapter id on the job and receipt. Optional callback_url (notify_url alias, max 512, https) is stamped the same way — Liberty never fetches it. Optional callback_secret is client-held only (HMAC-SHA256 header on a would-POST or browser POST) — not an API field, no server signing ledger. Optional expires_at (ISO-8601 UTC) or ttl_seconds (positive integer) on fund stamps expiresAt. If both are sent, Liberty rejects as conflicting. After that instant, release fails; dispute still refunds. Optional proof_note on submit. Optional release_note or dispute_reason on the terminal action. Release returns agent_credits_delta.

    curl -X POST https://liberty-amber.vercel.app/api/v0/transition \
      -H 'content-type: application/json' \
      -d '{"action":"create","title":"Summarize filings","amount":100,"criteria":"Three-bullet brief","client_ref":"agent-job-42","callback_url":"https://your-adapter.example/notify"}'
    # optional: -H 'Authorization: Bearer lib_demo_…' or -H 'X-Liberty-Key: lib_demo_…'
    # optional: -H 'Idempotency-Key: retry-create-1' (stable create id; no stored replay)
    
    # fund → submit → release sketch (send the job from create, or these sample jobs)
    curl -X POST https://liberty-amber.vercel.app/api/v0/transition \
      -H 'content-type: application/json' \
      -d '{"action":"fund","payer_credits":100,"job":{"id":"as_0123456789","title":"Summarize filings","amount":100,"criteria":"Three-bullet brief","proofUrl":"","status":"open","createdAt":"2026-09-15T00:00:00.000Z","fundedAt":null,"submittedAt":null,"resolvedAt":null,"fee":0,"agentPayout":0}}'
    curl -X POST https://liberty-amber.vercel.app/api/v0/transition \
      -H 'content-type: application/json' \
      -d '{"action":"submit","proof_url":"https://example.com/proof","proof_note":"Three-bullet brief attached.","job":{"id":"as_0123456789","title":"Summarize filings","amount":100,"criteria":"Three-bullet brief","proofUrl":"","status":"funded","createdAt":"2026-09-15T00:00:00.000Z","fundedAt":"2026-09-15T00:00:00.000Z","submittedAt":null,"resolvedAt":null,"fee":0,"agentPayout":0}}'
    curl -X POST https://liberty-amber.vercel.app/api/v0/transition \
      -H 'content-type: application/json' \
      -d '{"action":"release","release_note":"Proof matches the three-bullet brief.","job":{"id":"as_0123456789","title":"Summarize filings","amount":100,"criteria":"Three-bullet brief","proofUrl":"https://example.com/proof","status":"submitted","createdAt":"2026-09-15T00:00:00.000Z","fundedAt":"2026-09-15T00:00:00.000Z","submittedAt":"2026-09-15T00:00:00.000Z","resolvedAt":null,"fee":0,"agentPayout":0}}'

    POST /api/v0/simulate

    Full walk: create → fund → submit → release. Set terminal to dispute for a refund. Optional client_ref on create lands on the job and receipt. Optional callback_url is stamped the same way — Liberty never fetches it. Optional expires_at or ttl_seconds is applied on fund (send one, not both). After expiresAt, release fails; dispute still refunds. Optional proof_note on submit. Optional release_note or dispute_reason lands on the receipt. Release returns agent_credits_delta.

    curl -X POST https://liberty-amber.vercel.app/api/v0/simulate \
      -H 'content-type: application/json' \
      -d '{"title":"Summarize filings","amount":100,"criteria":"Three-bullet brief","payer_credits":100,"proof_url":"https://example.com/proof","proof_note":"Three-bullet brief attached.","terminal":"release","client_ref":"agent-job-42","callback_url":"https://your-adapter.example/notify","release_note":"Proof matches the three-bullet brief."}'
    # optional: -H 'Authorization: Bearer lib_demo_…' or -H 'X-Liberty-Key: lib_demo_…'
    # optional: -H 'Idempotency-Key: retry-create-1' (stable create id; no stored replay)

    POST /api/v0/verify

    Stateless receipt check. A wrong fee is still 200 with valid: false.

    curl -X POST https://liberty-amber.vercel.app/api/v0/verify \
      -H 'content-type: application/json' \
      -d '{"receipt":{"job_id":"as_0123456789","title":"Summarize filings","status":"released","amount":100,"release_fee":5,"agent_payout":95,"returned_to_payer":0,"success_criteria":"Three-bullet brief","proof":"https://example.com/proof","created":"2026-09-15T00:00:00.000Z","funded":"2026-09-15T00:00:00.000Z","submitted":"2026-09-15T00:00:00.000Z","resolved":"2026-09-15T00:00:00.000Z"}}'
    # optional: -H 'Authorization: Bearer lib_demo_…' or -H 'X-Liberty-Key: lib_demo_…'

    For agents

    Demo only. This page stores payer credits and jobs in localStorage, and a separate agent wallet under liberty.agent-settlement.agent-credits.v0. The activity log appends local demo actions in this browser (create / fund / submit / release / dispute, simulate, validate, verify, demo pack import / export / reset). Liberty never receives that log. The Settlement ledger sums this browser’s stored receipts (fees paid, agent payouts, disputed returns) and can download them as CSV. Liberty does not persist that ledger. A successful release (via /api/v0/transition or /api/v0/simulate) credits that agent wallet by agent_credits_delta / agent_payout. Dispute refunds the payer and does not credit the agent. Before payer top-up, fund, release, or dispute it POSTs /api/v0/quote and shows the cut. Top-up confirm applies credits_received in this browser — no payment API. Job confirms POST create / fund / submit / release / dispute to /api/v0/transition — the same engine adapters use. Optional hold expiry on fund (and on the one-click simulate walk) sends ttl_seconds or expires_at — one of the two, not both. After expiry, release fails; dispute still refunds. Optional Idempotency-Key on create and on that simulate walk is sent as the HTTP header. Same key plus same title, amount, and criteria yields the same as_… id. Liberty is still client-held and stateless — the key only stabilizes create ids for retries. No server replay ledger. Run a full demo settlement POSTs /api/v0/simulate and walks that engine end-to-end in one request. After a successful walk, export that walk as JSON (transitions, fee quotes, receipts, timestamps) from this browser, or copy a small share card (title, settlement id, final state, fee totals already on screen, timestamps). Import a previously exported file to restore that last walk here without re-running simulate. Local demo export / restore / summary only — not an audit ledger, not custody proof, not proof of external users, not network sync. Never includes callback_secret. A successful release or dispute keeps the JSON receipt in this browser so you can download or share proof. Paste a receipt (or pick a stored one) to POST /api/v0/verify and check fee math. Share a job with another browser via a handoff link (#handoff/h1.… base64url JSON of the job). Share a terminal receipt via a receipt link (#receipt/r1.… base64url JSON of the receipt) so another device can inspect or verify without pasting JSON. Come back later, or move to another device, with a demo pack — one JSON file of this browser’s Settlement localStorage. Import replaces (does not merge). Reset demo on that section clears the known Settlement keys after confirm. Liberty never receives the pack. The file may include the raw demo API key if one is stored here. Credits stay in each browser. Mint a demo API key above if you want adapters to identify themselves. Send Authorization: Bearer <key> or X-Liberty-Key. If a key is sent, the response and receipt include key_id (hash prefix only). If omitted, the route still works and notes key_optional. Liberty does not persist jobs, receipts, or balances or take custody. Not a live escrow service. Not real money. Not production auth.