OpenAlex Scraper — Academic Papers, Citations, Authors avatar

OpenAlex Scraper — Academic Papers, Citations, Authors

Pricing

from $0.70 / 1,000 result items

Go to Apify Store
OpenAlex Scraper — Academic Papers, Citations, Authors

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

Samat Makatov

Maintained by Community

Actor 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 (add fromYear for 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; see authorSearchMode.)
  • 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.

FieldTypeDefaultAllowed values / notes
entitystringworksworks, authors, sources, institutions, topics, concepts, funders, publishers
querystring–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.
searchInstringtitleAndAbstractWorks (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).
authorSearchModestringautoentity: "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 / toYearinteger–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 / toDatestring–YYYY-MM-DD; overrides the year fields and also narrows ids / dois / citedBy lookups.
minCitations / maxCitationsinteger–cited_by_count range. maxCitations: 0 = uncited only.
openAccessOnlybooleanfalseis_oa:true.
oaStatusstring[][]diamond, gold, green, hybrid, bronze, closed
typesstring[][]article, book-chapter, dataset, preprint, dissertation, book, review, paratext, libguides, letter, other, reference-entry, report, editorial, peer-review, erratum, standard, grant, supplementary-materials, retraction
languagesstring[][]ISO 639-1 (en, ru, de, zh…).
countryCodesstring[][]ISO 3166-1 alpha-2. Works: any author affiliated there; authors: last known institution; institutions/sources/funders/publishers: own country.
institutionIdsstring[][]I… ids (lineage — child institutes included). Find with entity: "institutions".
authorIdsstring[][]A… ids. Find with entity: "authors".
sourceIdsstring[][]S… ids (journal/repository), e.g. S137773608 = Nature.
topicIdsstring[][]T… ids. Find with entity: "topics".
funderIdsstring[][]F… ids, e.g. F4320306076 = NSF, F4320320879 = ERC.
idsstring[][]Fetch specific records by OpenAlex id (any entity), ≤100. Full URLs accepted. Year boxes do not narrow a lookup.
doisstring[][]Fetch works by DOI, ≤100. Year boxes do not narrow a lookup.
citesstring–W…: works that cite this work (incoming citations); the year window applies (handy for alerts).
citedBystring–W…: works this work cites (its reference list). Year boxes do not narrow it; fromDate / toDate do.
hasDoi / hasAbstractboolean–Presence filters (unset = any).
excludeRetractedbooleanfalseis_retracted:false.
customFilterstring–Raw OpenAlex filter appended verbatim (see Reference), e.g. primary_location.source.is_in_doaj:true,authorships.institutions.type:company.
sortBystringrelevance_scoreworks: 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.
sortOrderstringdescdesc, asc
limitinteger251–10 000 rows: records (cursor paging, 200 per request), sample records, experts (at most 200) or groups (at most 200).
groupBystring–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.
sampleinteger–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).
flagCitationAnomaliesbooleantrueSanity-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.
includeAbstractbooleantrueRebuild the abstract from the inverted index (works).
maxAuthorsinteger10Truncate author lists; authorsCount keeps the real number.
includeAuthorDetailsbooleanfalseAdds authorsDetailed (id, ORCID, position, corresponding flag, institutions with ROR/country).
includeCountsByYearbooleanfalseAdds countsByYear.
includeReferencedWorksbooleanfalseAdds referencedWorks (W… ids) for graph crawling.
fieldsstring[][]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.
mailtostring–Your e-mail for the OpenAlex polite pool. Empty = no e-mail is sent.
apiKeystring–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

PrefixEntityExample
WworkW2741809807 (Attention Is All You Need)
AauthorA5103024730
Ssource (journal / repository / conference)S137773608 (Nature), S4306400194 (arXiv)
IinstitutionI136199984 (Harvard), I185571130 (Al-Farabi KazNU)
TtopicT10028 (Topic Modeling)
FfunderF4320306076 (NSF)
PpublisherP4310319965 (Springer Nature)
Cconcept (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

FilterMeaning
publication_year, publication_date, from_publication_date, to_publication_datewhen published
from_created_date, from_updated_datewhen OpenAlex added / updated the record (needs apiKey for created_date)
type, type_crossref, language, is_retracted, is_paratextrecord kind
cited_by_count, fwci, citation_normalized_percentile.value, referenced_works_countimpact
is_oa, oa_status, open_access.any_repository_has_fulltext, best_oa_location.licenseopen access
authorships.author.id, authorships.author.orcid, authorships.is_corresponding, authors_countauthors
authorships.institutions.id, .lineage, .ror, .country_code, .continent, .type (education, company, government, healthcare, nonprofit, facility, archive, other), .is_global_southaffiliations
primary_location.source.id, .issn, .type (journal, repository, conference, ebook platform, book series), .is_in_doaj, .is_core, .publisher_lineage, .host_organizationvenue
primary_topic.id, topics.id, primary_topic.subfield.id, .field.id, .domain.id, keywords.id, concepts.idsubject
funders.id, grants.award_id, sustainable_development_goals.idfunding / SDG
has_doi, has_pmid, has_pmcid, has_abstract, has_fulltext, has_references, has_orcidcompleteness
ids.pmid, ids.openalex, doi, title.search, abstract.search, fulltext.search, raw_affiliation_strings.search, default.searchids and searches
cites, cited_by, related_tograph
indexed_in (crossref, pubmed, doaj, arxiv, datacite), locations_count, has_oa_accepted_or_published_versionmisc

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

oaStatusMeaning
diamondOA journal without APC
goldOA journal (usually APC)
hybridOA article in a subscription journal
greenfree copy only in a repository
bronzefree on the publisher site, no license
closedno 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 groupWorks fields
identityid, 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
venuevenue, venueId, venueType, issn, publisher, volume, issue, pages
peopleauthors, authorsCount, authorsTruncated, correspondingAuthors, institutions, countries, optional authorsDetailed[]
impactcitations, fwci, citationPercentile, isTop10Percent, isTop1Percent, referencedWorksCount, optional countsByYear[], referencedWorks[]
accessisOpenAccess, oaStatus, pdfUrl, url, license, version, isRetracted
subjectprimaryTopic, primaryTopicId, subfield, field, domain, topics[], keywords[], concepts[], sdgs[], funders[]
textabstract
provenancesource, 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 ApifyClient
client = 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 apiKey for 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. flagCitationAnomalies catches 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 titleAndAbstract avoids papers that mention the words only in their body; title is the most precise for citation-ranked lists. default / fulltext are 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 sample up to 10 000 via page paging); split bigger jobs by year or source. ids/dois take 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: true to 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 sortBy key 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 in SUMMARY.notes.
  • Premium-only at OpenAlex — sorting by created_date / updated_date and the from_created_date / from_updated_date filters need a Premium/Institutional/Partner key; OpenAlex answers them with Plan upgrade required (as HTTP 429). Pass your own apiKey to use them.
  • Not included — full text, publisher paywalled PDFs; pdfUrl points 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.