Real-Check API
A REST API for the same fact-check + scam-detection engine that powers real-check.org. Text, image, and voice — one endpoint each, one JSON contract.
1. Base URL & authentication
All requests go through https://real-check.org/api. Pass your key on every request as a bearer token:
Authorization: Bearer rc_live_YOUR_KEY_HEREhttpKeys look like rc_live_ followed by 32 hex characters. Anonymous requests (no key) still work but are rate-limited to 5/hour per IP.
2. Endpoints
| Method | Path | What it does |
|---|---|---|
| POST | /api/factcheck | Fact-check a text claim or detect a scam. |
| POST | /api/factcheck/image | Analyze an image (screenshot, meme, headline). |
| POST | /api/factcheck/voice | Transcribe & fact-check an audio recording. |
| GET | /api/stats/truth-score | Live counters + verdict distribution. |
| GET | /api/trending | Recent public fact-check results. |
3. Quickstart · cURL
curl -X POST https://real-check.org/api/factcheck \
-H "Authorization: Bearer rc_live_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"claim": "Humans only use 10% of their brain.",
"mode": "auto"
}'bashmode accepts auto (default), factcheck, or scam.
4. Response shape
{
"check_id": "fc_abc123",
"claim": "Humans only use 10% of their brain.",
"verdict": "false",
"confidence": 96,
"summary": "Neuroimaging studies show humans use virtually all brain regions...",
"red_flags": ["myth", "commonly misattributed"],
"sources": [],
"created_at": "2026-07-22T09:14:43Z"
}jsontrue · mostly_true · misleading · false · unverifiedsafe · likely_safe · suspicious · scam · unverified5. JavaScript / fetch
// browser / Node.js
const res = await fetch("https://real-check.org/api/factcheck", {
method: "POST",
headers: {
"Authorization": "Bearer " + REAL_CHECK_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
claim: "The Great Wall is visible from space.",
mode: "auto",
}),
});
const data = await res.json();
console.log(data.verdict, data.confidence, data.summary);js6. Embeddable verdict badge — one snippet, any site
Drop a live "Verified by Real-Check" badge on any article or blog post. No key required — the badge is cached per-claim for 24 hours and rate-limited to protect the pipeline.
<!-- Place anywhere in the article -->
<div class="real-check"
data-claim="Humans only use 10% of their brain."></div>
<!-- Once per page, near </body> -->
<script async src="https://real-check.org/badge.js"></script>htmlAuto-detects new nodes via MutationObserver so it works on React / Vue / Next pages. Click the badge to open the full verdict on real-check.org.
7. Chrome extension — full working example
Right-click any highlighted text on any page → fact-check it in a single click. Two files. Copy, paste, load unpacked, done.
manifest.json
{
"manifest_version": 3,
"name": "Real-Check",
"version": "1.0.0",
"description": "Right-click any text to fact-check it with Real-Check.",
"permissions": ["contextMenus", "storage", "activeTab", "scripting"],
"host_permissions": ["https://real-check.org/*"],
"background": { "service_worker": "background.js" },
"action": { "default_title": "Real-Check" }
}jsonbackground.js
// background.js — Chrome extension service worker
const API = "https://real-check.org/api/factcheck";
// Hard-code your key or load it from chrome.storage
async function getKey() {
const { rc_key } = await chrome.storage.local.get("rc_key");
return rc_key;
}
chrome.runtime.onInstalled.addListener(() => {
chrome.contextMenus.create({
id: "rc-check",
title: "Fact-check with Real-Check",
contexts: ["selection"],
});
});
chrome.contextMenus.onClicked.addListener(async (info, tab) => {
if (info.menuItemId !== "rc-check" || !info.selectionText) return;
const key = await getKey();
if (!key) return alert("Add your Real-Check API key first (Options).");
const res = await fetch(API, {
method: "POST",
headers: {
"Authorization": "Bearer " + key,
"Content-Type": "application/json",
},
body: JSON.stringify({ claim: info.selectionText, mode: "auto" }),
});
const data = await res.json();
chrome.scripting.executeScript({
target: { tabId: tab.id },
func: (v) => alert("Real-Check verdict: " + v.verdict.toUpperCase()
+ " (" + v.confidence + "%)\n\n" + v.summary),
args: [data],
});
});jsStore the key with chrome.storage.local.set({rc_key: "rc_live_..."}) from an options page. Never bundle it in source you publish publicly.
8. Rate limits & quotas
Anonymous (no key)
per IP address
Free plan key
per key
Pro plan key
100,000 / day soft cap
Exceeded quotas return HTTP 429 with a JSON body describing which limit was hit.