# OpenAlex Scholarly Works Scraper (`scrapers_lat/openalex-scraper`) Actor

Scrape scholarly works with title, DOI, publication year, type, citation count, authors, venue, open access status and a direct link. Search by keyword. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/openalex-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Business, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.80 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

[![OpenAlex Scholarly Works Scraper](https://scrapers.lat/banners/openalex-scraper.png)](https://console.apify.com/actors/4A8hOlp1UN6cTXd2R/input)

## OpenAlex Scholarly Works Scraper

Here is one real result, with every field the actor returns (the `authorsDetailed` array is trimmed here with a note; all values are real, and the AI fields shown come from the optional paid add-ons):

```json
{
  "id": "https://openalex.org/W1775749144",
  "doi": "10.1016/s0021-9258(19)52451-6",
  "title": "PROTEIN MEASUREMENT WITH THE FOLIN PHENOL REAGENT",
  "publicationYear": 1951,
  "publicationDate": "1951-11-01",
  "type": "article",
  "citedByCount": 318812,
  "authors": ["OliverH. Lowry", "NiraJ. Rosebrough", "A. Farr", "RoseJ. Randall"],
  "venue": "Journal of Biological Chemistry",
  "hostOrganization": "Elsevier BV",
  "isOpenAccess": true,
  "openAccessStatus": "hybrid",
  "openAccessUrl": "https://www.jbc.org/article/S0021-9258(19)52451-6/pdf",
  "language": "en",
  "url": "https://doi.org/10.1016/s0021-9258(19)52451-6",
  "abstract": "Since 1922 when Wu proposed the use of the Folin phenol reagent for the measurement of proteins (l), a number of modified analytical procedures utilizing this reagent have been reported for the determination of proteins in serum, in antigen-antibody precipitates, and in insulin.",
  "authorsDetailed": [
    {
      "name": "OliverH. Lowry",
      "orcid": null,
      "isCorresponding": false,
      "institutions": ["Washington University in St. Louis"],
      "countries": ["US"]
    }
  ],
  "concepts": ["Reagent", "Chemistry", "Phenol", "Chromatography", "Organic chemistry"],
  "topics": ["Glycosylation and Glycoproteins Research", "Muscle metabolism and nutrition", "Cancer and biochemical research"],
  "keywords": ["Reagent", "Chemistry", "Phenol", "Chromatography", "Organic chemistry"],
  "fieldsOfStudy": ["Biochemistry, Genetics and Molecular Biology", "Life Sciences"],
  "referencedWorksCount": 20,
  "fwci": 48.347,
  "isRetracted": false,
  "isParatext": false,
  "volume": "193",
  "issue": "1",
  "firstPage": "265",
  "lastPage": "275",
  "pdfUrl": "https://www.jbc.org/article/S0021-9258(19)52451-6/pdf",
  "license": "cc-by",
  "funders": ["American Cancer Society"],
  "sustainableDevelopmentGoals": ["Clean water and sanitation"],
  "pmid": "14907713",
  "pmcid": null,
  "source": "OpenAlex",
  "observedAt": "2026-08-14T06:25:00.453Z",
  "aiSummary": "This study discusses the historical use of the Folin phenol reagent for measuring protein levels, highlighting various modified methods developed since its introduction in 1922 for different biological samples.",
  "aiKeywords": ["Protein measurement", "Folin phenol reagent", "Analytical procedures", "Serum proteins", "Insulin determination"],
  "aiField": "Analytical Chemistry"
}
```

The most complete OpenAlex scholarly works scraper available. It returns every field the OpenAlex work record exposes, including detailed authorship with institutions and countries, open-access status, citation and impact metrics, funders and SDGs, and adds optional AI abstract summaries, keywords and field classification, so you get exactly the research metadata you need.

**📥 [Input](https://apify.com/scrapers_lat/openalex-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/openalex-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/openalex-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/openalex-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Global-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

The actor searches the OpenAlex catalog of scholarly works by keyword, paginates through the matching works, and writes one normalized record per work to the run's dataset. Each record carries the full OpenAlex metadata (DOI, authors and institutions, venue, open-access status, citation and impact metrics, concepts, topics, funders, SDGs, and identifiers such as PMID and PMCID). Optional paid AI add-ons enrich each work with a plain-English abstract summary, topical keywords, and a field classification.

Coverage is global: OpenAlex indexes hundreds of millions of works across every discipline and country.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns 3 works on CRISPR gene editing with all AI add-ons on.

```json
{
  "searchQuery": "crispr gene editing",
  "maxWorks": 3,
  "withAiSummary": true,
  "withAiKeywords": true,
  "withAiField": true
}
```

Leave the AI add-ons off (default) for raw OpenAlex metadata only. Every input field is optional.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `searchQuery` | string | no | `machine learning` | Keyword to search scholarly works by title and full text, for example `machine learning`, `crispr`, `climate policy`. Leave empty for top works by relevance. |
| `maxWorks` | integer | no | `10` | Maximum number of works to collect. |
| `withAiSummary` | boolean | no | `false` | Paid add-on. Generates a 1-2 sentence plain-English summary from each work's abstract (skipped when no abstract). Requires a paid Apify plan. Billed only when a summary is produced. |
| `withAiKeywords` | boolean | no | `false` | Paid add-on. Extracts 5-10 topical keywords per work from its title and abstract. Requires a paid Apify plan. Billed only when keywords are produced. |
| `withAiField` | boolean | no | `false` | Paid add-on. Classifies each work's academic field or discipline. Requires a paid Apify plan. Billed only when a classification is produced. |

### Output reference

One dataset item per work. Types: `string`, `integer`, `number`, `boolean`, `string[]`, `object[]`, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `id` | string | OpenAlex work ID (URL). |
| `doi` | string | DOI of the work, or `null`. |
| `title` | string | Work title. |
| `publicationYear` | integer | Year of publication. |
| `publicationDate` | string | Publication date (`YYYY-MM-DD`). |
| `type` | string | Work type, for example `article`, `book-chapter`, `dataset`. |
| `citedByCount` | integer | Number of times the work has been cited. |
| `authors` | string\[] | Author display names in order. |
| `venue` | string | Source/journal name. |
| `hostOrganization` | string | Publisher or host organization. |
| `isOpenAccess` | boolean | `true` when the work is open access. |
| `openAccessStatus` | string | Open-access status, for example `gold`, `hybrid`, `green`, `closed`. |
| `openAccessUrl` | string | URL to the open-access copy, or `null`. |
| `language` | string | Language code, for example `en`. |
| `url` | string | Canonical link to the work (DOI when available). |
| `abstract` | string | Reconstructed abstract text, or `null`. |
| `authorsDetailed` | object\[] | Per-author detail: `name`, `orcid`, `isCorresponding`, `institutions`, `countries`. |
| `concepts` | string\[] | OpenAlex concept labels. |
| `topics` | string\[] | OpenAlex topic labels. |
| `keywords` | string\[] | OpenAlex keyword labels. |
| `fieldsOfStudy` | string\[] | Broad fields of study. |
| `referencedWorksCount` | integer | Number of works referenced. |
| `fwci` | number | Field-Weighted Citation Impact, or `null`. |
| `isRetracted` | boolean | `true` when the work is retracted. |
| `isParatext` | boolean | `true` when the work is paratext (front matter, and similar). |
| `volume` | string | Volume, or `null`. |
| `issue` | string | Issue, or `null`. |
| `firstPage` | string | First page, or `null`. |
| `lastPage` | string | Last page, or `null`. |
| `pdfUrl` | string | Direct PDF URL when available, else `null`. |
| `license` | string | License, for example `cc-by`, or `null`. |
| `funders` | string\[] | Funding organizations. |
| `sustainableDevelopmentGoals` | string\[] | UN SDG labels linked to the work. |
| `pmid` | string | PubMed ID when available, else `null`. |
| `pmcid` | string | PubMed Central ID when available, else `null`. |
| `source` | string | Data source name. Always `OpenAlex`. |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `aiSummary` | string | AI abstract summary. Present only when `withAiSummary` is on and an abstract exists. |
| `aiKeywords` | string\[] | AI-extracted keywords. Present only when `withAiKeywords` is on. |
| `aiField` | string | AI field classification. Present only when `withAiField` is on. |

On a failed run, a single item with a populated `error` field (plus `source` and `observedAt`) is written instead.

### Example output record

Real record from a live run (input `{"searchQuery":"crispr gene editing","maxWorks":3}`, AI add-ons off). Some fields omitted here for brevity; all values are real:

```json
{
  "id": "https://openalex.org/W1775749144",
  "doi": "10.1016/s0021-9258(19)52451-6",
  "title": "PROTEIN MEASUREMENT WITH THE FOLIN PHENOL REAGENT",
  "publicationYear": 1951,
  "type": "article",
  "citedByCount": 318812,
  "authors": ["OliverH. Lowry", "NiraJ. Rosebrough", "A. Farr", "RoseJ. Randall"],
  "venue": "Journal of Biological Chemistry",
  "hostOrganization": "Elsevier BV",
  "isOpenAccess": true,
  "openAccessStatus": "hybrid",
  "language": "en",
  "url": "https://doi.org/10.1016/s0021-9258(19)52451-6",
  "fieldsOfStudy": ["Biochemistry, Genetics and Molecular Biology", "Life Sciences"],
  "fwci": 48.347,
  "license": "cc-by",
  "funders": ["American Cancer Society"],
  "pmid": "14907713",
  "source": "OpenAlex",
  "observedAt": "2026-08-14T06:25:00.453Z"
}
```

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~openalex-scraper/run-sync-get-dataset-items?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"searchQuery":"machine learning","maxWorks":25}'
```

Start a run asynchronously with AI add-ons:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~openalex-scraper/runs?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"searchQuery":"climate policy","maxWorks":50,"withAiSummary":true,"withAiField":true}'
```

Apify CLI:

```bash
apify call scrapers_lat/openalex-scraper \
  --input '{"searchQuery":"crispr"}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets. `clean=true` drops empty and internal fields.

### Billing and limits

- **Pay per result.** You are charged per work returned (`result` event). See the [pricing tab](https://apify.com/scrapers_lat/openalex-scraper/pricing) for the current per-result price.
- **AI add-ons are billed separately.** `ai_summary`, `ai_keywords`, and `ai_field` are each charged per work only when they produce usable output, and only on paid Apify plans.
- **No charge on failure.** If a request fails, the actor writes a single item with a populated `error` field and does not charge for it. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 10 records per run and cannot use the AI add-ons. Upgrade for higher `maxWorks` and AI enrichment.

### FAQ and troubleshooting

**A run returned 0 records. Why?**
The keyword matched no works in OpenAlex. Try a broader query. Zero-result runs are not charged.

**Do I need an API key?**
No. OpenAlex is an open catalog and the actor reads it directly. No account or key is required.

**What do the AI add-ons cost?**
Each add-on is billed per work only when it returns usable output, and requires a paid Apify plan. Leave them off for raw OpenAlex metadata.

**Why is `abstract` null?**
OpenAlex does not hold a reconstructable abstract for every work. Missing source values are returned as `null`, never invented. The AI summary is skipped when there is no abstract.

**What is `fwci`?**
Field-Weighted Citation Impact, a normalized measure of how a work's citations compare to the field average. It is `null` when OpenAlex has not computed it.

**Is this an official OpenAlex tool?**
No. This actor is independent and has no affiliation with OpenAlex or OurResearch. It reads the open OpenAlex catalog. Use it in accordance with the OpenAlex terms of use.

### Related scrapers

- [Crossref Works Scraper](https://apify.com/scrapers_lat/crossref-scraper): Scholarly metadata and DOIs from Crossref.
- [arXiv Papers Scraper](https://apify.com/scrapers_lat/arxiv-papers-scraper): arXiv preprints with authors and abstracts.
- [ClinicalTrials.gov Scraper](https://apify.com/scrapers_lat/clinicaltrials-scraper): Clinical trial records worldwide.
- [GBIF Species Occurrence Scraper](https://apify.com/scrapers_lat/gbif-species-scraper): Global biodiversity species records.
- [Hugging Face Models Scraper](https://apify.com/scrapers_lat/huggingface-models-scraper): Machine-learning model metadata.
- [Google News Scraper](https://apify.com/scrapers_lat/google-news-scraper): News articles by keyword.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with OpenAlex or OurResearch. Reads the open OpenAlex catalog. Use in accordance with the OpenAlex terms of use.

# Actor input Schema

## `maxWorks` (type: `integer`):

Maximum number of works to collect. Optional.

## `searchQuery` (type: `string`):

Keyword to search scholarly works by title and full text (for example 'machine learning', 'crispr', 'climate policy').

## `withAiSummary` (type: `boolean`):

Off by default. When on, generates a 1-2 sentence plain-English summary from each work's abstract (skipped when no abstract). Requires a paid Apify plan. Billed only when a summary is produced.

## `withAiKeywords` (type: `boolean`):

Off by default. When on, extracts 5-10 topical keywords per work from its title/abstract. Requires a paid Apify plan. Billed only when keywords are produced.

## `withAiField` (type: `boolean`):

Off by default. When on, classifies each work's academic field/discipline. Requires a paid Apify plan. Billed only when a classification is produced.

## Actor input object example

```json
{
  "maxWorks": 10,
  "searchQuery": "machine learning",
  "withAiSummary": false,
  "withAiKeywords": false,
  "withAiField": false
}
```

# Actor output Schema

## `results` (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 = {
    "maxWorks": 10,
    "searchQuery": "machine learning"
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/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 = {
    "maxWorks": 10,
    "searchQuery": "machine learning",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/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 '{
  "maxWorks": 10,
  "searchQuery": "machine learning"
}' |
apify call scrapers_lat/openalex-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/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/4A8hOlp1UN6cTXd2R/builds/FChgjybQZdSvVJIay/openapi.json
