Crossref

Academic API · Works globally · 120M+ scholarly records · DOI registration agency

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)}")
Try it: 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) and rows (max 1000) parameters. The response includes total-results for 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-count showing how many other works cite this publication. Use the references endpoint for the list of works cited by this paper, and the is-referenced-by filter for works citing it.
How do I filter by publication type or year range?
Use the filter parameter: 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.com to improve your priority.

What You Can Build