# OpenAlex Scraper - Scholarly Works, Authors & Citations Graph (`jungle_synthesizer/openalex-works-crawler`) Actor

Scrape OpenAlex, the open scholarly graph with 250M+ works, 100M+ authors, and 120K+ institutions. Extract titles, abstracts, authors, ORCIDs, institutions, concepts, citations, open-access flags, and grants.

- **URL**: https://apify.com/jungle\_synthesizer/openalex-works-crawler.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Other, AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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, Authors & Citations Crawler

Extract structured scholarly data from [OpenAlex](https://openalex.org), the open successor to Microsoft Academic Graph. The API covers 309M+ works, 100M+ authors, 120K+ institutions, and 65K+ concepts — titles, DOIs, authors with ORCIDs, citation counts, open-access status, grants, and full abstracts reconstructed from the inverted index most scrapers quietly skip.

### OpenAlex Crawler Features

- Queries six entity types in one actor: Works, Authors, Institutions, Concepts, Sources (journals), and Publishers
- Filters works by publication year range, work type, concept ID, institution country, venue ISSN, and open-access status — combine any of them
- Reconstructs full-text abstracts from OpenAlex's inverted word-position index, a step most competing actors leave out
- Fetches 200 records per API call with cursor pagination, so pulling 10,000 records takes 50 requests, not 500
- Extracts 30+ fields per work including authors with ORCIDs, all contributing institutions, top concepts with scores, grants, referenced works, and SDG tags
- Qualifies for the OpenAlex polite pool via the `politeEmail` input — higher rate limits and better latency
- Pure JSON API, no HTML parsing, no proxy, no authentication required

### Who Uses OpenAlex Data and Why?

- **AI/ML teams training research assistants** — bulk-fetch works with abstracts to build citation recommenders, literature review agents, and domain-specific retrieval corpora
- **Bibliometric analysts** — map citation networks by concept, institution, or country and track publication output over time
- **Research intelligence products** — feed competitive analysis dashboards that track which labs publish what and who funds it
- **Academic librarians** — build institutional publication lists filtered by open-access status and funding source
- **Science policy researchers** — measure research alignment with the UN Sustainable Development Goals across countries and years

### How OpenAlex Crawler Works

1. Pick an entity type — Works is the default, but Authors, Institutions, Concepts, Sources, and Publishers all work the same way.
2. Add filters. For Works that means year range, concept, country, venue ISSN, and the open-access flag. Other entities accept the filters that apply to them.
3. The crawler hits the OpenAlex API with cursor pagination, pulling up to 200 records per request until it hits your `maxItems` limit or exhausts the query.
4. Each record is flattened into a consistent schema — arrays stay as arrays of primitives, concepts and grants get formatted into readable strings, abstracts are rebuilt from the inverted index when you want them.

### Input

#### Basic: recent machine learning papers

```json
{
    "entityType": "works",
    "query": "machine learning",
    "yearFrom": 2023,
    "yearTo": 2024,
    "maxItems": 500
}
````

#### Open-access climate science, concept-filtered

```json
{
    "entityType": "works",
    "concept": "C132651083",
    "openAccessOnly": true,
    "institutionCountry": "US",
    "maxItems": 1000,
    "politeEmail": "you@example.com"
}
```

#### Authors search

```json
{
    "entityType": "authors",
    "query": "yoshua bengio",
    "maxItems": 20
}
```

#### Institutions in a country

```json
{
    "entityType": "institutions",
    "institutionCountry": "DE",
    "maxItems": 100
}
```

#### Input Parameters

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| entityType | string | `works` | One of `works`, `authors`, `institutions`, `concepts`, `sources`, `publishers`. |
| query | string | `machine learning` | Full-text search across titles and abstracts (works) or display names (other entities). Leave empty to browse all. |
| yearFrom | integer | `0` | Earliest publication year (Works only). `0` means no lower bound. |
| yearTo | integer | `0` | Latest publication year (Works only). `0` means no upper bound. |
| openAccessOnly | boolean | `false` | Restrict Works to open-access publications. |
| workType | string | `""` | Filter by work type: `article`, `preprint`, `book`, `book-chapter`, `dataset`, `dissertation`, `review`, `report`, `standard`, `other`. |
| concept | string | `""` | OpenAlex concept ID (e.g. `C41008148` for Computer Science). Applies to Works and Authors. |
| institutionCountry | string | `""` | Two-letter ISO country code. Applies to Works (via authorships), Authors, and Institutions. |
| venueIssn | string | `""` | Filter Works by host venue ISSN (e.g. `0028-0836` for Nature). |
| reconstructAbstract | boolean | `true` | Rebuild full abstracts from the OpenAlex inverted index. Adds a small amount of per-record work. |
| politeEmail | string | `""` | Your email to qualify for the OpenAlex polite pool. Recommended for any real run. |
| maxItems | integer | `100` | Maximum records to return. Set to `0` for unlimited — requires at least one filter or search query. |
| proxyConfiguration | object | disabled | Proxy settings. OpenAlex does not require proxies. |

### OpenAlex Crawler Output Fields

All entity types share a common output schema. Fields that don't apply to a given entity type are left empty. The examples below show Works and Authors — Institutions, Concepts, Sources, and Publishers use the same table.

#### Works output example

```json
{
    "openalex_id": "W2101234009",
    "doi": "https://doi.org/10.5555/1953048.2078195",
    "title": "Scikit-learn: Machine Learning in Python",
    "abstract": "Scikit-learn is a Python module integrating a wide range of state-of-the-art machine learning algorithms for medium-scale supervised and unsupervised problems...",
    "entity_type": "work",
    "publication_year": 2011,
    "publication_date": "2011-10-01",
    "work_type": "article",
    "language": "en",
    "open_access_is_oa": true,
    "open_access_status": "green",
    "open_access_oa_url": "https://hal.inria.fr/hal-00650905v2/document",
    "venue_name": "Journal of Machine Learning Research",
    "venue_issn": "1532-4435, 1533-7928",
    "venue_publisher": "JMLR",
    "author_names": ["Fabian Pedregosa", "Gaël Varoquaux", "Alexandre Gramfort"],
    "author_ids": ["A5014316393", "A5047509574", "A5001829085"],
    "author_orcids": ["https://orcid.org/0000-0003-4025-383X"],
    "corresponding_author_name": "Fabian Pedregosa",
    "first_institution_name": "Inria",
    "first_institution_country": "FR",
    "institution_names": ["Inria", "CEA", "ENS Paris"],
    "institution_ids": ["I1294671590", "I4210121523"],
    "concepts": [
        "Computer science (L0, 0.820)",
        "Machine learning (L1, 0.750)",
        "Python (programming language) (L3, 0.610)"
    ],
    "cited_by_count": 58421,
    "referenced_works_count": 18,
    "referenced_works": ["W2109394935", "W2131462250"],
    "related_works": ["W2963773651"],
    "counts_by_year": ["2023: 8421", "2022: 7310", "2021: 6122"],
    "grants": ["French National Research Agency — ANR-12-BS01-0009"],
    "sustainable_development_goals": [],
    "openalex_url": "https://openalex.org/W2101234009"
}
```

#### Authors output example

```json
{
    "openalex_id": "A5083138872",
    "title": "Albert Einstein",
    "entity_type": "author",
    "author_orcids": [],
    "institution_names": ["Princeton University", "Institute for Advanced Study"],
    "concepts": [
        "Physics (L0, 0.910)",
        "Quantum mechanics (L1, 0.720)"
    ],
    "cited_by_count": 184521,
    "works_count": 412,
    "counts_by_year": ["2024: 1502", "2023: 1610"],
    "openalex_url": "https://openalex.org/A5083138872"
}
```

| Field | Type | Description |
|-------|------|-------------|
| openalex\_id | string | Short OpenAlex identifier (W\*, A\*, I\*, C\*, S\*, P\*). |
| entity\_type | string | `work`, `author`, `institution`, `concept`, `source`, or `publisher`. |
| title | string | Work title or entity display name. |
| doi | string | DOI URL (Works only). |
| abstract | string | Full abstract reconstructed from OpenAlex's inverted index (Works only, when `reconstructAbstract` is enabled). |
| publication\_year | number | Publication year (Works only). |
| publication\_date | string | Publication date in YYYY-MM-DD (Works only). |
| work\_type | string | Work type: article, preprint, book, dataset, etc. (Works only). |
| language | string | Language code (Works only). |
| open\_access\_is\_oa | boolean | Open-access flag (Works and Sources). |
| open\_access\_status | string | gold, green, hybrid, bronze, diamond, closed (Works only). |
| open\_access\_oa\_url | string | URL to the open-access version (Works only). |
| venue\_name | string | Host venue or journal name (Works only). |
| venue\_issn | string | Host venue ISSN, comma-separated (Works and Sources). |
| venue\_publisher | string | Host venue publisher name (Works and Sources). |
| author\_names | string\[] | Author display names. |
| author\_ids | string\[] | OpenAlex author IDs. |
| author\_orcids | string\[] | Author ORCID URLs when available. |
| corresponding\_author\_name | string | Name of the corresponding author (Works only). |
| first\_institution\_name | string | Primary institution of the first author (Works only). |
| first\_institution\_country | string | Country code of the first author's institution (Works only). |
| institution\_names | string\[] | All institutions across all authors (Works, Authors). |
| institution\_ids | string\[] | All OpenAlex institution IDs (Works only). |
| concepts | string\[] | Top 5 OpenAlex concepts, formatted as `Name (Level, Score)`. |
| cited\_by\_count | number | Total citation count. |
| referenced\_works\_count | number | Number of works this work cites (Works only). |
| referenced\_works | string\[] | OpenAlex IDs of referenced works (Works only). |
| related\_works | string\[] | OpenAlex IDs of related works (Works only). |
| counts\_by\_year | string\[] | Citations per year, formatted as `YYYY: N`. |
| grants | string\[] | Funders and award IDs, formatted as `Funder — Award`. |
| sustainable\_development\_goals | string\[] | UN SDG names matched to the work. |
| works\_count | number | Number of works (Authors, Institutions, Concepts, Sources, Publishers). |
| country\_code | string | Country code (Institutions, Publishers). |
| homepage\_url | string | Homepage URL (Institutions, Publishers). |
| concept\_level | number | Concept hierarchy level, 0 = most general (Concepts only). |
| concept\_description | string | Concept description text (Concepts only). |
| openalex\_url | string | Full OpenAlex URL for the entity. |

### FAQ

**How many records does OpenAlex Crawler cover?**
OpenAlex Crawler reads the full OpenAlex index — 309M+ works, 100M+ authors, 120K+ institutions, and 65K+ concepts. If a paper, researcher, or organization is in OpenAlex, the crawler can reach it.

**Do I need an API key or proxies?**
OpenAlex Crawler runs without either. OpenAlex is free and open. Setting `politeEmail` is optional but recommended — it qualifies runs for the polite pool, which has higher rate limits and more predictable latency than the shared anonymous pool.

**What is abstract reconstruction and why does it matter?**
OpenAlex stores abstracts as an inverted index — a map of words to their positions — to comply with publisher terms. The raw field is not human-readable. OpenAlex Crawler rebuilds the original text from that index, so you get a normal paragraph instead of a JSON object. Most competing actors skip this step.

**Can I run a bulk export without filters?**
Not with `maxItems` set to `0`. Pulling the entire 309M-work index through the API would take a while and would not be what most people actually want. Provide at least one filter or a search query when running unlimited. With filters, unlimited runs are fine — the cursor pagination scales.

**How do I filter by a specific concept?**
OpenAlex Crawler accepts any OpenAlex concept ID in the `concept` field. Find IDs by browsing [openalex.org/concepts](https://openalex.org/concepts) or querying the Concepts endpoint in this actor. Common examples: `C41008148` (Computer Science), `C86803240` (Biology), `C185592680` (Chemistry), `C121332964` (Physics).

**How current is the data?**
OpenAlex Crawler reads the live OpenAlex API. OpenAlex ingests from Crossref, PubMed, institutional repositories, and other sources on a continuous basis; individual records include `publication_date` and update timestamps on the underlying records.

### Need More Features?

Need extra fields, a different filter, or a scheduled run? [Get in touch](https://console.apify.com/actors/issues).

### Why Use OpenAlex Crawler?

- **Full scholarly graph, one actor** — Works, Authors, Institutions, Concepts, Sources, and Publishers all share the same output schema, so you can build pipelines across entity types without juggling separate tools
- **Reconstructed abstracts** — OpenAlex returns abstracts as an inverted word-position index, which is not text anyone can use directly; this crawler rebuilds them into readable paragraphs, which is usually what the data is for
- **Clean, flat output** — 30+ fields per work, arrays of primitives rather than nested blobs, so downstream CSV exports, pandas DataFrames, and database loads work without preprocessing

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

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

Which OpenAlex entity to query.

## `query` (type: `string`):

Search query across titles and abstracts (works) or display names (other entities). Leave empty to browse all.

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

Earliest publication year (Works only). Leave 0 for no lower bound.

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

Latest publication year (Works only). Leave 0 for no upper bound.

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

Restrict to open-access works (Works only).

## `workType` (type: `string`):

Filter by work type (Works only).

## `concept` (type: `string`):

Filter by OpenAlex concept ID (e.g. C41008148 = Computer Science). Works & Authors only.

## `institutionCountry` (type: `string`):

Two-letter ISO country code (e.g. US, GB, DE). Applies to Works (authorships), Authors, and Institutions.

## `venueIssn` (type: `string`):

Filter Works by host venue ISSN (e.g. 0028-0836 for Nature).

## `reconstructAbstract` (type: `boolean`):

Rebuild full-text abstracts from the OpenAlex inverted index (Works only). Slightly slower per record.

## `politeEmail` (type: `string`):

Your email to qualify for the OpenAlex polite pool (higher rate limits, better latency). Recommended for any real run.

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

Maximum number of records to return. Set to 0 for unlimited.

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

OpenAlex does not require proxies. Leave default unless your network blocks direct access.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "entityType": "works",
  "query": "machine learning",
  "yearFrom": 0,
  "yearTo": 0,
  "openAccessOnly": false,
  "workType": "",
  "reconstructAbstract": true,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "entityType": "works",
    "query": "machine learning",
    "yearFrom": 0,
    "yearTo": 0,
    "openAccessOnly": false,
    "workType": "",
    "concept": "",
    "institutionCountry": "",
    "venueIssn": "",
    "reconstructAbstract": true,
    "politeEmail": "",
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/openalex-works-crawler").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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "entityType": "works",
    "query": "machine learning",
    "yearFrom": 0,
    "yearTo": 0,
    "openAccessOnly": False,
    "workType": "",
    "concept": "",
    "institutionCountry": "",
    "venueIssn": "",
    "reconstructAbstract": True,
    "politeEmail": "",
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

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

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

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

```

## CLI example

```bash
echo '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "entityType": "works",
  "query": "machine learning",
  "yearFrom": 0,
  "yearTo": 0,
  "openAccessOnly": false,
  "workType": "",
  "concept": "",
  "institutionCountry": "",
  "venueIssn": "",
  "reconstructAbstract": true,
  "politeEmail": "",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call jungle_synthesizer/openalex-works-crawler --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jungle_synthesizer/openalex-works-crawler",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "OpenAlex Scraper - Scholarly Works, Authors & Citations Graph",
        "description": "Scrape OpenAlex, the open scholarly graph with 250M+ works, 100M+ authors, and 120K+ institutions. Extract titles, abstracts, authors, ORCIDs, institutions, concepts, citations, open-access flags, and grants.",
        "version": "1.0",
        "x-build-id": "jXVoRsJ9ydvmBggDV"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~openalex-works-crawler/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-openalex-works-crawler",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~openalex-works-crawler/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-openalex-works-crawler",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~openalex-works-crawler/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-openalex-works-crawler",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "sp_intended_usage",
                    "sp_improvement_suggestions"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "entityType": {
                        "title": "Entity Type",
                        "enum": [
                            "works",
                            "authors",
                            "institutions",
                            "concepts",
                            "sources",
                            "publishers"
                        ],
                        "type": "string",
                        "description": "Which OpenAlex entity to query.",
                        "default": "works"
                    },
                    "query": {
                        "title": "Full-text Search",
                        "type": "string",
                        "description": "Search query across titles and abstracts (works) or display names (other entities). Leave empty to browse all."
                    },
                    "yearFrom": {
                        "title": "Publication Year From",
                        "type": "integer",
                        "description": "Earliest publication year (Works only). Leave 0 for no lower bound.",
                        "default": 0
                    },
                    "yearTo": {
                        "title": "Publication Year To",
                        "type": "integer",
                        "description": "Latest publication year (Works only). Leave 0 for no upper bound.",
                        "default": 0
                    },
                    "openAccessOnly": {
                        "title": "Open Access Only",
                        "type": "boolean",
                        "description": "Restrict to open-access works (Works only).",
                        "default": false
                    },
                    "workType": {
                        "title": "Work Type",
                        "enum": [
                            "",
                            "article",
                            "preprint",
                            "book",
                            "book-chapter",
                            "dataset",
                            "dissertation",
                            "review",
                            "report",
                            "standard",
                            "other"
                        ],
                        "type": "string",
                        "description": "Filter by work type (Works only).",
                        "default": ""
                    },
                    "concept": {
                        "title": "Concept ID",
                        "type": "string",
                        "description": "Filter by OpenAlex concept ID (e.g. C41008148 = Computer Science). Works & Authors only."
                    },
                    "institutionCountry": {
                        "title": "Institution Country Code",
                        "type": "string",
                        "description": "Two-letter ISO country code (e.g. US, GB, DE). Applies to Works (authorships), Authors, and Institutions."
                    },
                    "venueIssn": {
                        "title": "Venue ISSN",
                        "type": "string",
                        "description": "Filter Works by host venue ISSN (e.g. 0028-0836 for Nature)."
                    },
                    "reconstructAbstract": {
                        "title": "Reconstruct Abstracts",
                        "type": "boolean",
                        "description": "Rebuild full-text abstracts from the OpenAlex inverted index (Works only). Slightly slower per record.",
                        "default": true
                    },
                    "politeEmail": {
                        "title": "Polite Pool Email",
                        "type": "string",
                        "description": "Your email to qualify for the OpenAlex polite pool (higher rate limits, better latency). Recommended for any real run."
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum number of records to return. Set to 0 for unlimited.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "OpenAlex does not require proxies. Leave default unless your network blocks direct access."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
