Verifiable scholarly evidence for agents
Verify references before you cite them. Search 250M+ open-access papers (OpenAlex, Crossref, DOAJ, PubMed) alongside library, museum, manuscript and Islamicate archives (Europeana, DPLA, Smithsonian, Internet Archive, Open Library and more). Fetch any work by DOI, PMID, PMCID or OpenAlex id. Every card names its source and carries an integrity check; every response says which sources answered.
What every answer guarantees
| Exists | Each record resolves to a real work with a canonical id (DOI / PMID / PMCID / OpenAlex). |
| Provenance | Each card names its upstream database (source); the answer carries meta.retrieved_at and meta.requestId. |
| Completeness | sources[] lists which databases answered, failed or timed out. The coverage band prorates the charge — you never pay for a blind answer. |
| Integrity flags | evidence on each card: retracted / corrected / expression of concern (with the notice DOI and date, from Crossref + Retraction Watch and OpenAlex), work type, open-access status, DOAJ listing, licence. evidence.status is always explicit — unknown when it could not be checked. |
| Not a judgement | OpenCITE never says whether a paper's findings are true and never labels journals "predatory". Only sourced facts. |
1. Get a key (or just try verification)
Sign in at citation.today → Developers and click Create key. The key is shown once. Send it as x-api-key or Authorization: Bearer. No key? POST /api/verify works without one, up to 25 references a day per caller — the only endpoint that does.
2. Verify citations
curl -X POST https://citation.today/api/verify \
-H "x-api-key: oc_live_..." -H "content-type: application/json" \
-d '{"refs":["10.1016/S0140-6736(97)11096-0","Smith J. A study that does not exist. Nature. 2019;570:1-5."],"style":"apa"}'
Up to 50 references per call — DOIs, PMIDs, PMCIDs, DOI URLs or free-text citation strings. Each result carries a verdict:
verified | The identifier resolves (and any supplied text agrees), or the free-text reference matches one real work with high confidence. |
mismatch | The closest real work differs from what was supplied — a real DOI attached to the wrong title/authors/year, or a title that exists under other authors. mismatched_fields says what disagrees; record is the real work. |
not_found | Nothing close enough — most likely fabricated. |
ambiguous | Two or more real works match about equally; candidates lists them. |
Also returned: the canonical record, its evidence (retracted? corrected?) and a corrected citation in your style (apa, mla, bibtex, ris, csl-json). A GET /api/verify?refs=a|b form exists for simple clients.
3. Search
curl -H "x-api-key: oc_live_..." \ "https://citation.today/api/search?q=ottoman+manuscripts&limit=25&style=bibtex"
| Param | Meaning |
|---|---|
q | Query (required, ≤ 512 chars). Separate up to 5 terms with ; to run them all. |
limit | Max results, 1–100 (default 25). |
detail | compact (default: title, ≤3 authors, year, venue, doi, url, type, citedBy, evidence, one citation) or full (abstract, keywords, all authors, every citation format). |
style | Citation style on compact cards: apa (default), mla, bibtex, ris, csl-json. |
evidence | 0 to skip the integrity lookup. |
format | json (default) or a flat bibliography: mla, apa, bibtex, ris, csl-json. |
sources · authors · cite | Advanced: restrict to source ids; include author-name matches; extra citation formats on full cards. |
Response: { query, terms, coverage, sources[], count, totalCandidates, tookMs, results[], meta }. coverage is one of full · near-full · high · partial · limited; meta carries requestId, retrieved_at, creditsCharged and balance.
4. One work by any id
curl -H "x-api-key: oc_live_..." \ "https://citation.today/api/works?id=10.1038/nature14539&include=cited-by&limit=50"
id is a DOI, DOI URL, PMID, PMCID or OpenAlex W… id. Returns the canonical work, ids (doi, pmid, pmcid, openalex), its evidence and — with include=cited-by or include=refs — the citation graph. The standalone /api/citations and /api/ids calls still work.
5. MCP (Claude Code, Claude Desktop, any MCP client)
claude mcp add opencite -e OPENCITE_API_KEY=oc_live_... -- npx -y opencite-mcp
{
"mcpServers": {
"opencite": {
"command": "npx",
"args": ["-y", "opencite-mcp"],
"env": { "OPENCITE_API_KEY": "oc_live_..." }
}
}
}
Three tools: verify_citations (use before any reference list), search_papers, get_paper. Package: opencite-mcp.
Billing
- Pay as you go: $2.50 per 1,000 calls, with 1,000 calls a month included. $0 base fee, card at sign-up, invoiced monthly in arrears, and a monthly spend cap you set (default $25). Start from Developers.
- Prepaid packs at the same rate ($10 → 4,000 · $50 → 20,000 · $150 → 60,000 credits), for buyers who can't keep a card on file. Credits never expire.
- 1 credit per search or citation-graph call, prorated by coverage:
full1.0 ·near-full0.99 ·high0.95 ·partial0.5 ·limitedfree. 0.1 credit per reference verified, per identifier lookup, or per work fetched without a graph. - Spending order: your plan's monthly allowance → purchased credits → pay-as-you-go usage. A call whose upstream sources all failed is never charged; failed calls are never charged.
- Free: 25 reference verifications a day per caller, no key needed. There are no other free API credits.
GET /api/creditsreturns your balance and metered usage (free);GET /api/usage?format=csvexports your per-key, per-endpoint usage.- See the refund policy and source licensing.
Errors
400 | bad_request — unknown parameter value, too many terms or refs, query too long. |
401 | unauthorized — missing or invalid key; body carries signup_url. Keys are never accepted in the query string. |
402 | subscription_required (free account — body carries subscribe_url and pricing) · insufficient_credits (balance, upgrade_url, packs) · spend_cap_reached · payment_failed · trial_exhausted (resets_at). |
429 | rate_limited — Retry-After header and retry_after in the body (per key; and per IP before authentication). |
503 | no_sources_available — nothing was charged. |
Every response carries X-OpenCITE-API-Version: 3 and X-OpenCITE-Request-Id. Breaking changes bump the version. Evidence is refreshed daily; retraction status comes from Crossref (Retraction Watch and publisher notices) and OpenAlex.