Public API
Read-only access to What The Fact's article, outlet and bias data, plus the cross-product accountability signals behind Cross-Watch. No key is required to start — anonymous callers are simply limited per IP. A free key raises your limits and, more usefully, gives you your own budget instead of one shared with everyone behind your network address.
Authentication
Send your key in either header. Both are accepted; pick whichever your client makes easy.
X-API-Key: wtf_yourprefix_yoursecret
# or, equivalently
Authorization: Bearer wtf_yourprefix_yoursecret
Sign in to get a free key →
Rate limits
These are the numbers the edge actually enforces — this table is generated
from the running policy, not written by hand. Limits are aggregate across
our workers. When you exceed one you get 429 with a
Retry-After header; honour it rather than retrying immediately.
| Plan | Category | Requests | Per |
|---|---|---|---|
| anonymous | default | 60 | minute |
| expensive | 5 | hour | |
| proxy_read | 60 | minute | |
| score | 5 | day | |
| write | 10 | hour | |
| keyed | default | 600 | minute |
| expensive | 25 | hour | |
| proxy_read | 600 | minute | |
| score | 50 | day | |
| write | 60 | hour | |
| paid | default | 6000 | minute |
| expensive | 200 | hour | |
| proxy_read | 6000 | minute | |
| score | 500 | day | |
| write | 600 | hour |
anonymous — no key. keyed — any free key. paid — a key or session with an active What The Fact subscription. Categories: default and proxy_read are ordinary reads; write covers submissions such as flagging; expensive and score run real language-model work and are budgeted accordingly.
Endpoints
| Method | Path | Returns |
|---|---|---|
| GET | /api/v1 | Index of available endpoints |
| GET | /api/v1/articles | Recent articles with bias scores |
| GET | /api/v1/sources | Tracked outlets and their aggregate lean |
| GET | /api/v1/bias-distribution | Distribution of scores across coverage |
| GET | /api/v1/blindspot | Stories covered by one side only |
| GET | /api/v1/divergence | English vs French coverage divergence |
| GET | /api/v1/outlets/<id>/bias-trend | An outlet's lean over time |
| GET | /api/cross-watch/entities | Entities in the shared accountability graph |
| GET | /api/cross-watch/search | Free-text search across signal types |
Fair use
Every request costs us something and the expensive categories cost real
compute. Cache what you can, honour Retry-After, and give your
key a label so we can tell you which integration is misbehaving before we
have to revoke it. Keys are free — if the limits genuinely do not fit what
you are building, get in touch rather than rotating keys around them.