The Hidden Giant of Academic APIs
Everyone talks about Google Scholar, but Crossref quietly indexes 140 million+ scholarly works with a completely free API. No API key. No signup. No rate limit headaches.
If you need DOI metadata, citation counts, journal information, or funder data — Crossref is the canonical source. Most academic publishers register their DOIs here.
Quick Start: Search by Keyword
import requests
def search_papers(query, rows=5):
url = "https://api.crossref.org/works"
params = {
"query": query,
"rows": rows,
"sort": "relevance",
"select": "DOI,title,author,published-print,is-referenced-by-count"
}
# Polite pool: add your email for faster responses
headers = {"User-Agent": "MyApp/1.0 (mailto:your@email.com)"}
resp = requests.get(url, params=params, headers=headers)
for item in resp.json()["message"]["items"]:
title = item["title"][0] if item.get("title") else "No title"
citations = item.get("is-referenced-by-count", 0)
doi = item["DOI"]
year = item.get("published-print", {}).get("date-parts", [[None]])[0][0]
print(f"[{year}] {title}")
print(f" DOI: {doi} | Citations: {citations}")
print()
search_papers("machine learning healthcare")
Look Up Any DOI Instantly
def get_doi_metadata(doi):
resp = requests.get(f"https://api.crossref.org/works/{doi}")
work = resp.json()["message"]
print(f"Title: {work['title'][0]}")
print(f"Journal: {work.get('container-title', ['N/A'])[0]}")
print(f"Publisher: {work['publisher']}")
print(f"Citations: {work['is-referenced-by-count']}")
print(f"Type: {work['type']}")
if work.get("author"):
authors = ", ".join(f"{a.get('given','')} {a.get('family','')}" for a in work["author"][:5])
print(f"Authors: {authors}")
# The famous "Attention Is All You Need" paper
get_doi_metadata("10.48550/arXiv.1706.03762")
Find All Papers by an Author
def author_papers(name, rows=10):
resp = requests.get("https://api.crossref.org/works", params={
"query.author": name,
"rows": rows,
"sort": "is-referenced-by-count",
"order": "desc"
})
for item in resp.json()["message"]["items"]:
title = item["title"][0] if item.get("title") else "N/A"
citations = item.get("is-referenced-by-count", 0)
print(f" {citations} citations | {title[:80]}")
author_papers("Yann LeCun")
Get Journal Metrics
def journal_info(issn):
resp = requests.get(f"https://api.crossref.org/journals/{issn}")
journal = resp.json()["message"]
print(f"Title: {journal['title']}")
print(f"Publisher: {journal['publisher']}")
print(f"Total DOIs: {journal['counts']['total-dois']}")
print(f"Subjects: {', '.join(s['name'] for s in journal.get('subjects', []))}")
# Nature
journal_info("0028-0836")
Track Funder Information
def funder_search(name):
resp = requests.get("https://api.crossref.org/funders", params={
"query": name, "rows": 3
})
for f in resp.json()["message"]["items"]:
print(f"{f['name']} ({f['location']}) — {f.get('work-count', 0)} works funded")
funder_search("National Science Foundation")
Pro Tips
-
Polite Pool: Add
mailto:your@email.comin User-Agent for 50x faster responses -
Select fields: Use
select=DOI,titleto get smaller responses -
Cursor pagination: For large result sets, use
cursor=*instead ofoffset -
Filters:
filter=from-pub-date:2024,type:journal-articlenarrows results
Crossref vs OpenAlex vs Semantic Scholar
| Feature | Crossref | OpenAlex | Semantic Scholar |
|---|---|---|---|
| Records | 140M+ | 250M+ | 200M+ |
| API Key | No | No | Free (recommended) |
| DOI Metadata | Canonical source | Via Crossref | Partial |
| Citation Graph | Basic | Full | Full |
| Author Profiles | Limited | Full (h-index) | Full |
| Abstracts | Rarely | Often | Usually |
| Best For | DOI lookup, metadata | Discovery, analytics | NLP, recommendations |
Use together: Search OpenAlex for discovery → get canonical metadata from Crossref → enrich with Semantic Scholar for abstracts and recommendations.
All Endpoints
| Endpoint | Description |
|---|---|
/works |
Search all 140M+ works |
/works/{doi} |
Get metadata by DOI |
/journals/{issn} |
Journal information |
/funders |
Research funders |
/members |
Publishers |
/types |
Work types (article, book, etc.) |
/prefixes/{prefix} |
DOI prefix info |
Full docs: api.crossref.org
What's your go-to API for academic research? I'm building a collection of free academic APIs — contributions welcome!
I write practical API tutorials every week. Follow for more.
More from me: 10 Dev Tools I Use Daily | 77 Scrapers on a Schedule | 150+ Free APIs
Top comments (0)