Five minutes, five steps, real commands. The first call costs nothing by design — find out that your key works at free prices rather than at deliberation prices.
Create an organisation, add a prepaid balance, issue a key. No sales call, no waiting list. The key is shown once — store it before you close the tab.
A new org opens with a $10 credit, so the calls below run before you top up. Anything unused after 30 days is deducted.
Keys are prefixed qk_live_ or qk_test_ and go in an
Authorization: Bearer header.
A request carrying a browser Origin header is rejected with
403 browser_origin_not_allowed — a real key sent from a
browser is treated as a leaked key, not a legitimate call. Put the key on
your server, never in front-end code.
POST /v1/estimate classifies a question and tells you what running
it would cost, without running it. It bills nothing — billed_usd
comes back 0 — and takes about 0.9 seconds.
curl -sS https://www.quorum.dog/v1/estimate \
-H "Authorization: Bearer $QUORUM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "quorum-standard",
"messages": [{"role":"user","content":"Should we use RLS or app-layer authz for multi-tenant Postgres?"}]
}'
{
"request_id": "req_...",
"mode_key": "standard",
"depth": "medium",
"difficulty_score": 0.61,
"task_type": "analysis",
"estimated_price_usd": 0.10,
"billed_usd": 0,
"timing_ms": { "total": 912, "classify": 874 }
}
Start here because it is the cheapest way to find out that your key works, your model name is right, and your JSON parses — three things worth learning for free rather than at deliberation prices.
Same shape, different path. POST /v1/chat/completions is
OpenAI-shaped, so most SDKs work by changing the base URL — the
model field selects a Quorum mode rather than a single model.
curl -sS https://www.quorum.dog/v1/chat/completions \
-H "Authorization: Bearer $QUORUM_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
--max-time 300 \
-d '{
"model": "quorum-standard",
"messages": [{"role":"user","content":"Should we use RLS or app-layer authz for multi-tenant Postgres?"}]
}'
Two things in that command are not decoration:
--max-time 300. A deliberation is measured in seconds, not
milliseconds. Default client timeouts will cut it off.Idempotency-Key. Send one on anything a retry could duplicate.
A repeat of a succeeded key replays the original answer rather than
re-running or re-billing it.The response is OpenAI's shape with one addition:
{
"id": "req_...",
"object": "chat.completion",
"choices": [{ "index": 0, "message": {...}, "finish_reason": "stop" }],
"usage": { "prompt_tokens": 41, "completion_tokens": 612, "total_tokens": 653 },
"quorum": {
"request_id": "req_...",
"mode_key": "standard",
"rounds": 1,
"seats": 3,
"converged": true,
"billed_usd": 0.10,
"latency_ms": 26418,
"engines": ["Anthropic", "Google", "OpenAI"]
}
}
converged: false is information, not failure. It means the panel
genuinely disagreed — often the most useful thing a call can tell you.
Measured on production, 2026-08-20:
| Call | Time | Sample |
|---|---|---|
estimate | ~0.9 s | 10 prompts |
| deliberation p50 | 28.5 s | 3,845 deliberations |
| deliberation p90 | 88.2 s | |
| deliberation p99 | 229.3 s |
If your caller cannot wait that long, the honest answer is that it should not
be calling this synchronously. Classify with estimate, deliberate
only what earns it, and do the rest with a single model.
Take the request_id and ask what actually happened — which
models sat in which seat, what each scored, whether any seat fell back to a
different engine, and what it really cost.
curl -sS https://www.quorum.dog/v1/receipts/req_... \
-H "Authorization: Bearer $QUORUM_API_KEY"
This is free, and it is the endpoint that makes your caller smarter rather than ours: judge scores and convergence are what let an agent decide to escalate, re-ask, or send something to a human.
openapi.json — the machine-readable
spec. Feed it to your codegen, your HTTP client, or your agent.