POST
/v1/judgments
Enqueue a judgment. Returns immediately with an id, a status, and an eta. The panel is contacted asynchronously. You do not wait on the HTTP request for the distribution.
Requestapplication/json
{
"question": "Does this outbound email read as insulting to a VP of Engineering?",
"stimulus": { "type": "text", "body": "..." },
"panel": "eng_leaders_us_b2b",
"n": 24,
"scale": "likert_5",
"webhook_url": "https://your-agent.example/hooks/judgment"
}
Response · 202 Acceptedapplication/json
{
"id": "jdg_2n8k0q",
"status": "queued",
"eta_seconds": 900
}
GET
/v1/judgments/:id
Poll a job. Status is queued, in_progress, completed, or failed. On completed, the body includes the distribution, dissent, confidence, rationales, and a call. Same payload delivered on the webhook.
- queued
- Accepted. Panel not yet in motion.
- in_progress
- Responses arriving. Partial counts are not returned in v1.
- completed
- n reached, or the eta expired with a documented shortfall.
- failed
- Could not field the panel. Credits reversed.
GET
/v1/panels
List panels you can address. First panel: senior engineering leaders, US B2B SaaS. Each record is an id, a segment description, a typical eta, and whether it is currently open.
Response · 200
{
"panels": [
{
"id": "eng_leaders_us_b2b",
"segment": "Senior engineering leaders, US B2B SaaS",
"typical_n": [20, 30],
"typical_eta_seconds": 900,
"open": true
}
]
}
Webhook
judgment.completed
POST to your webhook_url when the job finishes. Retry with backoff on non-2xx. Verify the signature header (scheme TBD at token issue). Event names for failure and timeout will share this envelope.
Event envelope
{
"event": "judgment.completed",
"id": "jdg_2n8k0q",
"occurred_at": "2026-08-21T18:11:04Z",
"data": { "/* same body as GET /v1/judgments/:id */" }
}
MCP
Server wrapper
The MCP server exposes the same three calls as tools: create_judgment, get_judgment, list_panels. It does not add a blocking “wait for result” tool in v1. Agents are expected to yield, then resume on the webhook or a later get_judgment. If your runtime cannot receive webhooks, poll.
Contract
No synchronous mode
Judgment takes minutes because humans take minutes. Wrapping that in a long HTTP request is how you get retries, duplicate panel charges, and agents that look stuck. v1 refuses ?sync=true. If you need a human on the hook in seconds, you want accountable sign-off with a named reviewer already online — that is a different endpoint, later.