OpenCitations API: Build Citation Graphs from 1.6 Billion Open Citation Links
Pull all citing papers and cited references for any DOI from OpenCitations' 1.6B citation index. Build citation networks, map research influence, and run bibliometric analysis without a subscription.
The actor referenced in this article. Pay only for results delivered.
Web of Science charges thousands per seat per year to access citation data. OpenCitations publishes the same citation links as open data under CC0. Our OpenCitations Scraper wraps their API into a clean interface: give it a DOI, get back every paper that cites it and every reference it cites.
What is OpenCitations
OpenCitations is a scholarly infrastructure project that collects and publishes open bibliographic and citation data. Their COCI dataset covers over 1.6 billion citation links extracted from Crossref, PubMed Central, and other sources. Every link is freely available under CC0 with no access fees.
What you get per citation
citing_doi— DOI of the paper that cites your targetcited_doi— DOI of the paper being citedcreation— date the citation link was recordedtimespan— time between publication dates of the two papersjournal_sc— whether both papers are in the same journalauthor_sc— whether both papers share an author
Python example
import requests, time
run = requests.post(
"https://api.apify.com/v2/acts/themineworks~opencitations-citation-graph/runs",
headers={"Authorization": f"Bearer {APIFY_TOKEN}"},
json={
"doi": "10.1038/s41586-021-03819-2",
"direction": "both",
"maxResults": 500
}
)
run_id = run.json()["data"]["id"]
while True:
status = requests.get(
f"https://api.apify.com/v2/actor-runs/{run_id}",
headers={"Authorization": f"Bearer {APIFY_TOKEN}"}
).json()["data"]["status"]
if status in ("SUCCEEDED", "FAILED"):
break
time.sleep(5)
citations = requests.get(
f"https://api.apify.com/v2/actor-runs/{run_id}/dataset/items",
headers={"Authorization": f"Bearer {APIFY_TOKEN}"}
).json()
citing = [c for c in citations if c["cited_doi"] == "10.1038/s41586-021-03819-2"]
print(f"Papers citing this DOI: {len(citing)}")
Build a citation network in NetworkX
import networkx as nx
G = nx.DiGraph()
for c in citations:
G.add_edge(c["citing_doi"], c["cited_doi"])
# Papers with the most in-degree (most cited within this network)
top_cited = sorted(G.in_degree(), key=lambda x: x[1], reverse=True)[:10]
for doi, count in top_cited:
print(f"{count} citations: {doi}")
# PageRank influence score
scores = nx.pagerank(G)
top_influential = sorted(scores.items(), key=lambda x: x[1], reverse=True)[:10]
Combine with Crossref for full metadata
OpenCitations returns DOIs only. Pair with the Crossref Scholarly Metadata scraper to resolve each DOI to title, authors, journal, and publication date:
# After collecting citation DOIs, enrich with Crossref
all_dois = list({c["citing_doi"] for c in citations} | {c["cited_doi"] for c in citations})
crossref_run = requests.post(
"https://api.apify.com/v2/acts/themineworks~crossref-scholarly-metadata/runs",
headers={"Authorization": f"Bearer {APIFY_TOKEN}"},
json={"dois": all_dois[:200]}
)
Parameters
| Parameter | Default | Notes |
|---|---|---|
doi | required | Target DOI to look up |
direction | "both" | "citing" (who cites this), "cited" (what it references), or "both" |
maxResults | 500 | Maximum citation links to return |
Use cases
Systematic literature review. Start from a landmark paper in your field and retrieve all papers that cite it. Use those papers’ DOIs to chain further lookups and map the full research lineage.
Research impact tracking. Monitor how many papers cite your own published work over time. Schedule the actor weekly and track citation velocity.
Competitive intelligence for research labs. Identify which institutions are building on your competitors’ foundational patents or papers by analysing citing-paper affiliations from Crossref metadata.
Grant application support. Build a citation map for your target research area to demonstrate the depth of the knowledge base and identify gaps your proposed work would address.
LLM training data. Combine citation graph traversal with full-text retrieval from PubMed Central or arXiv to build domain-specific document graphs for RAG pipelines.
How it differs from Semantic Scholar and Scimago
Semantic Scholar and Scimago restrict bulk access behind registration or paid tiers. OpenCitations is CC0. Every citation link returned by this actor is legally free to download, store, and republish. There are no rate limits that require a paid account.
Pricing
$0.002 per citation link. Runs against DOIs with no citation data return zero items and are not charged.
Available on Apify.
Explore the scraper referenced in this article — see inputs, outputs, and pricing, then run it on Apify.
Airbnb Scraper: Listing Prices, Ratings, and Availability Without the API
Airbnb has no public listings API. Here's how to pull nightly price, rating, superhost status and coordinates from Airbnb search results using Python.
Maps Leads: Verified Email Extraction from Google Maps Business Listings
How to pull B2B leads from Google Maps with MX-verified emails, past the official API's 120-result cap, and pay only for contactable businesses.
Realtor.com Scraper: Property and Agent Data Without the MLS Paywall
Scrape Realtor.com listings in Python — price, beds, baths, county, and the listing agent + brokerage office on every record. No login, no API key.