API overview
The v1 API is assembly-first. You define a panel of rival models once as an "assembly", save it, and then run any number of debates against it. The body for starting a debate is deliberately minimal, prompt + assemblyId. Everything else lives in the assembly, which models, what format, how many rounds, and when to converge.
All endpoints
| Method | Path | Purpose |
|---|---|---|
POST | /v1/assemblies | Create a new assembly (the panel definition) |
GET | /v1/assemblies | List your assemblies |
GET | /v1/assemblies/:id | Get one assembly |
POST | /v1/debates | Start a debate against an assembly |
GET | /v1/debates | List your debates (paginated) |
GET | /v1/debates/:id | Get the full session, every round, every turn, the verdict |
GET | /v1/debates/:id/status | Lightweight status for polling |
Base URL
https://rigordesk.com/api
The web UI at rigordesk.com uses the same /v1/* endpoints internally. The assemblies you create via the web are the same ones you'd create via API and vice-versa.
Authentication
All /v1/* endpoints require a Bearer API key in the Authorization header:
Authorization: Bearer dbt_xxxxxxxxxxxxxxxx
You generate API keys in Settings → API Keys in the web app. The app shows each key only once on creation, so store it securely. You can revoke keys from the same screen.
Required headers
| Header | When | Notes |
|---|---|---|
Authorization: Bearer dbt_… | All requests | Required. |
Content-Type: application/json | POST/PUT | Required for bodies. |
Idempotency-Key | POST /v1/debates | Required. Any unique string. Same key = same session returned, no new debate started. See idempotency. |
Response envelopes
- Success. You get the resource directly, or
{ items: [...], total, limit, offset }for list endpoints. - Error.
{ "error": "human-readable message", "reason"?: "..." }with a status code.
The two-step flow
The whole API reduces to two calls:
{
"name": "Code Review Panel",
"models": [
{ "id": "openai/gpt-5.5" },
{ "id": "anthropic/claude-opus-4.8" },
{ "id": "google/gemini-3.1-pro-preview" }
],
"maxRounds": 3,
"agreementLimit": 75
}
{
"prompt": "Refactor this React component for readability",
"assemblyId": "9fa4f385-1214-461a-8463-17242854e0d1"
}
That's it. Re-running the same prompt against the same assembly reuses the same panel. You don't repeat the model list, round count, or threshold.
Quick links
- Quickstart. Runnable end-to-end example
- Reference. Every endpoint, every field
- Idempotency. How the dedup behavior works
- Webhooks. Get a POST on completion instead of polling
- Errors. Every status code and what to do
