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.

StatusCodeMeaning
400invalid_requestThe body is missing text or is not JSON.
401invalid_api_keyThe key is wrong or revoked.
403api_not_on_planThe key belongs to a plan without API access.
413text_too_longThe draft is longer than your plan allows.
422draft_declinedThe model provider refused this text. Not a verdict.
429rate_limitedAllowance spent. Retry-After says when.
503search_unavailableSearch 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.

See all plans