Citation Count & DOI Citations Scraper — OpenCitations
Pricing
from $2.00 / 1,000 opencitations results
Citation Count & DOI Citations Scraper — OpenCitations
Get citation counts, citing papers, references and metadata by DOI, PMID or OMID from the OpenCitations open index, for bibliometrics. $4 per 1,000.
Pricing
from $2.00 / 1,000 opencitations results
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share
Citation Count & DOI Citations Scraper returns citation counts, the papers that cite a work, the works it references, and bibliographic metadata from the OpenCitations open index, looked up by DOI, PMID, or OpenCitations Meta ID (OMID). It is built for researchers, librarians, bibliometrics teams, and knowledge-graph builders, and costs $4.00 per 1,000 records on the FREE tier plus a $0.005 start fee.
How do I get the citation count for a DOI?
Set operation to counts and list your DOIs; each identifier returns one record with citationCount (incoming citations) and referenceCount (outgoing references).
{"operation": "counts","identifiers": ["10.7717/peerj-cs.421", "10.1177/09610006211036734"]}
Counts reflect the OpenCitations index at the time of the run, so they are usually lower than Google Scholar, which indexes more non-journal sources. Use the same source for every work you compare.
Which papers cite my paper?
Set operation to citations (the default) to get one record per citing work, with the citing work's DOI and other identifiers, the citation date, the time span between the two works, and journal and author self-citation flags. Use references for the works a paper cites, or both for both directions in one run.
What citation data does it return?
Every record has the same shape, so exports and agent workflows stay predictable. Fields that do not apply to the chosen operation are null or an empty list.
| Field | What it contains |
|---|---|
recordType | citation, metadata, or counts |
operation | citations, references, metadata, or counts |
queryIdentifier | Your identifier, normalized (for example doi:10.7717/peerj-cs.421) |
oci | Open Citation Identifier of a citation link |
citingIdentifiers, citedIdentifiers | All IDs of each work (DOI, PMID, OMID, OpenAlex) |
citingDoi, citedDoi | DOI of the citing and cited work when known |
creationDate, timespan | Citing work's date and the gap between publications (P1Y) |
journalSelfCitation, authorSelfCitation | Self-citation flags when known |
title, authors, editors, publicationDate | Bibliographic metadata (metadata mode) |
venue, volume, issue, pages, workType, publisher | Publication details (metadata mode) |
workIdentifiers | All IDs attached to a metadata record |
citationCount, referenceCount | Totals (counts mode) |
sourceUrl, scrapedAt | Exact OpenCitations endpoint used and retrieval time |
When should I use it, and when not?
Use it when you already know the DOIs, PMIDs, or OMIDs and want:
- the citation count and reference count for a list of papers;
- citing and cited works as edges for a citation network or knowledge graph;
- clean bibliographic metadata for known works;
- open, source-linked citation data for an AI research agent.
Do not use it when you need:
- to search papers by keyword, title, or author: use Semantic Scholar Scraper or Google Scholar Scraper;
- open access book metadata: use Open Access Books Scraper;
- abstracts or full text: the Actor returns citation links and metadata only.
How do I build a citation network from a list of DOIs?
Run both on your seed DOIs; every row is one edge from citingDoi to citedDoi, labelled with its direction in operation.
{"operation": "both","identifiers": ["10.7717/peerj-cs.421", "pmid:33817056", "omid:br/06101801781"],"maxResults": 250}
Identifiers can be bare DOIs, doi: prefixed values, https://doi.org/... URLs, PMIDs (pmid:33817056 or just the number), or OMIDs. Up to 50 unique identifiers per run; duplicates are removed first. maxResults (1–10,000, default 1,000) caps records for the whole run. requestTimeoutSeconds (5–60, default 30) bounds each request.
How do I call it from code?
Use the official Apify API clients with the same JSON input as in Console.
JavaScript (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('muhammadafzal/open-citations-scraper').call({operation: 'counts',identifiers: ['10.7717/peerj-cs.421'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0].citationCount, items[0].referenceCount);
Python (apify-client 3.x)
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("muhammadafzal/open-citations-scraper").call(run_input={"operation": "citations", "identifiers": ["10.7717/peerj-cs.421"]})for edge in client.dataset(run.default_dataset_id).iterate_items():print(edge["citingDoi"], "->", edge["citedDoi"], edge["creationDate"])
Use it from an AI assistant
The Actor works from Claude, ChatGPT, Cursor, or any MCP client through Apify's MCP server. Add https://mcp.apify.com/?tools=muhammadafzal/open-citations-scraper as a server, then ask, for example: "How many times has DOI 10.7717/peerj-cs.421 been cited, and which papers cite it?"
What does the output look like?
Citation records from the default run on 2026-10-26 (empty metadata fields omitted for brevity):
[{"recordType": "citation","operation": "citations","queryIdentifier": "doi:10.7717/peerj-cs.421","oci": "06103952512-06101801781","citingIdentifiers": ["omid:br/06103952512", "doi:10.1177/09610006211036734", "openalex:W3189909973"],"citedIdentifiers": ["omid:br/06101801781", "doi:10.7717/peerj-cs.421", "openalex:W3134956838", "pmid:33817056"],"citingDoi": "10.1177/09610006211036734","citedDoi": "10.7717/peerj-cs.421","creationDate": "2021-08-04","timespan": "P0Y4M25D","journalSelfCitation": false,"authorSelfCitation": false,"citationCount": null,"referenceCount": null,"sourceUrl": "https://api.opencitations.net/index/v2/citations/doi:10.7717/peerj-cs.421","scrapedAt": "2026-10-26T06:57:57.682Z"},{"recordType": "citation","operation": "citations","queryIdentifier": "doi:10.7717/peerj-cs.421","oci": "06404435594-06101801781","citingDoi": "10.1063/5.0110347","citedDoi": "10.7717/peerj-cs.421","creationDate": "2023","timespan": "P1Y","journalSelfCitation": false,"authorSelfCitation": false,"sourceUrl": "https://api.opencitations.net/index/v2/citations/doi:10.7717/peerj-cs.421"}]
Every run also writes a SUMMARY record with the outcome (DATA, EMPTY, BLOCKED, FAILED, or REJECTED), request counts, records returned, and warnings.
How much does citation data cost?
You pay per record saved to the dataset, plus one start fee. Platform usage is included in these prices.
| Event | FREE | BRONZE | SILVER | GOLD, PLATINUM, DIAMOND |
|---|---|---|---|---|
| OpenCitations result (per record) | $0.004 | $0.004 | $0.004 | $0.002 |
| Actor start (per started GB of allocated memory) | $0.005 | $0.005 | $0.005 | $0.005 |
The default memory is 256 MB, so a run normally pays one start event. Worked totals on the FREE tier:
- Default run (one DOI, 3 citing works on 2026-10-26): $0.005 + 3 × $0.004 = $0.017.
- Counts for 50 DOIs (50 records): $0.005 + 50 × $0.004 = $0.205 (GOLD: $0.105).
Limits and reliability
- The Actor calls OpenCitations' public REST APIs and spaces requests to stay under the documented fair-use limit of 180 requests per minute. It retries transient failures and honors
Retry-After. - Counts mode uses two requests per identifier; other modes use one.
- Invalid identifiers are rejected before any request, with a correction example and no result charges.
- A well-formed identifier that OpenCitations does not know returns no rows and
status: EMPTY; no placeholder records are created. - If every request fails, the run reports
BLOCKEDinSUMMARYand is marked failed, with no result charges. When only some requests fail, records from the other identifiers are kept. - The status message shows the maximum cost at the live prices for your tier. With a maximum cost per run set, the Actor stops before saving a record the limit cannot pay for.
- The default run (one DOI) finished in about 3 seconds on 2026-10-26.
FAQ
How do I find the number of citations for a paper?
Run the Actor with operation: "counts" and the paper's DOI or PMID. The citationCount field is the number of citing works in OpenCitations.
Why is the citation count lower than Google Scholar?
OpenCitations counts only citations in its open index, built from the open reference data its sources contribute. Google Scholar also counts theses, preprints, and web documents, so its numbers are usually higher.
Can I search by title or keyword?
No. The Actor needs a DOI, PMID, or OMID. Find identifiers first with Semantic Scholar Scraper, then pass them here.
How many papers can I look up in one run?
Up to 50 identifiers and up to 10,000 records per run. For larger jobs, split the list across runs or use OpenCitations' bulk data dumps.
Is OpenCitations data open?
OpenCitations states that its data is released under the CC0 public-domain waiver. Cite OpenCitations in research outputs where appropriate.
Is there a citation API I can call directly from code?
Yes. Call the Actor through the Apify API with the JavaScript or Python client above; the input and output are plain JSON.
Related Actors
- Open Access Books Scraper: DOAB book metadata with ISBN, DOI, and PDF links.
- Semantic Scholar Scraper: search papers and authors.
- Google Scholar Scraper: Google Scholar results with citation counts.
- US Government Datasets Scraper: Data.gov dataset metadata.
Legal and responsible use
The Actor reads OpenCitations' public APIs and records the exact endpoint behind every record. It does not access paywalled full text, publisher accounts, or personal data. Respect OpenCitations' fair-use limits and attribution guidance.
Last verified: 2026-10-27