Developers · API v2
Check citations from your own software
Send TrueCite a list of case citations; it tells you, for each one, whether that citation identifies a real judgment in its source records, and what evidence the finding rests on. Use it to catch invented or mistyped citations in AI-drafted documents before they are filed.
- What it checks: that the citation (and the case name, if you send one) matches a judgment in the court listings and records TrueCite holds, with dated source evidence.
- What it does not check: quotations, paragraph content, legal propositions or whether the case is still good law. An
UNRESOLVEDresult is never a finding that a case does not exist. - How it works: one HTTPS endpoint, JSON in and out, a bearer key, and an idempotency key so retries are safe.
Your API keys
Sign in to create a key. Keys belong to your TrueCite account. You can read the documentation below without signing in.
429 QUOTA_EXHAUSTED until the next month — there is no overage. For production volumes, see production keys and plans, or contact us.
Your new key. Copy it now — it is shown only once and TrueCite cannot show it again (we store only a hash).
| Name | Key | Mode | Created | Last used | This month | Status |
|---|
No keys yet. Create one above.
Treat keys like passwords: server-to-server only. Never put a key in browser JavaScript, a URL, screenshots or tickets. If a key leaks, revoke it here — it stops working on the next request.
Production keys and plans
Production keys run against the production ledger with a monthly allowance set by your plan. Prices are in Australian dollars and include GST for Australian companies. UK companies pay the sterling prices shown on truecite.uk; other overseas businesses pay the Australian-dollar price less GST (GST-free export).
- Pay as you go — A$0.10 per check, billed monthly in arrears, up to a monthly cap.
- Monthly 4,000 — A$300 per month, including 4,000 checks.
- Monthly 30,000 — A$800 per month, including 30,000 checks.
No overage on any plan: when the checks run out, API requests stop (429 QUOTA_EXHAUSTED) until the next month or an upgrade. Getting a production key takes four steps: verify your business (Australian companies: ABN, checked against the Australian Business Register; UK companies: Companies House number, verified by us), accept the API agreement, add a card via Revolut, then create the key.
Quickstart
Every call to POST /api/v2/verify needs three headers: Authorization: Bearer <your key>, Content-Type: application/json, and an Idempotency-Key (8–128 letters, digits, . _ : -). Send 1–100 citations per request.
curl
export TRUECITE_KEY="tcs_…" # your key
curl -sS https://truecite.com.au/api/v2/verify \
-H "Authorization: Bearer $TRUECITE_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"items":[{"item_id":"c1","citation":"[2024] HCA 32"}]}'JavaScript (Node 18+, server-side)
const res = await fetch('https://truecite.com.au/api/v2/verify', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TRUECITE_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({ items: [{ item_id: 'c1', citation: '[2024] HCA 32' }] }),
});
if (!res.ok) throw new Error(`TrueCite ${res.status}: ${(await res.json()).error_code}`);
const { run_id, results } = await res.json();
for (const r of results) {
console.log(r.item_id, r.original_citation, r.existence_status, r.reason_codes);
}Reading the result
VERIFIED_EXISTS— the citation matched a source record;evidence_basisandsource_observed_atsay which record and when.IDENTITY_CONFLICT— the citation or case name conflicts with the record. Review it.UNRESOLVED— TrueCite could not confirm it (outside coverage, incomplete or ambiguous). Check by hand; it is not a finding of nonexistence.
Retrying with the same Idempotency-Key and body returns the original result (Idempotent-Replayed: true) and uses no extra quota. On 429, wait for Retry-After.
Check your usage
curl -sS https://truecite.com.au/api/v2/usage -H "Authorization: Bearer $TRUECITE_KEY"Use with your own MCP client
The TrueCite MCP server at https://truecite.com.au/mcp accepts the same API key as the REST API. Send it as Authorization: Bearer <your key>. MCP calls use the same allowance, rate limits and sandbox or production mode as POST /api/v2/verify. When the monthly allowance is used up, calls are refused with HTTP 429 and QUOTA_EXHAUSTED, and nothing is charged. The tools are verify_citation_identities, verify_entity_identities, get_usage and get_coverage. Claude.ai and ChatGPT connectors do not need a key: add TrueCite from the connector directory and sign in.
Your key is a secret. Keep it in a user-level config file or a prompted input, never in a repository. A revoked key stops working on the next call.
Claude Desktop (via mcp-remote)
Add this to claude_desktop_config.json (Settings → Developer → Edit Config), then restart Claude Desktop. It needs Node.js 18 or later.
{
"mcpServers": {
"truecite": {
"command": "npx",
"args": [
"-y", "mcp-remote", "https://truecite.com.au/mcp",
"--header", "Authorization:${TRUECITE_AUTH}"
],
"env": { "TRUECITE_AUTH": "Bearer tcs_…" }
}
}
}Cursor (~/.cursor/mcp.json)
{
"mcpServers": {
"truecite": {
"url": "https://truecite.com.au/mcp",
"headers": { "Authorization": "Bearer tcs_…" }
}
}
}VS Code (.vscode/mcp.json)
VS Code asks for the key the first time and stores it securely, so this file can be committed.
{
"inputs": [
{ "type": "promptString", "id": "truecite-key", "description": "TrueCite API key", "password": true }
],
"servers": {
"truecite": {
"type": "http",
"url": "https://truecite.com.au/mcp",
"headers": { "Authorization": "Bearer ${input:truecite-key}" }
}
}
}Any client: list the tools with curl
curl -sS https://truecite.com.au/mcp \
-H "Authorization: Bearer $TRUECITE_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'An invalid, expired or revoked key gets 401 with WWW-Authenticate: Bearer … error="invalid_token". A request with no key gets the standard OAuth challenge used by directory connectors.
Reference
- OpenAPI 3.1 contract (
GET /api/v2/openapi.json, public) - Current coverage (
GET /api/v2/coverage, public) — read this before interpreting a miss. - Errors return
error_codeandmessage.401missing, invalid, expired or revoked key;403wrong scope or origin;409idempotency conflict;429rate limit, orQUOTA_EXHAUSTEDwhen the monthly allowance is used up (the body carriesupgrade.url; no overage is ever charged);503service could not complete — no finding is implied. - Results are informational. The per-response
billablefield is alwaysfalse: production plans are billed by monthly subscription, not per response. See the terms and integration overview.