LITMUS_URL, LITMUS_TOKEN and LITMUS_ORG (your org tag) set in your shell (see Authentication). A $NAME in a path is an id you read from the listing route on this page; a <field> in a body is a value you supply, and every field the handler reads is shown, so send only the ones you need. Fields are what the handler’s source reads and writes, listed mechanically; they are not a schema.
GET /v0/orgs/{orgtag}/held-sets/{gid}/quality
GET /v0/orgs/{org}/held-sets/{gid}/quality: one held set’s quality packet — the line, the ranked losses and one row per task with each check’s verdict and its reason, every term with its tier and n, an unmeasured term absent (heldquality). gid is the held set’s run group. ?format=md is the Markdown export, the tier sentence first. A reader: no model call, no run, no corpus member opened.
Path parameters:
orgtag, gid
Query parameters the handler or its helper reads: format
Response fields written in the handler: line, losses_ranked, model_calls, org, set, tasks, terms, tier_sentence, unmeasured
GET /v0/orgs/{orgtag}/rubric
GET /v0/orgs/{org}/rubric?persona=<id>&use_case=<id>: one persona’s criteria for one job, trace checks and output checks apart (valueprofile.rubric).
Path parameters:
orgtag
Query parameters the handler or its helper reads: persona, use_case
Response fields written in the handler: org
GET /v0/orgs/{orgtag}/calibration
GET /v0/orgs/{org}/calibration: every calibration set, summarised. Retired sets only with ?retired=1.
Path parameters:
orgtag
Query parameters the handler or its helper reads: retired
Response fields written in the handler: org, sets
POST /v0/orgs/{orgtag}/calibration
POST /v0/orgs/{org}/calibration: a set of judge verdicts beside a person’s labels (calibration.normalize names the body).
Path parameters:
orgtag
Response fields written in the helper the handler answers through: agreement, by, created_at, criterion, disagreements, drift, human, id, illustrative, judge, kappa, label, name, repeatability, retired, rubric
This call changes state in the org.
GET /v0/orgs/{orgtag}/calibration/{cid}
GET /v0/orgs/{org}/calibration/{cid}: one set’s summary and its labelled items.
Path parameters:
orgtag, cid
Response: JSON: a stored record or a helper’s result, answered as it is, so its keys are not written in the source and none are listed.
PATCH /v0/orgs/{orgtag}/calibration/{cid}
PATCH /v0/orgs/{org}/calibration/{cid} with {retired: {reason}, by} or {retired: null}: a set leaves the panel, and stays on the record, restorable. Nothing else about a set is editable — its labels are what a person gave.
Path parameters:
orgtag, cid
Body fields the handler or its helper reads: by, retired
Response: JSON: a stored record or a helper’s result, answered as it is, so its keys are not written in the source and none are listed.
This call changes state in the org.
GET /v0/orgs/{orgtag}/reports
GET /v0/orgs/{org}/reports: this org’s reports, newest first — title, kind, source, who made it and when, how often its link was opened, and whether the link answers now. Never the link itself. ?kind=weekly (or any report kind) lists that kind only.
Path parameters:
orgtag
Query parameters the handler or its helper reads: kind, retired
Response fields written in the handler: org, reports, retired_count
POST /v0/orgs/{orgtag}/reports
POST /v0/orgs/{org}/reports with {kind: "run_group" | "packet" | "provider_comparison", id, title?, made_by?}: freeze what that run group’s page (or that sandbox’s realism, or that provider comparison as a member reads it) shows now into one report. Nothing is re-graded or re-run; a later run of the same group leaves this report as it was. 404 when the org has no such group, sandbox or comparison. {kind: "written", markdown, title?, made_by?} keeps a report an operator wrote — headings, tables, links — redacted and capped; 400 when the markdown is empty or too long.
Path parameters:
orgtag
Body fields the handler or its helper reads: id, kind, made_by, markdown, title
Response: JSON: a stored record or a helper’s result, answered as it is, so its keys are not written in the source and none are listed.
This call changes state in the org.
POST /v0/orgs/{orgtag}/reports/weekly
POST /v0/orgs/{org}/reports/weekly with {by?}: write this org’s page for the previous complete ISO week now (Monday 00:00Z to Sunday 23:59:59Z), assembled by rule from stored records with no model call. IDEMPOTENT per (org, ISO week): a second call replaces that week’s page under the same report id (replaced: true), never a second page. Created with sharing off; when the org’s weekly delivery is on, the page is shared and its link posted to the org’s Slack channel once per week (delivery.state: off, no_install, no_token, posted, error). When its email is on, delivery.email.state: off, no_members, no_key, sent, error — mailed once per week.
Path parameters:
orgtag
Body fields the handler or its helper reads: by
Response: JSON: a stored record or a helper’s result, answered as it is, so its keys are not written in the source and none are listed.
This call changes state in the org.
GET /v0/orgs/{orgtag}/reports/weekly/delivery
GET /v0/orgs/{org}/reports/weekly/delivery: whether each week’s page is shared and its link posted to Slack — {on, channel, by, at} — and whether this org has a Slack install to post through. Off by default.
Path parameters:
orgtag
Response fields written in the handler: delivery, org, slack_installed, tier
PUT /v0/orgs/{orgtag}/reports/weekly/delivery
PUT /v0/orgs/{org}/reports/weekly/delivery with {on, channel?, by?}: turn weekly delivery on (a Slack channel id is required when the org has a Slack install) or off. Or {email: {on, finding?: {a, b, main?}}, by?}: the email target alone — the week’s headline lines and the named compare’s bug finding mailed to each member who has not opted out (email_opt_out on the member), through Resend by RESEND_API_KEY. Off by default; each half is changed without touching the other. Kept on the org’s record with who set it. From the next page on, each week’s page is shared and its link posted to that channel; turning it off shares nothing new and leaves the links already sent as they are.
Path parameters:
orgtag
Body fields the handler or its helper reads: by, channel, confirm, email, on
Response fields written in the handler: delivery, org, slack_installed, tier
This call changes state in the org.
GET /v0/orgs/{orgtag}/reports/{report_id}
GET /v0/orgs/{org}/reports/{report_id}: one report as its reader will see it, with who made it, its source and its opens. Never the link.
Path parameters:
orgtag, report_id
Response: JSON: a stored record or a helper’s result, answered as it is, so its keys are not written in the source and none are listed.
POST /v0/orgs/{orgtag}/reports/{report_id}/share
POST /v0/orgs/{org}/reports/{report_id}/share with {on: bool, named?: bool}. On: a NEW link token, answered once as token and stored only as its hash; named puts the org’s name on the shared page. Off: the link stops answering at once. Turning it on again never revives an old link.
Path parameters:
orgtag, report_id
Body fields the handler or its helper reads: named, on
Response: JSON: a stored record or a helper’s result, answered as it is, so its keys are not written in the source and none are listed.
This call changes state in the org.
GET /v0/orgs/{orgtag}/failure-modes
This org’s known failure modes, oldest first — the feedback notes that carry a mode block — with the vocabularies a form offers. Read by ?audience= as the feedback list is.
Path parameters:
orgtag
Query parameters the handler or its helper reads: audience
Response fields written in the handler: audience, behaviours, count, failure_modes, generatable, org, origins, statuses, tier, to_classify
POST /v0/orgs/{orgtag}/failure-modes
{modes: [{title, description?, example?, reported_by?, seen_at?, status?, origin?, behaviour?, target?, tasks?, ticket?, trace?}], author | by} or one such object — the console’s form, an operator’s import of a ticket export and the customer’s feedback hook write the same notes. EVERY mode is checked before ANY is stored, so a batch with one bad row stores nothing and names the row. Each is a feedback note (feedback.record): verbatim, human tier, append-only.
Path parameters:
orgtag
Body fields the handler or its helper reads: author, author_member, by, modes, visibility
Response fields written in the handler: org
This call changes state in the org.
POST /v0/orgs/{orgtag}/failure-modes/investigate
{text, author, ticket, origin_source, session_ids?, trace_ids?, window?, tools?, title?, seen_at?, member?, stats?} — one report, investigated: pull what it names, record it as a failure mode with the trace cited, and name the sandbox its tasks go on. Writes the note (and the pulled evidence); writes no task.
Path parameters:
orgtag
Body fields the handler or its helper reads: author, member, origin_source, report, seen_at, stats, text, ticket, title, window
Response fields written in the handler: behaviour_words, cited, duplicate, failure_mode, generatable, org, pull, tier, trace_state, wanted, why_no_tasks
This call changes state in the org.
GET /v0/orgs/{orgtag}/failure-modes/proposals
?origin=slack|console&state=proposed|confirmed|dismissed — this org’s proposals, oldest first, each with what its confirm did (the mode, the sandbox, the job, the task indexes once landed, the run link).
Path parameters:
orgtag
Query parameters the handler or its helper reads: origin, state
Response fields written in the handler: buckets, count, org, proposals, tier
POST /v0/orgs/{orgtag}/failure-modes/proposals
{report: rpt_…} (a report the Slack handler parked) or {text, author, ticket?, origin_source?, tools?, seen_at?, member?} — the report read into ONE proposed failure mode by rule (reportproposal), stored as a proposal in the org’s store. Writes no failure mode.
Path parameters:
orgtag
Body fields the handler or its helper reads: author, member, origin_source, report, seen_at, text, ticket, tools
Response fields written in the handler: duplicate, org, proposal, tier
This call changes state in the org.
POST /v0/orgs/{orgtag}/failure-modes/proposals/{pid}/confirm
{by, title?, behaviour?, bucket?, environment?, count?, target_tool?} — a member confirms the proposal: the failure mode is written through the failure-mode store (human tier, made_mode naming who), and its tasks (count, 6 by default, 5 to 8) are written through the existing generation route on the bucket’s sandbox — a write’s as a job, a no-data mode’s at once (201, stored_as, no job), read straight off that answer. Answers {proposal, mode, environment, job, run_link}. A second confirm answers the first’s result (200).
Path parameters:
orgtag, pid
Body fields the handler or its helper reads: behaviour, bucket, by, count, environment, target_tool, title
Response fields written in the helper the handler answers through: already, environment, job, mode, org, proposal, run_link, tier
This call changes state in the org.
POST /v0/orgs/{orgtag}/failure-modes/proposals/{pid}/dismiss
{by} — a member dismisses the proposal: nothing is written but the proposal’s state and who. A confirmed one is refused (409); a dismissed one answers as it stands.
Path parameters:
orgtag, pid
Response fields written in the handler: org, proposal, tier
This call changes state in the org.
PATCH /v0/orgs/{orgtag}/failure-modes/{mid}
PATCH …/failure-modes/{id} {behaviour?, bucket?, target?: {tool?, column?}, status?, by}: a person classifies a mode already recorded — failuremodes.to_classify lists the ones nobody has, and this is what writes. Each field is checked against the record’s own vocabularies; the note’s words are untouched; who and when go on mode.classified, human tier. Another org’s id answers 404, as one that does not exist. 200 with the mode, and changed empty when the classification said what the mode already said.
Path parameters:
orgtag, mid
Body fields the handler or its helper reads: author, by
Response fields written in the handler: changed, failure_mode, generatable, org, tier
This call changes state in the org.
POST /v0/orgs/{orgtag}/failure-modes/{mid}/classify
POST …/failure-modes/{id}/classify {reader?: rule | model, holding?: [tool], model?, dry_run?, by}: the sessions the org’s feedback sheet reported, read against this false_no_data mode (modesessions). Every sheet note about a stored trace opens its session; the rule reads each (tier deterministic, no model) and, with reader: model, one model call per session reads it too (tier llm_derived, its entity kept only when cited). holding names the tools that hold the rows as the customer’s traces call them; the mode’s target.tool otherwise. dry_run with the model reader answers the estimated cost and writes nothing. The reading is written on the mode’s record (sessions_read) for the mint to ground its tasks in (…/environments/{id}/tasks {failure_mode: {id, from_sessions}}). Another org’s id is a 404.
Path parameters:
orgtag, mid
Body fields the handler or its helper reads: author, by, dry_run, holding, model, reader
Response fields written in the handler: counts, dry_run, entities, entries, estimate, failure_mode, holding, holding_seen_in, org, reader, sessions, with_turns
This call changes state in the org.
POST /v0/orgs/{orgtag}/failure-modes/{mid}/rekey
POST …/failure-modes/{id}/rekey {environment, by, dry_run?}: a held false_no_data set’s answer key, re-written so it rejects a sprayed or padded list (failuremodes.rekey_false_no_data). The requests and the oracle stay; each task of this mode on the environment gains answer_excludes over the holding table’s other rows, executed against the right answer and five wrong ones before it is kept. The world is drawn as the environment’s trials draw it and the holding tool is called on a scratch copy. dry_run answers the counts and writes nothing. $0: no model call. Another org’s id is a 404.
Path parameters:
orgtag, mid
Body fields the handler or its helper reads: by, dry_run, environment
Response fields written in the handler: board, dry_run, environment, failure_mode, model_calls, note, rekeyed, rekeyed_as, tier, usd
This call changes state in the org.
POST /v0/orgs/{orgtag}/held-sets/{gid}/pickout
POST /v0/orgs/{org}/held-sets/{gid}/pickout {dry_run?, by, seed?}: the model pick-out read of a held set. Each task’s request is shown among 4 of the org’s real requests, shuffled by a seeded draw, to one pinned model (pickout.model(), a pin of configs/providers.yaml), which names the one not written by a user and quotes it; an unresolved quote is refused. The term reads “picked out K of N (chance 1 in 5)”, tier llm_derived, never summed with the deterministic band term. dry_run answers the estimated cost and calls no model. Otherwise the response carries the cost before (estimate) and after (cost, the provider’s counts), and the verdicts are written on the held set’s group record (pickout.FIELD) — never a real request, and the model’s reason only when it quotes the task. gid is the held set’s run group; another org’s group is a 404.
Path parameters:
orgtag, gid
Body fields the handler or its helper reads: by, dry_run, seed
Response fields written in the handler: cost, dry_run, estimate, group, model, org, prompt_version, real_n, seed, tasks, term, tier, verdicts
This call changes state in the org.
GET /v0/orgs/{orgtag}/scorers
THE ORG’S SCORERS: every check kind in use on the org’s standing tasks — its name and tier, what runs verbatim (the detector’s read as executed, or the judge’s prompt as sent, with each value the task supplies named as a slot), its version digest, where it is used (checks, tasks, sandboxes) and its last verdicts (met / missed / no-verdict kinds over the stored trials of each task’s newest run).
Path parameters:
orgtag
Response fields written in the handler: judge, org, scorers
POST /v0/root
One sentence in; the path that was chosen and what each step returned.
Body fields the handler or its helper reads:
confirm, context, converse, greet, human, looking_at, model, org, path, paths, request, slots, stream, thread, uploaded, via, viewer
Response fields written in the helper the handler answers through: asked, org, outcome, reply, routing, steps (or a stream of server-sent events)
This call changes state in the org.
GET /v0/root
The paths this surface holds, and the record of what has been asked.
Query parameters the handler or its helper reads:
limit, org, readiness
Response fields written in the handler: answers_kept_since, journal_file, org, paths, readiness, requests, tally, threads
GET /v0/root/threads/{tid}
One conversation, every turn, with the answers that were kept.
Path parameters:
tid
Query parameters the handler or its helper reads: org
Response: JSON: a stored record or a helper’s result, answered as it is, so its keys are not written in the source and none are listed.
PATCH /v0/root/threads/{tid}
Rename a conversation. title in the body; the org is the token’s. The derived title is replaced and the thread remembers it was renamed, so a later turn does not overwrite what a person chose.
Path parameters:
tid
Body fields the handler or its helper reads: org, title
Response: JSON: a stored record or a helper’s result, answered as it is, so its keys are not written in the source and none are listed.
This call changes state in the org.
DELETE /v0/root/threads/{tid}
Delete a conversation and every turn in it. There is no undo and no archive: the file is removed. The journal line each turn wrote stays, because it is the routing record and holds no answer.
Path parameters:
tid
Query parameters the handler or its helper reads: org
Response fields written in the handler: deleted, org
This call changes state in the org.