OpenCITE · Developers

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.

Contract v3 · OpenAPI 3.1 · llms.txt · base URL https://citation.today

What every answer guarantees

ExistsEach record resolves to a real work with a canonical id (DOI / PMID / PMCID / OpenAlex).
ProvenanceEach card names its upstream database (source); the answer carries meta.retrieved_at and meta.requestId.
Completenesssources[] lists which databases answered, failed or timed out. The coverage band prorates the charge — you never pay for a blind answer.
Integrity flagsevidence 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 judgementOpenCITE 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:

verifiedThe identifier resolves (and any supplied text agrees), or the free-text reference matches one real work with high confidence.
mismatchThe 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_foundNothing close enough — most likely fabricated.
ambiguousTwo 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"
ParamMeaning
qQuery (required, ≤ 512 chars). Separate up to 5 terms with ; to run them all.
limitMax results, 1–100 (default 25).
detailcompact (default: title, ≤3 authors, year, venue, doi, url, type, citedBy, evidence, one citation) or full (abstract, keywords, all authors, every citation format).
styleCitation style on compact cards: apa (default), mla, bibtex, ris, csl-json.
evidence0 to skip the integrity lookup.
formatjson (default) or a flat bibliography: mla, apa, bibtex, ris, csl-json.
sources · authors · citeAdvanced: 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

Errors

400bad_request — unknown parameter value, too many terms or refs, query too long.
401unauthorized — missing or invalid key; body carries signup_url. Keys are never accepted in the query string.
402subscription_required (free account — body carries subscribe_url and pricing) · insufficient_credits (balance, upgrade_url, packs) · spend_cap_reached · payment_failed · trial_exhausted (resets_at).
429rate_limited — Retry-After header and retry_after in the body (per key; and per IP before authentication).
503no_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.