# OpenAlex Scraper (`anyxsolutions/openalex-scraper`) Actor

Scrape scholarly works, authors, institutions and journals from OpenAlex by search, filter or link: titles, abstracts, DOIs, citation counts, open-access PDF links, venues, authors with ORCID and affiliations, h-index. Clean JSON, no login.

- **URL**: https://apify.com/anyxsolutions/openalex-scraper.md
- **Developed by:** [Anyx Solutions](https://apify.com/anyxsolutions) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![banner](https://anyx.solutions/banners/openalex-scraper.png)

## OpenAlex Scraper

**Scholarly works, authors, institutions and journals from OpenAlex, with abstracts, citations, open-access links and h-index, as clean JSON.**

OpenAlex is the open catalogue of the world's research: over 300 million papers, preprints, books
and datasets, with the authors, institutions and journals behind them. This Actor scrapes
OpenAlex by search, filter or link. Get each work's title, abstract, DOI, publication date, type,
language, citation count, open-access status and free PDF link, journal with ISSN and publisher,
authors with ORCID iDs and affiliations, and research topics. Search authors to get their works
count, citations, h-index, i10-index and current institutions. Search institutions or journals to
get their output, impact, ROR, ISSNs and APC prices. Paste any openalex.org list or record, or a
DOI, ORCID or ROR link. There is no login and no proxy to configure. Built for literature reviews,
research analytics and bibliometrics, grant and talent scouting, publisher and journal analysis,
and feeding research into search, RAG and summarisation pipelines.

### ⚡ Quick start

```json
{
  "startUrls": [
    {
      "url": "https://openalex.org/works?search=large%20language%20models&filter=is_oa:true"
    }
  ],
  "maxItems": 5
}
```

Or search with filters, most cited first:

```json
{
  "searchTerms": ["crispr gene therapy"],
  "filters": "type:article",
  "yearFrom": 2020,
  "yearTo": 2024,
  "openAccessOnly": true,
  "sortBy": "citedByCount",
  "maxItems": 100
}
```

### 🧩 Input

| Field                | Type    | Required | Default                      | Description                                                                                                                                                                                                 |
| -------------------- | ------- | -------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | array   | no       | —                            | OpenAlex URLs: a list with its search, filters and sort (`openalex.org/works?…`, `/authors?…`, `/institutions?…`, `/sources?…`), a single record (`openalex.org/W2741809807`), or a DOI, ORCID or ROR link. |
| `searchTerms`        | array   | no       | —                            | Search terms, one search per line. Each searches the entity type below, with the filters and sort below.                                                                                                    |
| `entityType`         | string  | no       | `"works"`                    | What the search terms and filters look for: `works`, `authors`, `institutions` or `sources` (journals and repositories).                                                                                    |
| `maxItems`           | integer | no       | —                            | Maximum number of results per start URL or search term. The input form starts at 5; leave it empty to get every match.                                                                                      |
| `filters`            | string  | no       | —                            | OpenAlex filters, comma-separated, combined with AND, e.g. `type:article,publication_year:2020-2024,authorships.institutions.ror:00f54p054`. With no search terms, the filters alone define the list.       |
| `yearFrom`           | integer | no       | —                            | Only works published in or after this year. Works only.                                                                                                                                                     |
| `yearTo`             | integer | no       | —                            | Only works published in or before this year. Works only.                                                                                                                                                    |
| `openAccessOnly`     | boolean | no       | `false`                      | Only works that are free to read somewhere. Works only.                                                                                                                                                     |
| `sortBy`             | string  | no       | `"relevance"`                | `relevance` (most cited when there is no search term), `citedByCount`, `worksCount` (authors, institutions, sources), `newest` or `oldest` (works).                                                         |
| `apiKey`             | string  | no       | —                            | Optional free OpenAlex API key. Raises the daily allowance tenfold.                                                                                                                                         |
| `proxyConfiguration` | object  | no       | `{ "useApifyProxy": false }` | Proxy settings. OpenAlex needs no proxy.                                                                                                                                                                    |

Add at least one start URL, one search term, or a filter. `entityType`, `filters`, `yearFrom`,
`yearTo`, `openAccessOnly` and `sortBy` apply to the search terms; start URLs keep the filters and
sort set in them.

**Building a list on openalex.org.** Search and filter on [openalex.org](https://openalex.org),
then copy the address bar into `startUrls`: the Actor returns the same results. To get every work
by one author, institution or journal, use a filter such as `authorships.author.id:A5001226970`,
`authorships.institutions.id:I97018004` or `primary_location.source.id:S137773608`.

### 📤 Output

Each work, author, institution or source is one dataset row, marked by `itemType`. Works carry the
work fields; authors, institutions and sources carry their own. A field that does not apply to a
row's type is left out, and a field OpenAlex has no value for is `null`.

#### Fields

| Field                   | Type    | Description                                                                                                                                                     |
| ----------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `itemType`              | string  | `work`, `author`, `institution` or `source`.                                                                                                                    |
| `id`                    | string  | OpenAlex ID, such as `W2741809807`, `A5001226970`, `I97018004` or `S137773608`.                                                                                 |
| `url`                   | string  | The record's page on openalex.org.                                                                                                                              |
| `doi`                   | string  | Work: DOI, such as `10.7717/peerj.4375`.                                                                                                                        |
| `title`                 | string  | Work: title.                                                                                                                                                    |
| `publicationYear`       | number  | Work: year of publication.                                                                                                                                      |
| `publicationDate`       | string  | Work: date of publication (`YYYY-MM-DD`).                                                                                                                       |
| `type`                  | string  | Work: `article`, `preprint`, `book-chapter`, `dataset`, … Institution: `education`, `company`, `healthcare`, … Source: `journal`, `repository`, `conference`, … |
| `language`              | string  | Work: language as a two-letter code.                                                                                                                            |
| `citedByCount`          | number  | Times cited: of the work, or of all works by the author, institution or source.                                                                                 |
| `isOpenAccess`          | boolean | Work: free to read somewhere. Source: a fully open-access journal or repository.                                                                                |
| `oaStatus`              | string  | Work: `gold`, `diamond`, `hybrid`, `bronze`, `green` or `closed`.                                                                                               |
| `oaUrl`                 | string  | Work: the best place to read it for free.                                                                                                                       |
| `pdfUrl`                | string  | Work: direct PDF link of the best open-access copy, when there is one.                                                                                          |
| `landingPageUrl`        | string  | Work: the publisher's page for the work.                                                                                                                        |
| `venue`                 | object  | Work: where it was published, with `name`, `issn`, `publisher` and `type`.                                                                                      |
| `authors`               | array   | Work: authors in order, each with `id`, `name`, `orcid` and `institutions` (names).                                                                             |
| `abstractText`          | string  | Work: the abstract as plain text, when the publisher made it available.                                                                                         |
| `topics`                | array   | Up to three research topics, strongest first.                                                                                                                   |
| `referencedWorksCount`  | number  | Work: number of references OpenAlex matched.                                                                                                                    |
| `name`                  | string  | Author, institution or source: name.                                                                                                                            |
| `orcid`                 | string  | Author: ORCID iD, such as `0000-0002-1992-2684`.                                                                                                                |
| `worksCount`            | number  | Author, institution or source: number of works.                                                                                                                 |
| `hIndex`                | number  | Author, institution or source: h-index.                                                                                                                         |
| `i10Index`              | number  | Author: number of works cited at least ten times.                                                                                                               |
| `lastKnownInstitutions` | array   | Author: current institutions, each with `name` and `country`.                                                                                                   |
| `country`               | string  | Institution or source: country as a two-letter code.                                                                                                            |
| `city`                  | string  | Institution: city.                                                                                                                                              |
| `ror`                   | string  | Institution: ROR ID link.                                                                                                                                       |
| `homepage`              | string  | Institution or source: website.                                                                                                                                 |
| `issn`                  | array   | Source: every ISSN.                                                                                                                                             |
| `issnL`                 | string  | Source: linking ISSN.                                                                                                                                           |
| `publisher`             | string  | Source: publisher or host organisation.                                                                                                                         |
| `isInDoaj`              | boolean | Source: listed in the Directory of Open Access Journals.                                                                                                        |
| `apcUsd`                | number  | Source: article processing charge in US dollars, when known.                                                                                                    |

<details><summary>Example output</summary>

```json
{
  "itemType": "work",
  "id": "W4362515116",
  "url": "https://openalex.org/W4362515116",
  "doi": "10.1007/s11704-026-60308-3",
  "title": "A Survey of Large Language Models",
  "publicationYear": 2026,
  "publicationDate": "2026-05-09",
  "type": "article",
  "language": "en",
  "citedByCount": 1541,
  "isOpenAccess": true,
  "oaStatus": "hybrid",
  "oaUrl": "https://link.springer.com/content/pdf/10.1007/s11704-026-60308-3.pdf",
  "pdfUrl": "https://link.springer.com/content/pdf/10.1007/s11704-026-60308-3.pdf",
  "landingPageUrl": "https://doi.org/10.1007/s11704-026-60308-3",
  "venue": {
    "name": "Frontiers of Computer Science",
    "issn": "2095-2228",
    "publisher": "Higher Education Press",
    "type": "journal"
  },
  "authors": [
    {
      "id": "A5037145565",
      "name": "Wayne Xin Zhao",
      "orcid": "0000-0002-8333-6196",
      "institutions": ["Renmin University of China"]
    },
    {
      "id": null,
      "name": "Kun Zhou",
      "orcid": null,
      "institutions": ["Renmin University of China"]
    }
  ],
  "abstractText": "The rapid evolution of large language models (LLMs) has driven a transformative shift in artificial intelligence (AI), reshaping both research paradigms and practical applications. Distinguished from their predecessors …",
  "topics": [
    "Topic Modeling",
    "Natural Language Processing Techniques",
    "Multimodal Machine Learning Applications"
  ],
  "referencedWorksCount": 0
}
```

</details>

An author row:

```json
{
  "itemType": "author",
  "id": "A5001226970",
  "url": "https://openalex.org/A5001226970",
  "name": "Yann LeCun",
  "orcid": "0000-0002-1992-2684",
  "worksCount": 581,
  "citedByCount": 262442,
  "hIndex": 129,
  "i10Index": 320,
  "lastKnownInstitutions": [
    { "name": "Meta (United States)", "country": "US" },
    { "name": "New York University", "country": "US" }
  ],
  "topics": [
    "Advanced Neural Network Applications",
    "Neural Networks and Applications",
    "Domain Adaptation and Few-Shot Learning"
  ]
}
```

### 💡 Use cases

- **Literature reviews** — pull every paper matching a query, year range and type, with abstracts and DOIs, into a spreadsheet or reference manager.
- **Research analytics and bibliometrics** — citation counts, open-access status and topics for an institution's, a journal's or a country's output.
- **Talent and collaborator scouting** — find the most cited authors in a field, with their h-index, ORCID and institutions.
- **Open-access discovery** — free, legal PDF links for papers behind paywalls.
- **Journal and publisher analysis** — compare journals by output, citations, h-index, open-access status and APC.
- **RAG and summarisation** — feed abstracts and PDF links into search, embedding or LLM pipelines.

### ❓ FAQ

- **Do I need an account or an API key?** No. OpenAlex is free and open. Without a key OpenAlex allows a daily allowance per caller, enough for about 100 search pages or 1,000 filtered pages (up to 100 results each). For more, add a free API key from [openalex.org/settings/api](https://openalex.org/settings/api), which raises it tenfold. Looking up single records by link is free.
- **What happens when the daily allowance runs out?** The Actor stops cleanly, keeps what it already saved, and says so in its log and status. The allowance resets at midnight UTC.
- **Do I need a proxy?** No. It runs without one by default.
- **Why is `abstractText` empty on some works?** Some publishers do not let OpenAlex distribute their abstracts. The title, DOI and every other field are still there.
- **Why is `pdfUrl` empty when the work is open access?** Some free copies are web pages rather than PDFs. `oaUrl` always points to the best free copy.
- **How do I get all works by one author or institution?** Use a filter: `authorships.author.id:A5001226970` for an author, `authorships.institutions.ror:00f54p054` for an institution, or open the list on openalex.org and paste its URL.
- **Which filters can I use?** Any OpenAlex filter, such as `type:article`, `publication_year:2020-2024`, `cited_by_count:>100`, `institutions.country_code:DE`, `primary_topic.field.id:17` or `has_abstract:true`. Join them with commas. The log shows OpenAlex's message when it rejects a filter.
- **Does it download the PDFs?** No. Every work carries `pdfUrl` and `oaUrl`, so you can fetch the files you need.

### 🔗 More scrapers by Anyx

- [arXiv Scraper](https://apify.com/anyxsolutions/arxiv-scraper)
- [Hugging Face Scraper](https://apify.com/anyxsolutions/hugging-face-scraper)
- [Google Search Scraper](https://apify.com/anyxsolutions/google-search-scraper)
- [Web Content Scraper](https://apify.com/anyxsolutions/web-content-scraper)

### 🤝 Anyx Solutions

We build custom scrapers and data-extraction pipelines.

- Email: tantosthor@gmail.com

### 🖼 Image credit

Image credit: [openalex.org](https://openalex.org/)

# Actor input Schema

## `startUrls` (type: `array`):

openalex.org pages: a list with its search, filters and sort, such as https://openalex.org/works?search=large%20language%20models\&filter=is_oa:true (also /authors, /institutions, /sources), or a single record such as https://openalex.org/W2741809807. DOI (https://doi.org/10.7717/peerj.4375), ORCID and ROR links work too.

## `searchTerms` (type: `array`):

Keywords to search OpenAlex for, one search per line, for example crispr gene therapy or "graph neural network". Each term searches the entity type picked below, with the filters and sort below.

## `entityType` (type: `string`):

What the search terms and filters look for: works (papers, preprints, books, datasets), authors, institutions, or sources (journals and repositories).

## `maxItems` (type: `integer`):

Maximum number of results to return per start URL or search term. Leave empty to get every match.

## `filters` (type: `string`):

OpenAlex filters, comma-separated, combined with AND, for example type:article,publication_year:2020-2024,authorships.institutions.ror:00f54p054,primary_topic.field.id:17 for works, or last_known_institutions.country_code:DE for authors. With no search terms, the filters alone define the list.

## `yearFrom` (type: `integer`):

Only works published in or after this year, for example 2020. Works only.

## `yearTo` (type: `integer`):

Only works published in or before this year, for example 2024. Works only.

## `openAccessOnly` (type: `boolean`):

Only works that are free to read somewhere (gold, green, hybrid, bronze or diamond open access). Works only.

## `sortBy` (type: `string`):

Order of the search-term results: best match first, most cited, most works (authors, institutions, sources), or newest or oldest publication date (works).

## `apiKey` (type: `string`):

Optional. Your free OpenAlex API key from openalex.org/settings/api, for example a 32-character key. Without one, OpenAlex allows about 100 searches or 1,000 filtered pages per day; a key raises that tenfold.

## `proxyConfiguration` (type: `object`):

Proxy settings. OpenAlex needs no proxy; the Actor keeps within OpenAlex's request rate.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://openalex.org/works?search=large%20language%20models&filter=is_oa:true"
    }
  ],
  "entityType": "works",
  "maxItems": 5,
  "openAccessOnly": false,
  "sortBy": "relevance",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://openalex.org/works?search=large%20language%20models&filter=is_oa:true"
        }
    ],
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("anyxsolutions/openalex-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://openalex.org/works?search=large%20language%20models&filter=is_oa:true" }],
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("anyxsolutions/openalex-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://openalex.org/works?search=large%20language%20models&filter=is_oa:true"
    }
  ],
  "maxItems": 5
}' |
apify call anyxsolutions/openalex-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,anyxsolutions/openalex-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/dj5hto0SBACGreK9T/builds/holo3qiRBvvZKyOLZ/openapi.json
