Quickstart.

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.

Step 1

Get a key

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.

Create your organisation

Keys are prefixed qk_live_ or qk_test_ and go in an Authorization: Bearer header.

This API is server-to-server

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.

Step 2

Make the free call first

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.

Step 3

Convene the panel

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:

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.

Step 4

Set your timeouts from real numbers

Measured on production, 2026-08-20:

CallTimeSample
estimate~0.9 s10 prompts
deliberation p5028.5 s3,845 deliberations
deliberation p9088.2 s
deliberation p99229.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.

Step 5

Read the receipt

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.

Where to go next