Developers
Reliability API is a REST API and an MCP server. Ask for a subject by name and get its report, every claim behind it, and the evidence for each verdict.
Quick start
Get a key
Access is by invitation while the method is being validated. Request access, then send the key with every request as
Authorization: Bearer <key>.Ask for a report
POST /v1/reportswith a name, and a URL that identifies the subject if the name could be ambiguous.Request a report curl -X POST https://www.epistacklabs.com/v1/reports \ -H "Authorization: Bearer $RAPI_API_KEY" \ -H "Content-Type: application/json" \ -d '{"name": "Ørsted", "urls": ["https://orsted.com"]}'A stored report comes back at once with status 200. Otherwise a job starts and you get 202 with its id.
Response 200: a stored report, abridged { "report_id": "rep_…", "status": "complete", "generated_at": "…", "stale": false, "report": { "subject": { … }, "method_version": "0.1.0+461aa947", "review_status": "machine-generated, unreviewed", "scores": { "factual": { "score": …, "interval_80": [ …, … ], "n_resolved": …, "confidence": { "level": "medium", "reasons": "…" } }, "promise": { … }, "prediction": { … }, "overall": { … } }, "featured_claims": [ … ], "caveats": [ … ] }, "html_url": "/v1/reports/rep_…/html" }Response 202: a job has started { "job_id": "job_…", "status": "queued", "poll": "/v1/reports/job_…" }Poll the job
GET /v1/reports/{id}with the job id until its status iscomplete. The finished report is in the same response.Poll the job curl https://www.epistacklabs.com/v1/reports/job_… \ -H "Authorization: Bearer $RAPI_API_KEY"Read every claim
GET /v1/subjects/{id}/claimsreturns each claim with its quote, source, fixed test, outcome and verified evidence.Every claim behind the report curl "https://www.epistacklabs.com/v1/subjects/<subject_id>/claims?claim_type=promise&page_size=50" \ -H "Authorization: Bearer $RAPI_API_KEY"One claim, abridged { "claim_id": "…", "claim_type": "promise", "quote": "…", "quote_verified": true, "said_on": "…", "source": { "url": "…", "title": "…", "outlet": "…", "published": "…" }, "resolution_criteria": "…", "outcome": "false", "on_time": false, "rationale": "…", "evidence": [ { "url": "…", "publisher": "…", "published": "…", "quote": "…", "independent_of_subject": true } ], "judges_disagree": false, "responses": [ ], "review_status": "machine-generated, unreviewed" }
Check a block of text. POST /v1/check takes a page or a draft, or a list of claims each with an optional source, and returns an outcome for each claim with no score. It runs as a job, and the text is deleted from the job when it ends.
curl -X POST https://www.epistacklabs.com/v1/check \
-H "Authorization: Bearer $RAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "…", "author": "…", "said_on": "2026-10-01"}'
Send a reply. POST /v1/responses stores a reply or correction to a claim, with counter-evidence. It is shown on the claim as “response received, not yet reviewed”.
curl -X POST https://www.epistacklabs.com/v1/responses \
-H "Authorization: Bearer $RAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"claim_id": "…", "name": "…", "role": "the subject",
"statement": "…", "counter_evidence_url": "https://…"}'
Endpoints
- POST
/v1/reportsA subject’s report: stored at once, or a job (202). - GET
/v1/reports/{id}A job’s status and, when complete, its report; or a stored report. - GET
/v1/reports/{id}/htmlThe same report as a readable page. - GET
/v1/subjects/{id}/claimsEvery claim, filterable by type, broad topic and outcome. - POST
/v1/subjects/resolveFind a subject, or the people and organisations a text names. - POST
/v1/checkOutcomes for the claims in a text, with no score. - POST
/v1/responsesA reply to a claim, with counter-evidence. - GET
/v1/methodologyThe method version and the published method.
MCP server
For assistants and research platforms. Three tools wrap the REST API, with no logic of their own.
lookup_reliability(name, topic?)A subject’s report: scores for factual claims, promises and predictions, with ranges, confidence and featured claims. Call again later to collect a report that was still being made.
check_claims(text)Outcomes and evidence for the claims in a text, with no overall score. Runs as a job of a few minutes.
get_evidence(subject_id, claim_id)Everything behind one claim: the quote and source, the fixed test, the outcome with its reasoning, the evidence and any reply.
RAPI_API_URL=https://www.epistacklabs.com RAPI_API_KEY=rapi_… python -m rapi.mcp_server
Speed
- A stored report
- Under a second
- A new subject
- 10 to 17 minutesThen stored for the next caller
- Stored reports
- 90 daysThen served marked stale while a refresh runs
Limits
- Requests
- 60 a minutePer key
- Report and check jobs
- 20 a dayPer key
- Request size
- 256 KBText up to 50,000 characters
The review label
Every report and every claim carries "review_status": "machine-generated, unreviewed" until a person has reviewed it. If you show a verdict or a score, show the label with it.
Errors
- 401
missing or invalid API keySend the key as a bearer token. - 409
name matches more than one subjectThe response lists the candidates; sendsubject_id. - 413
request body over the limitSend less text, or split it. - 429
rate limit or daily job limitWait and try again; stored reports are not affected by the job limit. - 503
daily spending limit reachedNew jobs resume the next day.
Full reference
The OpenAPI document lists every endpoint, field and response. It is at /openapi.json and readable with a key.