---
title: "Quickstart"
summary: "From sign-in to your first verdict in five minutes, with the request in curl, JavaScript and Python and the response explained line by line."
category: "developer"
tags: ["quickstart", "first request", "curl", "javascript", "python"]
updated: "2026-09-14T04:24:59.550Z"
url: "https://support.quorumtech.ch/articles/api-quickstart"
markdown: "https://support.quorumtech.ch/articles/api-quickstart.md"
---

# Quickstart

In five minutes you will send Attest a claim and the sentence it came from and read back a verdict with the span it rests on.

## 1. Get credits and a credential

Sign in at `https://developer.quorumtech.ch`. A personal workspace claims 250 starting credits by linking a card on the Billing page. Nothing is charged for linking. A company workspace buys a credit pack or takes a plan on the same page.

Then choose one of two credentials:

- **The playground on these pages.** Every endpoint page has a "Try it" panel that sends a real request as you, charged to your workspace. No key needed.
- **An API key**, for your own code. A workspace owner or admin creates one on the API keys page. It is shown once, so copy it somewhere safe. Put it in an environment variable rather than in your source: `export QUORUM_API_KEY=eyJ...`.

## 2. Send your first claim

```bash
curl -X POST "https://api.quorumtech.ch/attest/v1/attest" \
  -H "Authorization: Bearer $QUORUM_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "claim": "Revenue increased in FY2025.",
    "evidence": [
      {
        "id": "ev_1",
        "content": "Group revenue for FY2025 was CHF 94.0m, up from CHF 82.0m in the prior year.",
        "source": { "title": "FY2025 Annual Report" }
      }
    ]
  }'
```

```javascript
const response = await fetch("https://api.quorumtech.ch/attest/v1/attest", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.QUORUM_API_KEY}`,
    "content-type": "application/json",
  },
  body: JSON.stringify({
    claim: "Revenue increased in FY2025.",
    evidence: [
      {
        id: "ev_1",
        content: "Group revenue for FY2025 was CHF 94.0m, up from CHF 82.0m in the prior year.",
        source: { title: "FY2025 Annual Report" },
      },
    ],
  }),
});
const result = await response.json();
console.log(result.verdict, result.supportingSpans);
```

```python
import os, requests

response = requests.post(
    "https://api.quorumtech.ch/attest/v1/attest",
    headers={"Authorization": f"Bearer {os.environ['QUORUM_API_KEY']}"},
    json={
        "claim": "Revenue increased in FY2025.",
        "evidence": [
            {
                "id": "ev_1",
                "content": "Group revenue for FY2025 was CHF 94.0m, up from CHF 82.0m in the prior year.",
                "source": {"title": "FY2025 Annual Report"},
            }
        ],
    },
)
result = response.json()
print(result["verdict"], result["supportingSpans"])
```

## 3. Read the response

```json
{
  "id": "att_e707128f46434db9b7851398",
  "mode": "evidence",
  "verdict": "SUPPORTED",
  "claim": "Revenue increased in FY2025.",
  "supportingSpans": ["ev_1:0"],
  "contradictingSpans": [],
  "explanation": {
    "axes": {
      "entailment": {
        "covers_every_assertion": {
          "reasoning": "The evidence states revenue rose from CHF 82.0m to CHF 94.0m in FY2025.",
          "holds": "true",
          "spans": ["ev_1:0"]
        }
      }
    },
    "citedSpans": ["ev_1:0"],
    "availableSpans": 1
  },
  "audit": { "referentialIntegrity": 1, "explanationTrust": 1, "findings": [], "explanationDisagrees": false },
  "provenance": {
    "measurementHash": "3f9c...",
    "policyHash": "a41b...",
    "rulesApplied": ["adjacent-not-partial"],
    "promptVersion": "attest-routed-v1+adjacent-not-partial",
    "scoringVersion": "attest-scoring-v1",
    "serviceVersion": "attest-service-v0.1",
    "model": "openai/gpt-oss-120b",
    "createdAt": "2026-09-06T14:02:11.318Z"
  },
  "degraded": []
}
```

- `verdict` is the answer. `SUPPORTED` means the evidence you sent establishes the claim.
- `supportingSpans` names the sentences it rests on. `ev_1:0` is the first sentence of the evidence item you called `ev_1`. Every span id resolves to text you sent.
- `explanation` says why, axis by axis, citing spans. `audit` checks that explanation mechanically. `explanationDisagrees: true` would mean the explanation read the evidence differently from the verdict, which is a signal that the case is borderline, not an error.
- `provenance` lets you reproduce the answer later from the document you still hold.

The response headers say what it cost: `X-Credits-Charged: 1` and `X-Credits-Remaining` with your workspace's balance. A claim with its evidence in the request costs one credit, which is one cent.

## 4. Try the other verdicts

Change the evidence to `Group revenue declined to CHF 76.4m in FY2025 from CHF 82.0m.` and the verdict becomes `CONTRADICTED`, with the sentence in `contradictingSpans`. Send a claim the evidence does not address and you get `INSUFFICIENT_EVIDENCE`. Send a compound claim of which only half is covered and you get `PARTIALLY_SUPPORTED`, the verdict that most often identifies the sentence to fix.

## Next steps

- Split compound sentences into one claim each: a single verdict for a whole sentence cannot say which half failed. See Verdicts.
- Reviewing a whole document? Upload the pack once as a batch, upload the draft, and let Attest extract and check every claim. See Batches and drafts.
- Using Claude or ChatGPT? Add `https://api.quorumtech.ch/attest/mcp` as a connector and approve it with your Quorum account. See the MCP page.
