DEV Community

Alex Spinov
Alex Spinov

Posted on

Crossref API: Search 140M+ Academic Papers by DOI, Author, or Journal (Free, No Key)

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")
Enter fullscreen mode Exit fullscreen mode

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")
Enter fullscreen mode Exit fullscreen mode

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")
Enter fullscreen mode Exit fullscreen mode

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")
Enter fullscreen mode Exit fullscreen mode

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")
Enter fullscreen mode Exit fullscreen mode

Pro Tips

  1. Polite Pool: Add mailto:your@email.com in User-Agent for 50x faster responses
  2. Select fields: Use select=DOI,title to get smaller responses
  3. Cursor pagination: For large result sets, use cursor=* instead of offset
  4. Filters: filter=from-pub-date:2024,type:journal-article narrows 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)