Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Registrar API

Every route on the registrar, grouped by actor. See the wire format for envelopes, signed objects, and receipts. Routes are defined in crates/tenure-registrar/src/http.rs.

Employer / onboarding

Method & pathBodyReturns
POST /onboardOnboardRequest (descriptor + KYB + EpochOpen(1) + delegation, each signed){ receipts }
POST /invite{ employer_id, email, payroll_ref }{ claim_token }
POST /batch{ manifest: Envelope, raw_batch_b64 }{ status: "processed", receipts } or { status: "skipped" }
POST /epoch/close{ close: Signed } (tn-epoch-close-v1){ ok: true }
POST /checkpoint/:employer_idthe published Checkpoint
GET /export/:employer_idthe ragequit file
POST /import{ file, epoch_open: Signed, delegation: Signed, contact_email }{ employer_id }

Notes:

  • /batch is the bulk-issuance endpoint. The manifest envelope wraps the Signer-signed tn-batch-v1 (whose aggregates the Signer computed itself), and raw_batch_b64 is the raw batch file — never a summary. The registrar cross-checks the signed aggregates against the file it received, and the run_id makes the call idempotent: a replayed run returns { status: "skipped" }.
  • /import is how a new registrar adopts an employer during a switch. It runs full import-time verification over the ragequit file before accepting the new epoch.

Worker / holder

Method & pathBody / queryReturns
POST /claim{ token, subject_pk }{ employer_id }
GET /wallet/:subject_pk{ attestations } (sealed payloads + receipts)
POST /grants{ grant: Signed, sealed_bundle_b64 }{ grant_id }
POST /grants/revoke{ revoke: Signed } (tn-grant-revoke-v1){ ok: true }
GET /access_log/:grant_id?holder_pk=…{ access_log }

Notes:

  • /claim redeems an invite token and binds a freshly generated per-employer subject_pk to the worker.
  • /grants stores a holder-signed ShareGrant together with the pre-sealed verification bundle. /grants/revoke withdraws it — killing future fetches and recency, never deleting copies already seen.
  • /access_log is fetch-scoped and worker-visible; holder_pk authorizes the read.

Verifier

Method & pathBody / queryReturns
GET /share/:grant_id?verifier_account_id=…{ sealed_bundle_b64 }
POST /verifier_accounts{ org_name, email }{ verifier_account_id }
POST /verifications{ grant_id, verifier_account_id, verified_head_seq }{ billed, amount_cents }
POST /monitors{ grant_id, verifier_account_id }{ monitor_id }
GET /monitors/events?verifier_account_id=…{ events: [{ grant_id, event_class }] }

Notes:

  • /share/:grant_id returns the sealed bundle; the fetch lands in the worker’s access log. No account is needed to view; an account is needed to bill.
  • /monitors/events returns event classes onlyemployment_status_changed, attestation_superseded, grant_revoked — never claim values. The payload type cannot carry a value.

Public (unauthenticated)

Method & pathReturns
GET /public/:employer_id/headthe latest signed LogHead
GET /public/:employer_id/checkpointthe latest Checkpoint
GET /public/:employer_id/revocations{ commitments } — the public revocation commitments

These are the data a verifier needs for a live recency check and the inputs to the freshness check in the verify predicate. They expose heads, checkpoints, and BLAKE3(attestation_id) commitments — never worker identity or claim values.