Crossref API: Get citation
Gets a formatted citation and publication details for the best-matching Crossref work by title or DOI. Optional author and year help choose among similar works; citations reflect the metadata deposited with Crossref.
Unofficial. Not affiliated with or endorsed by Crossref.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Work, required
work Paper or book title or DOI, for example The Structure of Scientific Revolutions or 10.1038/nrd842.
The Structure of Scientific Revolutions
- Year optional
year Publication year to help select a work, for example 1996.
2012
Whole number.
- Style optional
style Citation style, for example mla.
chicago
One of
apa,mla,chicago,harvard,ieee,vancouver. Defaultapa.- Author optional
author Author to help select a work, for example Thomas S. Kuhn.
Thomas S. Kuhn
Default
.
Input as JSON
{ "work": "The Structure of Scientific Revolutions", "year": 2012, "style": "chicago", "author": "Thomas S. Kuhn"}Output
{ "doi": "10.7208/chicago/9780226458144.001.0001" , "type": "book", "year": 2012, "issue": null, "pages": null, "title": "The Structure of Scientific Revolutions", "volume": null, "authors": [ "Thomas S. Kuhn", "Ian Hacking" ], "citation": "Kuhn, Thomas S., and Ian Hacking. The Structure of Scientific Revolutions. University of Chicago Press, 2012. https://doi.org/10.7208/chicago/9780226458144.001.0001." , "doi_link": "https://doi.org/10.7208/chicago/9780226458144.001.0001" , "journal_or_publisher": "University of Chicago Press"}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"crossref.org/get_citation","input":{"work":"The Structure of Scientific Revolutions","year":2012,"style":"chicago","author":"Thomas S. Kuhn"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "crossref.org/get_citation" , "input": { "work": "The Structure of Scientific Revolutions", "year": 2012, "style": "chicago", "author": "Thomas S. Kuhn" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "crossref.org/get_citation" , "input": { "work": "The Structure of Scientific Revolutions", "year": 2012, "style": "chicago", "author": "Thomas S. Kuhn" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run crossref.org/get_citation# with {"work":"The Structure of Scientific Revolutions","year":2012,"style":"chicago","author":"Thomas S. Kuhn"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "work" ], "properties": { "work": { "type": "string", "description": "Paper or book title or DOI, for example The Structure of Scientific Revolutions or 10.1038/nrd842." }, "year": { "type": "integer", "description": "Publication year to help select a work, for example 1996." }, "style": { "enum": [ "apa", "mla", "chicago", "harvard", "ieee", "vancouver" ], "type": "string", "default": "apa", "description": "Citation style, for example mla." }, "author": { "type": "string", "default": "", "description": "Author to help select a work, for example Thomas S. Kuhn." } }, "additionalProperties": false}Output schema
{ "type": "object", "required": [ "title", "authors", "journal_or_publisher", "volume", "issue", "pages", "year", "type", "doi", "doi_link", "citation" ], "properties": { "doi": { "type": "string" }, "type": { "type": [ "string", "null" ] }, "year": { "type": [ "integer", "null" ] }, "issue": { "type": [ "string", "null" ] }, "pages": { "type": [ "string", "null" ] }, "title": { "type": [ "string", "null" ] }, "volume": { "type": [ "string", "null" ] }, "authors": { "type": "array", "items": { "type": "string" } }, "citation": { "type": "string" }, "doi_link": { "type": "string" }, "journal_or_publisher": { "type": [ "string", "null" ] } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
crossref.org/get_citation- Returns
- title, authors, journal or publisher, volume, issue, pages, year, type, DOI, formatted citation
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method crossref.org/get_citation with the inputs above.
Ask your agent
- Can you give me an APA citation for the paper with DOI 10.1126/science.1225829?
- I need an MLA reference for "Attention Is All You Need" by Vaswani, 2017 — include volume and pages if there are any.
- Look up "Deep residual learning for image recognition" on Crossref and format it in IEEE style.
- Format a Vancouver-style reference for the 2001 Nature paper on the initial sequencing and analysis of the human genome.
- Pull the Chicago citation from crossref.org for Mayr's "The Growth of Biological Thought" (1982), with publisher and year.
See more
Gets the full PubMed abstract and publication details for one article by title, PubMed link, or PubMed number (PMID). A title is searched in PubMed titles first and must closely match a found article. Some articles have no abstract or free full text.
pubmed.ncbi.nlm.nih.gov/get_articleFinds a paper on Semantic Scholar by title, DOI or Semantic Scholar link and returns its abstract, one-sentence summary, authors, publication details, citation counts and a free PDF link when there is one.
semanticscholar.org/get_paperGets an arXiv paper's title, authors, abstract, subjects, submission dates and publication details from its exact title, arXiv link or number.
arxiv.org/get_paperFinds a poem on Poetry Foundation by title (optionally by poet) and returns its full public text, poet, printed source, publication year and subject tags.
poetryfoundation.org/get_poemFinds a legal free copy of a paper by title or DOI, with its best available link and other copies. If no free copy is indexed, the copy links are null.
unpaywall.org/get_free_versionLooks up a researcher's public ORCID profile by name or ORCID iD, with employment, education, funding and up to 100 works. An institution helps tell namesakes apart; private entries are left out.
orcid.org/get_researcherSearches OpenAlex scholarly works by topic, with optional institution, publication-year and open-access filters, ranked by relevance, citations or newest date.
openalex.org/search_papersFinds a Semantic Scholar author by name (optionally limited to a listed institution), picks the best-cited matching profile and returns their impact metrics and up to 10 most-cited papers.
semanticscholar.org/get_author