API Reference
Base URL: https://api.factivelabs.com
All endpoints require Bearer token authentication unless noted. Responses are JSON.
POST /api/v1/verify
Submit content for fact-checking. Extracts individual claims and verifies each one against web sources. Supports three response modes: synchronous, streaming (SSE), and asynchronous (job polling).
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| content | string | Required | The text to verify, or a URL pointing to content. Maximum length depends on your plan (Free: 10K chars, Pro: 50K, Enterprise: 100K). |
| mode | string | Required | Content type. One of: text, url, youtube, tiktok, pdf, docx, image. |
| stream | boolean | Optional | Enable Server-Sent Events streaming. Default: false. When true, response is streamed as SSE events. |
| async | boolean | Optional | Enable async mode. Default: false. When true, returns a job ID immediately for polling. |
| filter_tables | boolean | Optional | Skip granular table/statistical claims that are hard to verify. Default: true. |
Response (Synchronous)
{
"id": "ver_abc123def456",
"status": "completed",
"claims": [
{
"text": "The Earth is approximately 4.5 billion years old",
"verdict": "confirmed",
"explanation": "Scientific evidence from radiometric dating consistently supports...",
"sources": [
{
"title": "Age of Earth - USGS",
"url": "https://www.usgs.gov/...",
"snippet": "The age of the Earth is estimated at 4.54 billion years..."
}
],
"offset": {"start": 0, "end": 49}
}
],
"usage": {
"claims_extracted": 1,
"claims_verified": 1,
"content_length": 49
}
}
Response (Async)
{
"job_id": "job_xyz789",
"status": "processing"
}
SSE Events (Streaming)
event: claim
data: {"text": "...", "verdict": "confirmed", "explanation": "...", "sources": [...]}
event: done
data: {"claims_total": 3, "usage": {"claims_extracted": 3, "claims_verified": 3}}
POST /api/v1/extract
Extract individual claims from content using ProRata's extraction engine. No verification is performed — returns claims only. Significantly faster and cheaper than the verify endpoint.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| content | string | Required | The text to extract claims from. Maximum length depends on plan. |
| content_type | string | Required | Input format: text, url, youtube, tiktok, pdf, docx, image. |
| max_claims | integer | Optional | Maximum claims to extract (1-500). Default: 100. |
| context | string | Optional | Additional context to improve extraction accuracy. |
| skip_table_claims | boolean | Optional | Filter out granular table/statistical claims. Default: true. |
Response
{
"id": "ex_abc123def456",
"status": "complete",
"claims": [
{
"text": "The Earth is approximately 4.5 billion years old",
"sentence": "The Earth is approximately 4.5 billion years old.",
"start_offset": 0,
"end_offset": 49,
"filtered": false
}
],
"claims_count": 1,
"processing_time_ms": 820,
"usage": {
"claims_extracted": 1,
"claims_filtered": 0,
"content_length": 49,
"cost_usd": 0.002
}
}
GET /api/v1/jobs/{id}
Check the status of an async verification job. Poll this endpoint after submitting a request with "async": true.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| job_id | string | Required | The job ID returned from the verify endpoint when using async mode. |
Response (Processing)
{
"job_id": "job_xyz789",
"status": "processing",
"progress": 0.45,
"claims_so_far": 3
}
Response (Completed)
{
"job_id": "job_xyz789",
"status": "completed",
"claims": [...],
"usage": {
"claims_extracted": 12,
"claims_verified": 12,
"content_length": 4521
}
}
Response (Failed)
{
"job_id": "job_xyz789",
"status": "failed",
"error": "Content extraction failed: unable to parse PDF"
}
POST /api/v1/verify/batch
Submit multiple documents for verification in a single request. Each item is processed independently.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| items | array | Required | Array of verification requests. Each item has content and mode fields. Max items: Free 5, Pro 50, Enterprise 100. |
Request Example
{
"items": [
{"content": "The speed of light is 300,000 km/s", "mode": "text"},
{"content": "https://example.com/article", "mode": "url"},
{"content": "Water boils at 100 degrees Celsius at sea level", "mode": "text"}
]
}
Response
{
"results": [
{"id": "ver_001", "status": "completed", "claims": [...], "usage": {...}},
{"id": "ver_002", "status": "completed", "claims": [...], "usage": {...}},
{"id": "ver_003", "status": "completed", "claims": [...], "usage": {...}}
],
"total_usage": {
"claims_extracted": 5,
"claims_verified": 5,
"items_processed": 3
}
}
GET /health
Health check endpoint. No authentication required.
Response
{"status": "ok", "version": "1.0.0"}
Claim Object
Represents a single extracted and verified claim.
| Field | Type | Description |
|---|---|---|
| text | string | The claim text, with coreferences resolved (pronouns replaced with names). |
| verdict | string | One of: confirmed, disputed, inconclusive. |
| explanation | string | Plain-English explanation of why the claim received this verdict. |
| sources | array[Source] | Array of source citations supporting the verdict. |
| offset | object | {"start": int, "end": int} — character positions in the original content. |
ExtractedClaim Object
Represents a single extracted claim (no verification data).
| Field | Type | Description |
|---|---|---|
| text | string | The extracted claim text, self-contained and verifiable. |
| sentence | string | Original sentence from which the claim was extracted. |
| start_offset | integer | Character start position in the source text (nullable). |
| end_offset | integer | Character end position in the source text (nullable). |
| filtered | boolean | True if the claim was flagged as granular table data by the filter. |
Source Object
| Field | Type | Description |
|---|---|---|
| title | string | Title of the source page or document. |
| url | string | URL to the source. |
| snippet | string | Relevant excerpt from the source. |
Usage Object
| Field | Type | Description |
|---|---|---|
| claims_extracted | integer | Number of claims extracted from the content. |
| claims_verified | integer | Number of claims that were verified (may be less if table filter is on). |
| content_length | integer | Character length of the input content. |
Error Object
| Field | Type | Description |
|---|---|---|
| error.code | string | Machine-readable error code (e.g., rate_limit_exceeded, invalid_api_key). |
| error.message | string | Human-readable error description. |
| error.retry_after | integer | Seconds to wait before retrying (for rate limit errors). |