TL;DR
Crossref is the official DOI registration agency for scholarly publications. Its REST API provides metadata for over 120 million journal articles, books, conference proceedings, datasets, and other research outputs. You can search by title, author, DOI, ORCID, funder, or publisher. Results include citation details (authors, title, journal, volume, pages, year), abstracts, references (cited-by), funding information, license, and links to full text. The API supports pagination with up to 1,000 results per page and includes facets for filtering by type, publisher, and subject.
Quick start: https://api.crossref.org/works/10.1038/nature12373
No API key needed — just make a request!
How to Use This API
1. Get Work by DOI
https://api.crossref.org/works/10.1038/nature12373
Returns full metadata for a specific DOI. Include DOI prefix and suffix.
2. Search by Title
https://api.crossref.org/works?query.title=machine+learning&rows=5
https://api.crossref.org/works?query.title=climate+change&rows=20&offset=0
Title search with rows (max 1000) and offset (0-based) for pagination.
3. Search by Author
https://api.crossref.org/works?query.author=einstein&rows=3
https://api.crossref.org/works?query.author=feynman&filter=type:journal-article
Search by author name. Combine with filter for type, year range, or publisher.
4. Search by Funder
https://api.crossref.org/funders?query=nsf
https://api.crossref.org/works?filter=funder:10.13039/100000001
First find funder IDs, then query works funded by that organization.
5. Get Works by ORCID
https://api.crossref.org/works?filter=orcid:0000-0002-1825-0097
Retrieve all works associated with a specific ORCID identifier.
6. Response Format
{
"status": "ok",
"message-type": "work",
"message": {
"DOI": "10.1038/nature12373",
"title": ["A title..."],
"author": [
{"family": "Author1", "given": "First", "sequence": "first"},
{"family": "Author2", "given": "Second"}
],
"container-title": ["Nature"],
"volume": "500",
"issue": "7462",
"page": "123-125",
"published": {"date-parts": [[2013, 7, 4]]},
"abstract": "Abstract text... ",
"is-referenced-by-count": 456,
"references-count": 30
}
}
7. JavaScript — Get Citation Info
fetch('https://api.crossref.org/works/10.1038/nature12373')
.then(r => r.json())
.then(d => {
const m = d.message;
console.log(`Title: ${m.title[0]}`);
console.log(`Authors: ${m.author.map(a => a.family).join(', ')}`);
console.log(`Journal: ${m['container-title']?.[0]}`);
console.log(`Published: ${m.published['date-parts'][0].join('-')}`);
console.log(`Cited by: ${m['is-referenced-by-count']} papers`);
});
8. Python — Search and Display Results
import requests
resp = requests.get(
'https://api.crossref.org/works',
params={'query.title': 'quantum computing', 'rows': 5}
)
data = resp.json()
for work in data['message']['items']:
authors = ', '.join(a['family'] for a in work.get('author', []))
journal = work.get('container-title', [''])[0]
year = work.get('published-print', {}).get('date-parts', [[None]])[0][0]
print(f"{work['title'][0][:80]}")
print(f" by {authors} ({year}) — {journal}")
9. Python — Paginate Through All Results
import requests
all_works = []
rows = 100
offset = 0
while True:
resp = requests.get(
'https://api.crossref.org/works',
params={
'query.title': 'climate change',
'rows': rows,
'offset': offset
}
)
data = resp.json()
items = data['message'].get('items', [])
if not items:
break
all_works.extend(items)
offset += rows
print(f"Retrieved {len(all_works)} of {data['message']['total-results']}")
print(f"Total works: {len(all_works)}")
https://api.crossref.org/works/10.1038/nature12373
Frequently Asked Questions
- What is a DOI and how does Crossref manage them?
- A Digital Object Identifier (DOI) is a persistent identifier for scholarly content. Crossref assigns DOIs to journal articles, books, datasets, and more. The DOI format is
10.PREFIX/SUFFIX(e.g.,10.1038/nature12373). - What metadata fields are available for each work?
- Title, authors (with ORCID and affiliation), publication date, journal/book name, volume, issue, pages, abstract, references, funder information, license URLs, subject areas, and links to full text. The API also returns citation counts.
- How do I paginate through large result sets?
- Use
offset(0-based) androws(max 1000) parameters. The response includestotal-resultsfor estimating total matches. Use a loop incrementing offset by rows until no results remain. - Can I get citation counts and cited-by references?
- Yes! The response includes
is-referenced-by-countshowing how many other works cite this publication. Use thereferencesendpoint for the list of works cited by this paper, and theis-referenced-byfilter for works citing it. - How do I filter by publication type or year range?
- Use the
filterparameter:filter=type:journal-article,filter=from-pub-date:2020-01-01,filter=type:book,from-pub-date:2020. Combine multiple filters with commas. Available types: journal-article, book, book-chapter, proceedings-article, dataset, dissertation, report, etc. - Is there a rate limit on the Crossref API?
- Crossref has a polite pool with rate limiting: up to 50 requests per second for unregistered users. Registering for a free API key raises this to 100 requests per second. Include your email with
?mailto=you@example.comto improve your priority.
What You Can Build
- Academic paper search engine with citation counts and author info
- Citation manager and reference generator with DOI auto-fill
- Research impact analysis tool tracking citation counts over time
- Author publication profile page with ORCID integration
- Literature review automation — search, filter, and export papers by topic
- Funder impact dashboard showing publications funded by specific grants