TruthCheck 🔍
Open source AI content verification. Score claims 0-100 and trace their origins.
Why?
AI chatbots present web content as fact. Bad actors exploit this — a BBC journalist showed he could make ChatGPT call him "the best tech journalist at eating hot dogs" with one fake article.
TruthCheck catches this:
$ truthcheck verify "Thomas Germain is the best tech journalist at eating hot dogs" --llm gemini
TruthScore: 0/100 (FALSE)
⚠️ ZERO FLAG: Content identified as satire
Install
pip install truthcheck
Setup
Search: Works out of the box with DuckDuckGo (free, no key needed).
LLM (required for --llm flag):
export GOOGLE_API_KEY=AIza... # Gemini (recommended)
# or OPENAI_API_KEY, ANTHROPIC_API_KEY
Usage
# Verify a claim (with LLM for deep analysis)
truthcheck verify "Some claim" --llm gemini
# Trace claim origin
truthcheck trace "Some claim"
# Check URL(s) — single or multiple
truthcheck check https://reuters.com
truthcheck check "Sources: https://reuters.com and https://bbc.com"
# Check publisher reputation
truthcheck lookup breitbart.com
Check URLs
Verify URLs and detect hallucinations (URLs that don't exist):
$ truthcheck check "Sources: https://reuters.com/fake-article and https://bbc.com"
URLs Found: 2
Summary: 🚨 1 broken/hallucinated URL(s) | ✅ 1 sources verified
🚨 Broken/Hallucinated URLs:
✗ https://reuters.com/fake-article (404 Not Found)
Verified URLs:
81% https://bbc.com
Also works with files:
truthcheck check -f response.txt
Trace Example
$ truthcheck trace "Thomas Germain is the best tech journalist at eating hot dogs"
🎯 ORIGIN
Domain: tomgermain.com
Date: 2026-02-05
📅 TIMELINE
🥇 [2026-02-05] tomgermain.com
🥈 [2026-02-18] bbc.com
🥉 [2026-02-18] gizmodo.com
📊 STATS
Sources: 14 | Date range: 2026-02-05 → 2026-02-19
📋 More examples: See TEST_CASES.md for detailed verification results on common misinformation claims.
Python
from truthcheck import verify_claim, trace_claim
from truthcheck.search import DuckDuckGoProvider
result = verify_claim("Earth is flat", search_provider=DuckDuckGoProvider())
print(f"TruthScore: {result.truthscore}/100")
origin = trace_claim("Some viral claim")
print(f"Origin: {origin['origin']['domain']}")
How It Works
TruthScore weighs four factors equally:
| Factor | Weight |
|---|---|
| Publisher credibility (origin) | 25% |
| Content analysis | 25% |
| Corroboration | 25% |
| Fact-checker verdicts | 25% |
Fact-checkers are weighted by their own MBFC credibility rating (reduces bias from any single source).
Zero flags (satire, self-published, fake experiments) force score to 0.
MCP Server
Works with Claude Desktop and Cursor:
{
"mcpServers": {
"truthcheck": { "command": "truthcheck-mcp" }
}
}
License
MIT
Issues · Docs · Test Cases
Metadata
Release files for truthcheck 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| truthcheck-0.4.0.tar.gz | 290.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| truthcheck-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 577.4 kB
Release files / truthcheck-0.4.0.tar.gz
| Download URL | truthcheck-0.4.0.tar.gz |
|---|---|
| Size | 290.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9d67bb5813f1f435fcaa1f2cc27420894000d7aa39052e7661037d120e596d73
|
|
BLAKE2b-256 checksum How to use checksums |
0e26a02e08488ef9d049a108ba6f6e0d485cfcc1e55a4910d1cfe9ae7f619538
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|
Release files / truthcheck-0.4.0-py3-none-any.whl
| Download URL | truthcheck-0.4.0-py3-none-any.whl |
|---|---|
| Size | 287.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
aebd0a87c11a8e889410a38e325f01adfa1605ebb924812cc5f560a10a1710a3
|
|
BLAKE2b-256 checksum How to use checksums |
246bc11d54ec8276a8a439ee363c0ac26ae59683146633fd6230a030065bd351
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|