Extract claims
An opinion piece, a press release or a debate transcript is a mix of framing, opinion and a handful of concrete assertions that are actually true or false — and separating that handful from everything around it is usually the slowest part of fact-checking. This claim extraction endpoint reads an argument and returns only the discrete, checkable statements it makes, stripped of the rhetoric wrapped around them.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
What we mean by a claim
Not every sentence in an argumentative text is a claim in the useful sense — 'this is deeply concerning' is opinion, while 'unemployment rose by two points last quarter' is a claim, because it asserts something specific enough that it could, in principle, be checked against evidence. This endpoint is built to separate the two, returning statements that carry a verifiable assertion and leaving aside the framing, tone and rhetorical questions that surround them.
Who spends hours doing this by hand today
Fact-checkers building a queue of statements to verify from a politician's speech, journalists preparing to source-check a press release before publishing, researchers coding argumentative structure in persuasive writing, and PR or comms teams auditing their own draft statements for anything that could be challenged all currently do this manually — reading line by line and pulling out anything that sounds like an assertion of fact.
How the extraction reads an argument
POST /text/extract-claims returns each claim as a standalone statement, phrased close to the original wording so the extracted version can still be attributed accurately to the source text. Where a sentence bundles a claim together with an opinion — 'predictably, the report shows revenue fell 12 percent' — the extraction isolates the checkable part, the revenue figure, without also asserting the framing word 'predictably' as if it were a fact.
A brief note on claim versus opinion
The distinction between fact and opinion has been a working concern of argumentation theory and journalism ethics for a long time, well before automated tools existed to help with it, precisely because the two get blended constantly in persuasive writing — sometimes deliberately, to lend the weight of fact to a subjective judgment. Reading for that boundary consistently, across a large volume of text, is the specific job this endpoint does.
Where it fits into a verification or editorial pipeline
The call is asynchronous: submit an article or transcript, get a task_id immediately, and receive the extracted claims by signed webhook once processing finishes, or via a signed link held for 24 hours. Pricing runs per request plus a per-word rate, so a short press release costs a fraction of a long transcript, and a task that fails after its retries is never charged — you only pay for claims actually delivered.
What you can do with it
Building a fact-check queue from a speech
Extract every checkable claim from a political speech transcript to build a prioritized list of statements a fact-checking team should verify first.
Pre-publication source review
Pull the discrete claims out of a press release before publishing so an editor can confirm each one has a supporting source on file.
Argumentative structure analysis
Separate claims from opinion and framing in a corpus of opinion columns as part of a research project studying persuasive writing techniques.
Internal comms risk review
Scan a draft public statement for factual claims that could be challenged or misquoted before it goes out under the company's name.
FAQ
How does the claim extraction API work?
Send text to POST /text/extract-claims, receive a task_id immediately, and get the list of extracted claims by webhook or a signed link once the task completes.
How is a claim different from an opinion in this context?
A claim asserts something specific enough to be checked against evidence, like a statistic or an event; an opinion expresses a judgment that can't be verified the same way, and the endpoint is built to separate the two rather than extract every sentence indiscriminately.
Does it fact-check the claims it finds?
No, it isolates and returns the checkable statements themselves; verifying whether each claim is true is a separate step left to the fact-checker or researcher using the output.
Is there a free tier for testing this out?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
What does claim extraction cost?
It's $0.003 per request plus $0.0135 per 1,000 words of input, and billing applies only to tasks that complete — a failed task after retries is never charged.
Can I run this on a large batch of articles at once?
Yes, each document is submitted as an independent asynchronous task, so you can process many articles or transcripts in parallel and collect results as each webhook arrives.
Does it preserve the original wording of each claim?
Extracted claims stay close to the original phrasing rather than being rewritten, which keeps them attributable back to the exact statement in the source text.
What happens with sentences that mix a claim and an opinion?
The extraction isolates the checkable portion of the sentence and leaves the opinion or framing language aside, rather than returning the whole sentence as if all of it were verifiable.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/text/extract-claims \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"…"}'const res = await fetch("https://api.kit.forhosting.com/text/extract-claims", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/extract-claims",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/extract-claims", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/extract-claims", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "…"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.extract_claims",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_tokens | 20000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
422 | task_failed | The task failed after 3 retries. You are never charged for it. |