The API
Two endpoints. One tells you what is wrong. The other hands the draft back fixed, with a flag your pipeline can gate on.
Quick start
Base URL https://useclaimcheck.com. Authenticate with a key from your account page. Every request is JSON, every response is JSON.
curl https://useclaimcheck.com/api/v1/correct \
-H "Authorization: Bearer ck_live_..." \
-H "Content-Type: application/json" \
-d '{"text": "The Berlin Wall fell in 1999."}'That is the whole integration. There is no SDK to install and no session to manage.
POST /v1/check
Every factual claim in the draft, each with a verdict, a 0-100 score, and the source behind it. Use this when a human will read the result.
{
"check_id": "chk_...",
"summary": { "claims_found": 3, "verified": 1, "contradicted": 2 },
"claims": [
{
"text": "The Berlin Wall fell in 1999.",
"verdict": "contradicted",
"likelihood": 5,
"reasoning": "Sources agree it fell on 9 November 1989.",
"source_url": "https://en.wikipedia.org/wiki/...",
"citations": [{ "url": "...", "stance": "refutes", "says": "..." }],
"misspellings": [],
"disputed": false,
"no_trace": false
}
],
"skipped": [{ "text": "Dota 2 is toxic.", "reason": "A value judgement." }]
}likelihood is always “how likely this is true”, 0 to 100. Below 40 is contradicted, 40 to 64 unresolved, 65 and above holds up. no_trace means the subject is well documented and this specific claim appears nowhere, which is the strongest signal of a fabricated fact. disputed means credible sources actively disagree, and both sides are in citations.
POST /v1/correct
The same check, returned as edits. Use this when a program will read the result.
{
"publish_ready": false,
"corrected_text": "The Berlin Wall fell in 1989. Microsoft acquired Figma in 2024.",
"corrections": [
{
"kind": "date",
"before": "The Berlin Wall fell in 1999.",
"after": "The Berlin Wall fell in 1989.",
"why": "Sources give 1989, not 1999.",
"source_url": "https://en.wikipedia.org/wiki/..."
}
],
"needs_review": [
{
"text": "Microsoft acquired Figma in 2024.",
"verdict": "contradicted",
"likelihood": 10,
"why": "Adobe attempted it; the deal was abandoned.",
"source_url": "https://www.nytimes.com/...",
"disputed": false
}
]
}Every correction is derived, never generated. A replacement is only made when a source stated the value: a figure it gave, a spelling it used, a date it named. Nothing is rewritten by a model, so no correction can be a fluent guess. kind is spelling, figure, or date.
Anything that cannot be fixed from the evidence comes back under needs_review with its sources, and the text is left exactly as written. When two reputable sources give different years, you get the flag, not a coin flip.
Publishing workflow
The intended shape: check before you publish, gate on publish_ready, and put anything unresolved in front of a person.
const res = await fetch("https://useclaimcheck.com/api/v1/correct", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CLAIM_CHECK_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ text: draft }),
});
const { publish_ready, corrected_text, needs_review } = await res.json();
if (publish_ready) {
await cms.publish(corrected_text); // every fix already applied
} else {
await cms.saveDraft(corrected_text);
await notify(needs_review); // a human decides these
}Re-checking text that has not changed is free and does not count against your allowance, so running this on every save is fine.
Errors
Every error is { "error": { "code", "message" } }. Codes are stable; messages are for humans and may change.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The body is missing text or is not JSON. |
| 401 | invalid_api_key | The key is wrong or revoked. |
| 403 | api_not_on_plan | The key belongs to a plan without API access. |
| 413 | text_too_long | The draft is longer than your plan allows. |
| 422 | draft_declined | The model provider refused this text. Not a verdict. |
| 429 | rate_limited | Allowance spent. Retry-After says when. |
| 503 | search_unavailable | Search is down. Retry. |
A check takes 15 to 60 seconds depending on how many claims are in the draft. Set your client timeout to at least 90 seconds.
Limits and pricing
API access is on the Pro plan: $59 a month for 1,000 checks, then 6c a check beyond that. A check is one request, however many claims are in it and however long the draft is.
Both endpoints cost the same and count the same, because they run the same work. Re-checking identical text is free.
For comparison, the nearest self-serve alternative works out around 16c per verification. We are cheaper, and a check here covers a whole draft rather than a single claim.