OpenAlex Scraper — Academic Papers, Citations, Authors
Pricing
from $0.70 / 1,000 result items
OpenAlex Scraper — Academic Papers, Citations, Authors
Search 250M+ scholarly works via OpenAlex: title, authors and institutions, year, venue, citations count, open-access PDF link, DOI, concepts, abstract. Filter by year and citations, sort by relevance or citations. Complements arXiv. No API key.
Pricing
from $0.70 / 1,000 result items
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Query OpenAlex, the open index of 250M+ scholarly works from every publisher (journals, preprints, books, datasets), plus its 100M authors, 250k sources, 100k institutions, funders and topics. Filter by year/date, citations, open-access status, type, language, country, institution, author, journal, topic or funder; sort by citations, date or field-weighted impact; get counts per group (groupBy) for instant analytics; crawl the citation graph with cites / citedBy. Built for research analysts, tech-scouting and competitive-intel teams, grant offices, science journalists and AI agents.
No proxy, no browser — the OpenAlex REST API. Bring your own free OpenAlex API key (apiKey) for regular use: since February 2026 OpenAlex asks for a key in production, and runs without one share OpenAlex's small keyless daily budget per IP (meant for testing and demos) — when it runs out, the run stops and says so (rows already saved are kept).
Use cases
- Expert / KOL discovery —
entity: "authors",query: "battery electrolytes",countryCodes: ["DE"],sortBy: "cited_by_count"→ researchers based in Germany who published on the topic (addfromYearfor recent work only), most cited first, with papers on the topic (topicWorksCount), h-index, ORCID and current institution. (OpenAlex's own author search matches names only — the actor finds the matching papers and ranks their authors; seeauthorSearchMode.) - Competitive research intelligence —
institutionIds: ["I…"]of a competitor's lab +fromDate→ everything they published this quarter, with topics and funders. - Citation alerts —
cites: "W2741809807"run weekly → new papers citing your key patent/paper. - Market-sizing of a research field —
groupBy: "publication_year"or"authorships.institutions.country_code"on a query gives publication trends and country shares in one request. - Journal selection / APC budgeting —
entity: "sources",query: "machine learning",customFilter: "is_in_doaj:true"→ open-access journals with APC prices and h-index. - Literature review / RAG corpus —
openAccessOnly: true,hasAbstract: true,fields: ["id","doi","title","abstract","pdfUrl"],limit: 5000. - Grant landscape —
funderIds: ["F4320306076"](NSF) + topic query → funded work, corresponding authors, institutions.
Input
All fields are optional; with no query and no filter the run lists the most-cited records of the entity. Works-only filters are ignored (with a warning) for other entities. Values outside the allowed list of an enum field (entity, searchIn, authorSearchMode, sortBy, sortOrder, oaStatus, types) are refused by Apify before the run starts — no run, no charge.
| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
entity | string | works | works, authors, sources, institutions, topics, concepts, funders, publishers |
query | string | – | Search text: stemmed, case-insensitive, "quoted phrases", AND / OR / NOT, -excluded. When sorting works by anything other than relevance, a plain 2–6 word query is matched as an exact phrase (falls back to all words if no work contains the phrase); add your own quotes or operators to control matching. |
searchIn | string | titleAndAbstract | Works (and experts by topic): titleAndAbstract, title, abstract, default (title + abstract + full text — broadest, but also matches papers that merely mention the words in their body), fulltext, keyword, rawAffiliation, semantic (embedding search — OpenAlex's own endpoint is down since at least 26.09.2026, so the run falls back to titleAndAbstract and says so). |
authorSearchMode | string | auto | entity: "authors" + query only. topic = experts by topic: works matching the query (with all works filters — fromYear, countryCodes, types…) grouped by author, ranked by papers on the topic (topicWorksCount) or by the author's citations / works count via sortBy; countryCodes keeps authors whose last known institution is there; minCitations applies to the author; max 200 authors. name = OpenAlex author name search. auto = name search only when the query looks like a person's name that OpenAlex knows ("Ashish Vaswani"), otherwise topic. |
fromYear / toYear | integer | – | Publication year window (works). Empty = no bound (the Console form shows 2020 only as an example; API, MCP and scheduled runs get no year window unless they send one). Not applied to ids / dois / citedBy lookups — the status says so; use fromDate / toDate to narrow a lookup. A reversed window (from later than to) is swapped, with a note in the status message. |
fromDate / toDate | string | – | YYYY-MM-DD; overrides the year fields and also narrows ids / dois / citedBy lookups. |
minCitations / maxCitations | integer | – | cited_by_count range. maxCitations: 0 = uncited only. |
openAccessOnly | boolean | false | is_oa:true. |
oaStatus | string[] | [] | diamond, gold, green, hybrid, bronze, closed |
types | string[] | [] | article, book-chapter, dataset, preprint, dissertation, book, review, paratext, libguides, letter, other, reference-entry, report, editorial, peer-review, erratum, standard, grant, supplementary-materials, retraction |
languages | string[] | [] | ISO 639-1 (en, ru, de, zh…). |
countryCodes | string[] | [] | ISO 3166-1 alpha-2. Works: any author affiliated there; authors: last known institution; institutions/sources/funders/publishers: own country. |
institutionIds | string[] | [] | I… ids (lineage — child institutes included). Find with entity: "institutions". |
authorIds | string[] | [] | A… ids. Find with entity: "authors". |
sourceIds | string[] | [] | S… ids (journal/repository), e.g. S137773608 = Nature. |
topicIds | string[] | [] | T… ids. Find with entity: "topics". |
funderIds | string[] | [] | F… ids, e.g. F4320306076 = NSF, F4320320879 = ERC. |
ids | string[] | [] | Fetch specific records by OpenAlex id (any entity), ≤100. Full URLs accepted. Year boxes do not narrow a lookup. |
dois | string[] | [] | Fetch works by DOI, ≤100. Year boxes do not narrow a lookup. |
cites | string | – | W…: works that cite this work (incoming citations); the year window applies (handy for alerts). |
citedBy | string | – | W…: works this work cites (its reference list). Year boxes do not narrow it; fromDate / toDate do. |
hasDoi / hasAbstract | boolean | – | Presence filters (unset = any). |
excludeRetracted | boolean | false | is_retracted:false. |
customFilter | string | – | Raw OpenAlex filter appended verbatim (see Reference), e.g. primary_location.source.is_in_doaj:true,authorships.institutions.type:company. |
sortBy | string | relevance_score | works: relevance_score, cited_by_count, publication_date, publication_year, fwci, display_name; other entities: relevance_score, cited_by_count, works_count, display_name (+ level for concepts). created_date / updated_date need your own premium apiKey. A key the entity does not support is replaced by cited_by_count (works: publication_date for the premium ones) and reported — the run does not fail. Relevance without a query falls back to citations / works count. |
sortOrder | string | desc | desc, asc |
limit | integer | 25 | 1–10 000 rows: records (cursor paging, 200 per request), sample records, experts (at most 200) or groups (at most 200). |
groupBy | string | – | Return counts per group instead of records: the largest groups, up to limit (default 25, at most 200 per run); the status says when groups were left out. Any filter field, e.g. publication_year, type, oa_status, authorships.institutions.country_code, primary_location.source.id, primary_topic.id, funders.id. |
sample | integer | – | Reproducible random sample of N matching records (seed 42, paged 200 per request, up to 10 000) instead of the sorted list. The run returns min(sample, limit) rows — raise limit for a large sample (the status says when limit cut it). |
flagCitationAnomalies | boolean | true | Sanity-check citation counts of up to 25 works with ≥500 citations per run (+1 cheap request each): citationsSuspect: true when ≥5% of the citing works were published 2+ years before the work itself — see FAQ. |
includeAbstract | boolean | true | Rebuild the abstract from the inverted index (works). |
maxAuthors | integer | 10 | Truncate author lists; authorsCount keeps the real number. |
includeAuthorDetails | boolean | false | Adds authorsDetailed (id, ORCID, position, corresponding flag, institutions with ROR/country). |
includeCountsByYear | boolean | false | Adds countsByYear. |
includeReferencedWorks | boolean | false | Adds referencedWorks (W… ids) for graph crawling. |
fields | string[] | [] | Keep only these output fields, in this order. id (key on groupBy rows) is always kept and comes first unless you place it. Case does not matter; a name the entity does not have is left out and named in the status (with "did you mean"), and a list with no existing name stops the run before any request. Naming authorsDetailed, countsByYear or referencedWorks turns on its switch. |
mailto | string | – | Your e-mail for the OpenAlex polite pool. Empty = no e-mail is sent. |
apiKey | string | – | Your own OpenAlex API key (free at openalex.org; stored as a secret). Recommended for regular use — without it runs share OpenAlex's small keyless daily budget per IP. A premium key also unlocks created_date / updated_date sorting. |
Reference
Entity ids
| Prefix | Entity | Example |
|---|---|---|
W | work | W2741809807 (Attention Is All You Need) |
A | author | A5103024730 |
S | source (journal / repository / conference) | S137773608 (Nature), S4306400194 (arXiv) |
I | institution | I136199984 (Harvard), I185571130 (Al-Farabi KazNU) |
T | topic | T10028 (Topic Modeling) |
F | funder | F4320306076 (NSF) |
P | publisher | P4310319965 (Springer Nature) |
C | concept (legacy) | C41008148 (Computer Science) |
Work filters usable in customFilter (most common)
Syntax: field:value, several values a|b = OR, several filters separated by , = AND, !value = NOT, numbers accept > / <. Full list: https://docs.openalex.org/api-entities/works/filter-works
| Filter | Meaning |
|---|---|
publication_year, publication_date, from_publication_date, to_publication_date | when published |
from_created_date, from_updated_date | when OpenAlex added / updated the record (needs apiKey for created_date) |
type, type_crossref, language, is_retracted, is_paratext | record kind |
cited_by_count, fwci, citation_normalized_percentile.value, referenced_works_count | impact |
is_oa, oa_status, open_access.any_repository_has_fulltext, best_oa_location.license | open access |
authorships.author.id, authorships.author.orcid, authorships.is_corresponding, authors_count | authors |
authorships.institutions.id, .lineage, .ror, .country_code, .continent, .type (education, company, government, healthcare, nonprofit, facility, archive, other), .is_global_south | affiliations |
primary_location.source.id, .issn, .type (journal, repository, conference, ebook platform, book series), .is_in_doaj, .is_core, .publisher_lineage, .host_organization | venue |
primary_topic.id, topics.id, primary_topic.subfield.id, .field.id, .domain.id, keywords.id, concepts.id | subject |
funders.id, grants.award_id, sustainable_development_goals.id | funding / SDG |
has_doi, has_pmid, has_pmcid, has_abstract, has_fulltext, has_references, has_orcid | completeness |
ids.pmid, ids.openalex, doi, title.search, abstract.search, fulltext.search, raw_affiliation_strings.search, default.search | ids and searches |
cites, cited_by, related_to | graph |
indexed_in (crossref, pubmed, doaj, arxiv, datacite), locations_count, has_oa_accepted_or_published_version | misc |
Other entities: authors — last_known_institutions.id/.country_code, affiliations.institution.id, orcid, has_orcid, works_count, cited_by_count, summary_stats.h_index; sources — type, country_code, is_oa, is_in_doaj, is_core, apc_usd, host_organization, issn; institutions — country_code, type, continent, is_global_south, lineage, ror; topics — subfield.id, field.id, domain.id; funders / publishers — country_code, works_count, grants_count.
Open-access status
oaStatus | Meaning |
|---|---|
diamond | OA journal without APC |
gold | OA journal (usually APC) |
hybrid | OA article in a subscription journal |
green | free copy only in a repository |
bronze | free on the publisher site, no license |
closed | no free copy known |
Examples
Most cited recent papers on a topic (literature review starter)
{ "query": "solid-state battery electrolyte", "searchIn": "titleAndAbstract", "fromYear": 2023, "minCitations": 20, "sortBy": "cited_by_count", "limit": 100 }
Who works on this in Kazakhstan — experts by topic, ranked by citations
{ "entity": "authors", "query": "wheat breeding", "countryCodes": ["KZ"], "fromYear": 2020, "sortBy": "cited_by_count", "limit": 50 }
Returns authors of KZ-affiliated papers on wheat breeding since 2020 whose last known institution is in Kazakhstan (e.g. Al-Farabi KazNU, Seifullin Agro Technical University), with topicWorksCount, total citations and h-index. Drop sortBy to rank by number of papers on the topic.
Look up papers by DOI (any year)
{ "dois": ["10.1038/nature14539", "10.48550/arxiv.1706.03762"], "fields": ["doi", "title", "year", "citations", "pdfUrl"] }
Look up an author by name
{ "entity": "authors", "query": "Ashish Vaswani", "authorSearchMode": "name", "limit": 5 }
Weekly citation alert for a key paper
{ "cites": "W2741809807", "fromDate": "2026-09-06", "sortBy": "publication_date", "limit": 200, "fields": ["id", "doi", "title", "publishedAt", "venue", "authors", "url"] }
Country shares of a research field (one request, no items)
{ "query": "agentic AI", "fromYear": 2024, "groupBy": "authorships.institutions.country_code", "limit": 50 }
Corporate research output this quarter (competitor intel)
{ "institutionIds": ["I1291425158"], "fromDate": "2026-07-01", "sortBy": "publication_date", "includeAuthorDetails": true, "limit": 500 }
Open-access journals in a field with APC prices
{ "entity": "sources", "query": "computer vision", "customFilter": "is_in_doaj:true", "sortBy": "cited_by_count", "limit": 30 }
Output
One item per record. Works example (trimmed):
{"id": "W7211905801","openalexUrl": "https://openalex.org/W7211905801","doi": "10.54254/2755-2721/2026.ld28741","doiUrl": "https://doi.org/10.54254/2755-2721/2026.ld28741","title": "A Survey on Reinforcement Learning Optimization Methods for Multi-Agent Collaboration of Large Language Models","year": 2026,"publishedAt": "2026-09-08","type": "article","language": "en","venue": "Applied and Computational Engineering","venueId": "S4387284237","venueType": "journal","publisher": "EWA Publishing","authors": ["Qianling Zhang"],"authorsCount": 1,"institutions": ["Xiangtan University"],"countries": ["CN"],"correspondingAuthors": ["Qianling Zhang"],"citations": 0,"fwci": null,"citationPercentile": null,"isOpenAccess": true,"oaStatus": "gold","pdfUrl": "https://ace.ewapub.com/article/view/36623.pdf","url": "https://doi.org/10.54254/2755-2721/2026.ld28741","primaryTopic": "Multi-Agent Systems and Negotiation","field": "Computer Science","domain": "Physical Sciences","topics": ["Multi-Agent Systems and Negotiation", "Reinforcement Learning in Robotics"],"keywords": ["Reinforcement learning", "Multi-agent system"],"abstract": "Large language models (LLMs) …","source": "openalex","fetchedAt": "2026-09-13T08:01:05.123Z"}
| Field group | Works fields |
|---|---|
| identity | id, openalexUrl, doi, doiUrl, pmid, arxivId, title, type, typeCrossref, language, year, firstVersionYear (year of the earliest arXiv/bioRxiv version merged into the record, else year), publishedAt |
| venue | venue, venueId, venueType, issn, publisher, volume, issue, pages |
| people | authors, authorsCount, authorsTruncated, correspondingAuthors, institutions, countries, optional authorsDetailed[] |
| impact | citations, fwci, citationPercentile, isTop10Percent, isTop1Percent, referencedWorksCount, optional countsByYear[], referencedWorks[] |
| access | isOpenAccess, oaStatus, pdfUrl, url, license, version, isRetracted |
| subject | primaryTopic, primaryTopicId, subfield, field, domain, topics[], keywords[], concepts[], sdgs[], funders[] |
| text | abstract |
| provenance | source, fetchedAt |
Works also carry citationsSuspect (true / false, null = not checked) and citationsPredatingWork (citing works published 2+ years before the work's first version). Authors: id, name, orcid, worksCount, citations, hIndex, i10Index, meanCitedness2y, lastKnownInstitutions, lastKnownCountry, lastKnownCountries, country, affiliations[], topics[], matchedBy (topic / name); experts by topic add topicWorksCount (papers matching the query) and topicQuery. Sources: name, type, issnL, publisher, country, worksCount, citations, hIndex, isOpenAccess, isInDoaj, apcUsd, homepage. Institutions: name, ror, country, city, type, worksCount, citations, hIndex, homepage, parentIds. Topics: name, description, keywords, subfield, field, domain, worksCount. Group-by rows: groupBy, key, keyDisplayName, count, share.
A SUMMARY record in the key-value store holds the exact filter string, the first request URL, totalMatching, notes (every change the run made to the request), delivered (rows saved and billed), stoppedBy (limit / timeout / null) and, when OpenAlex stopped answering part-way, stoppedEarly.
Use it from code / agents
curl -X POST "https://api.apify.com/v2/acts/yadroo~openalex-works/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"query":"agentic commerce","fromYear":2024,"sortBy":"cited_by_count","limit":50}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/openalex-works').call({ entity: 'authors', query: 'perovskite solar', countryCodes: ['DE'], limit: 50 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("yadroo/openalex-works").call(run_input={"cites": "W2741809807", "fromDate": "2026-09-01", "limit": 200})items = client.dataset(run["defaultDatasetId"]).list_items().items
MCP: add https://mcp.apify.com to Claude / Cursor / any MCP client and call the yadroo/openalex-works tool with the same JSON input.
Pricing
Pay per event: $0.001 per run start + $0.001 per item (a group-by row counts as an item). Store discounts: Bronze −10 %, Silver −20 %, Gold and above −30 % on the item price; the start event is the same on every plan; platform usage is included. Typical runs: 25-record lookup ≈ $0.026; 500-paper competitor snapshot ≈ $0.5; 50-row country breakdown ≈ $0.051.
Spending limit. The run reads your "Maximum cost per run" before it starts and never saves more rows than it pays for; it then ends with "Stopped at your spending limit: N rows delivered".
Limits & FAQ
- Rate limits and keys — OpenAlex meters its API: since February 2026 it asks for a (free) key for production use; without one each IP gets a small daily budget for testing and demos (about $0.10/day of API credit — a search request costs $0.001, a plain filter/lookup $0.0001), shared with every keyless caller on that IP, ~10 requests/s. The actor pages 200 records per request with a 250 ms pause and retries 429/5xx with backoff. When the budget is spent (or OpenAlex keeps failing) after some pages were saved, the run keeps those rows, ends SUCCEEDED and says it stopped early; with nothing saved it fails with OpenAlex's message. Pass your own
apiKeyfor regular use. - Run timeout — a run close to its timeout stops starting new pages, saves what it has read and ends SUCCEEDED with "Stopped before the run timeout"; split very large jobs by year or source.
- Citation counts are OpenAlex's own (
citations=cited_by_count, not remapped). OpenAlex occasionally credits another paper's citations to the wrong record — e.g. a 2023 conference paper showing 79 000 citations, 15% of them from papers written before it existed.flagCitationAnomaliescatches this pattern (citationsSuspect: true) for highly cited works, measuring from the first public version so a journal record of an older arXiv preprint is not flagged; it cannot catch records where only the title is wrong (a few arXiv records carry an unrelated title but the real paper's authors and citations) — check the DOI when a result looks odd. - Search precision — the default
titleAndAbstractavoids papers that mention the words only in their body;titleis the most precise for citation-ranked lists.default/fulltextare for recall, not for citation rankings. - Freshness — OpenAlex ingests Crossref/PubMed/arXiv within days; citation counts update roughly weekly.
- Depth — up to 10 000 records per run via cursor paging (a
sampleup to 10 000 via page paging); split bigger jobs by year or source.ids/doistake up to 100 per run (one request). groupBy and experts by topic return at most 200 rows. - Abstracts — rebuilt from OpenAlex's inverted index; ~40% of works have none (
hasAbstract: trueto filter). - Errors — an invalid filter fails fast with OpenAlex's own message (it lists the valid field names). Values outside an enum field's list are refused by Apify before the run starts. A listed
sortBykey that the chosen entity or the free plan does not serve is swapped for one that works instead of failing the run, and each such change appears in the run's status message and inSUMMARY.notes. - Premium-only at OpenAlex — sorting by
created_date/updated_dateand thefrom_created_date/from_updated_datefilters need a Premium/Institutional/Partner key; OpenAlex answers them withPlan upgrade required(as HTTP 429). Pass your ownapiKeyto use them. - Not included — full text, publisher paywalled PDFs;
pdfUrlpoints to the best open copy when one exists. - Roadmap — autocomplete helper for ids, N-gram endpoint, Semantic Scholar cross-links.
Made by Yadroo. Sibling actors: arxiv-papers (preprints with full category taxonomy), wikipedia-search, openlibrary-books, sec-edgar-filings, github-repo-intel.