# Academic Papers Scraper: OpenAlex Research Paper Alerts (`agents001/academic-research-feed`) Actor

Returns OpenAlex research papers by keyword, author, institution or topic: title, DOI, date, venue, open access link, authors, institutions, citation count and CC0 abstracts, with optional arXiv and Crossref enrichment. Only new papers mode for research paper alerts.

- **URL**: https://apify.com/agents001/academic-research-feed.md
- **Developed by:** [Mike Ross](https://apify.com/agents001) (community)
- **Categories:** AI, Other
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 paper records

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

## Academic Papers Scraper: OpenAlex Research Paper Alerts

**Academic papers scraper** for OpenAlex research papers: returns paper metadata as clean structured data, **one record per paper** with title, DOI, publication date, venue, work type, open access status and the free-to-read link, authors with their institutions and ORCIDs, institutions with ROR IDs, research topics and concepts, citation count, the abstract where its licence allows, source links and a licence attribution line.

Search by **keyword**, **author**, **institution** or **topic**, filter by publication date and open access, sort by newest or most cited, and switch on `onlyNew` to get only the papers that appeared since your last run. Schedule it and you have a literature alert feed.

The data comes from **OpenAlex**, the open catalogue of over 300 million scholarly works, released as CC0. You can add **arXiv** details for preprints and **Crossref** publisher, licence and funder details.

Use it to:

- Get a daily or weekly research paper alert for your topics, authors or institution.
- Build a reading list for a literature review, sorted by newest or most cited.
- Track what a university, lab or company publishes.
- Find the free to read copy of a paper through its open access link.
- Build AI or analytics datasets with CC0 metadata and abstracts.

### What you get

| Field | Example |
|---|---|
| `title`, `doi` | `Experimental reasoning in large language models`, `10.64898/2026.10.20.760214` |
| `publicationDate`, `publicationYear` | `2026-10-21`, `2026` |
| `venue`, `venueType`, `publisher`, `issn` | `bioRxiv (Cold Spring Harbor Laboratory)`, `repository`, `Cold Spring Harbor Laboratory` |
| `type`, `language` | `article`, `preprint`, `review`, `book-chapter`, `dataset` and more |
| `isOpenAccess`, `oaStatus`, `oaUrl`, `workLicence` | `true`, `green`, link to the free copy, `cc-by` |
| `authorNames`, `authorCount`, `authors` | Names in byline order; per author: position, ORCID, OpenAlex ID, institutions, countries |
| `institutionNames`, `institutions`, `countries` | Per institution: name, OpenAlex ID, ROR, country, type |
| `primaryTopic`, `topics`, `concepts`, `keywords` | Topic with subfield, field and domain |
| `citationCount`, `referencesCount`, `fwci`, `isRetracted` | Citations so far, references, field-weighted citation impact |
| `abstract`, `abstractSource` | Abstract text from OpenAlex or arXiv (both CC0) |
| `openAlexId`, `pmid`, `arxivId`, `landingPageUrl`, `sourceLinks` | Links to OpenAlex, DOI, publisher page, open access copy, arXiv and PubMed |
| `arxiv` | With arXiv enrichment: categories, version, dates, comment, journal reference |
| `crossref` | With Crossref enrichment: publisher, licences, funders and award numbers, ISSNs, subjects |
| `matchedQueries`, `isNew`, `firstSeenAt` | Which of your searches found it, and whether it is new since the previous run |
| `licence`, `dataSources`, `primarySource` | Licence and attribution for the metadata in this record |

The Output tab has four views: **Papers**, **Open access**, **Citations and topics** and **Abstracts**.

### Who it is for

- **Researchers and librarians** who want a weekly list of new papers on their topics, by their collaborators or from their institution.
- **R\&D, competitive intelligence and patent teams** tracking what universities and companies publish.
- **Research offices and funders** monitoring output, open access share and citations.
- **AI and data teams** building literature datasets with clear CC0 licensing.
- **Science journalists and analysts** following a field as it moves.

### Quick start

1. Click **Start** with the example input. You get the newest papers about large language models.
2. Replace the search with your own words, or add authors (ORCID works best), institutions (ROR ID works best) or topics.
3. Narrow it down with dates, **Published in the last N days** or **Open access only**.
4. For alerts, switch on **Only papers not seen in previous runs**, schedule the Actor daily or weekly, and send the dataset to email, Slack, Google Sheets or your database with an Apify integration or webhook.

### Input

| Field | What it does | Default |
|---|---|---|
| `searchQueries` | One search per entry. Words are combined with AND; use quotes for phrases and `OR` or `NOT` in capitals | example query |
| `searchIn` | `titleAbstractKeywords`, `titleAndAbstract`, `title` or `everything` (adds full text where OpenAlex has it) | `titleAbstractKeywords` |
| `authors` | ORCIDs, OpenAlex author IDs or names | none |
| `institutions` | ROR IDs, OpenAlex institution IDs or names. Includes departments and labs | none |
| `topics` | OpenAlex topic IDs or topic names | none |
| `fromDate`, `toDate` | Publication date window, `YYYY-MM-DD` | none |
| `publishedWithinDays` | Only papers published in the last N days | 0 (off) |
| `openAccessOnly` | Only papers that are free to read | false |
| `sort` | `newest`, `mostCited` or `relevance` | `newest` |
| `maxItems` | Maximum paper records in total, shared between searches | 100 |
| `onlyNew` | Only papers not returned by a previous run with the same search and filters | false |
| `includeAbstracts` | Add CC0 abstracts from OpenAlex or arXiv | true |
| `enrichWithArxiv` | Add arXiv details for papers on arXiv | false |
| `enrichWithCrossref` | Add Crossref publisher, licence and funder details | false |
| `openAlexApiKey` | Optional free OpenAlex API key (stored as a secret) | none |

Example input for a weekly alert:

```json
{
  "searchQueries": ["\"solid-state battery\" electrolyte", "sodium-ion battery"],
  "institutions": ["https://ror.org/042nb2s44"],
  "publishedWithinDays": 14,
  "openAccessOnly": false,
  "sort": "newest",
  "onlyNew": true,
  "maxItems": 200,
  "openAlexApiKey": "YOUR_FREE_KEY"
}
```

#### Names, IDs and how matching works

Names are looked up in OpenAlex and the best match is used; the match is listed in the `RUN_SUMMARY` record under `resolvedFilters`, so you can check it. Common names can match the wrong person, so use an ORCID for authors and a ROR ID for institutions when you can. Several authors, institutions or topics are combined with OR inside each group, and the groups are combined with AND.

### Do I need an OpenAlex API key?

No. Without a key the Actor reads the **first page of results for each search, up to 100 papers**, which is plenty for the example, for small searches and for most daily alerts.

A free key from OpenAlex (create an account at openalex.org, then Settings, API key) gives you:

- **Paging through all results**, up to 5,000 per search per run.
- **Your own daily allowance** of roughly 1,000 searches, instead of a small allowance shared by everyone on the same IP address.

When the shared allowance is used up and no key is given, the Actor still returns results: it searches Crossref for matching DOIs and then reads each paper from OpenAlex as a single record, which OpenAlex does not charge for. These records show `discoveredVia: "crossref-search"`. Matching in this mode is looser (author and institution names are matched as text), and with "Newest first" it looks back 90 days unless you set a start date. The run summary says when this happened. With a key, the Actor uses OpenAlex search directly.

### Output example

```json
{
  "title": "Experimental reasoning in large language models",
  "doi": "10.64898/2026.10.20.760214",
  "publicationDate": "2026-10-21",
  "publicationYear": 2026,
  "venue": "bioRxiv (Cold Spring Harbor Laboratory)",
  "venueType": "repository",
  "publisher": "Cold Spring Harbor Laboratory",
  "type": "preprint",
  "isOpenAccess": true,
  "oaStatus": "green",
  "oaUrl": "https://www.biorxiv.org/content/biorxiv/early/2026/10/21/2026.10.20.760214.full.pdf",
  "workLicence": "cc-by",
  "authorNames": "Jeongyheon Kim; Philip Romero",
  "authorCount": 2,
  "authors": [
    {
      "name": "Jeongyheon Kim",
      "position": "first",
      "orcid": null,
      "openAlexId": "A5126074038",
      "institutions": ["Duke University"],
      "countries": ["US"],
      "isCorresponding": false
    }
  ],
  "institutionNames": "Duke University",
  "institutions": [
    {"name": "Duke University", "openAlexId": "I170897317", "ror": "https://ror.org/00py81415", "countryCode": "US", "type": "education"}
  ],
  "primaryTopic": "AI-based Problem Solving and Planning",
  "keywords": ["experimental reasoning", "large language models", "laboratory automation", "AI agents"],
  "citationCount": 0,
  "abstract": "Scientific reasoning requires interaction with the physical world: designing experiments, interpreting outcomes, and deciding what experiment should come next. ...",
  "abstractSource": "openalex",
  "openAlexId": "W7222941417",
  "sourceLinks": {
    "openAlex": "https://openalex.org/W7222941417",
    "doi": "https://doi.org/10.64898/2026.10.20.760214",
    "openAccess": "https://www.biorxiv.org/content/biorxiv/early/2026/10/21/2026.10.20.760214.full.pdf"
  },
  "matchedQueries": ["large language models"],
  "isNew": true,
  "primarySource": "openalex",
  "dataSources": ["openalex"],
  "licence": "Metadata from OpenAlex (openalex.org), CC0 1.0 public domain dedication. Abstract from OpenAlex, CC0 1.0. Linked full texts keep their own licences."
}
```

A run report is saved in the key-value store as `RUN_SUMMARY`: records returned, how each author, institution or topic was matched, the date window used, pages read, enrichment counts and any notes.

### Pricing

This Actor uses **pay per event** pricing, with platform usage included:

- **$1.50 per 1,000 paper records** (`paper-record` event, $0.0015 each)

You only pay for paper records saved to your dataset, so filters, `onlyNew` and `maxItems` keep costs down. Enrichment from arXiv and Crossref is included in the price. Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached. If you use your own OpenAlex API key, any OpenAlex usage beyond its free daily allowance is between you and OpenAlex.

### How "only new papers" works

When `onlyNew` is on, the Actor remembers which papers it has already returned for this exact search and filters, in a key-value store in your account called `agents001-academic-research-feed-state`. The next run only returns papers that are not on that list. The first run returns everything that matches. Sorting, `maxItems` and enrichment settings do not reset the history; changing the search or filters starts a fresh one. The store holds paper IDs and dates only.

With `onlyNew` off, the Actor does not open or update this store, so every record has `isNew` set to true. If a run stops with a message that it cannot open the store (for example because another Actor in your account already uses that name), enter a different name in **State store name** and run again.

For alerts, combine `onlyNew` with `publishedWithinDays` (for example 14) and "Newest first". Papers are sometimes added to OpenAlex weeks after their publication date, and the window catches those late arrivals.

### Data sources, licences and privacy

- **OpenAlex** (openalex.org): all metadata and abstracts are released under **CC0 1.0**. Abstracts are rebuilt from OpenAlex's word index. Cite OpenAlex: Priem, J., Piwowar, H., and Orr, R. (2022). OpenAlex: A fully-open index of scholarly works, authors, venues, institutions, and concepts. arXiv:2205.01833.
- **arXiv** (arxiv.org, optional): descriptive metadata including abstracts is **CC0 1.0**. The Actor reads metadata only, keeps to one request every three seconds, and links to arXiv abstract pages. It never downloads, stores or serves arXiv PDFs.
- **Crossref** (crossref.org, optional and fallback): bibliographic metadata, free to reuse. **Crossref abstracts are never included**, because publishers or authors may hold copyright in them.
- Every record carries a `licence` field naming the sources used for it. Full texts reached through `oaUrl` or other links keep their own licences (see `workLicence`).
- **Authors**: names, ORCIDs and institutional affiliations are public scholarly authorship data and are included. Email addresses and raw affiliation text (which can contain emails) are never output.

### FAQ

**Why did I get fewer papers than `maxItems`?**
Without an API key only the first page (up to 100 papers) of each search is read, and with several searches `maxItems` is shared between them. With `onlyNew`, papers returned before are skipped. Add a free OpenAlex key to page further.

**Why is the abstract empty for some papers?**
OpenAlex has no abstract for some works, often books, chapters and some publishers' articles. Switch on arXiv enrichment to fill it for preprints that are on arXiv.

**Why do some papers have a publication date in the future?**
Journals often date issues ahead. With "Newest first" and no end date, the Actor stops at today. Set `toDate` if you want them.

**How fresh is the data?**
OpenAlex adds tens of thousands of works a day, usually within days of publication. Citation counts are updated continuously.

**How much does a typical run cost?**
$1.50 per 1,000 paper records, with arXiv and Crossref enrichment included. A run with the default limit of 100 papers costs at most $0.15.

**Can I schedule it and get only new papers?**
Yes. Schedule it in Apify daily or weekly and switch on **Only papers not seen in previous runs** (`onlyNew`). Each run then returns only papers not returned before for the same search and filters.

**Does it need a login or API key?**
No login is needed. An OpenAlex API key is optional and free; see **Do I need an OpenAlex API key?** above for what it adds.

**What formats can I export?**
Apify gives you the dataset as JSON, CSV or Excel, and through the Apify API or an integration.

**Is it legal? Where does the data come from?**
Metadata and abstracts come from OpenAlex under CC0 1.0, with optional arXiv metadata (CC0) and Crossref bibliographic metadata. Crossref abstracts and arXiv PDFs are never included. Every record carries a `licence` field naming its sources.

**Something looks wrong. What should I do?**
Open an issue on the Actor's Issues tab with the run link and the input.

### Disclaimer

This Actor is independent and is not affiliated with, endorsed by or sponsored by OpenAlex, OurResearch, arXiv, Cornell University, Crossref or any publisher. Source names are used only to describe where the data comes from. Check the original paper before relying on its details.

# Actor input Schema

## `searchQueries` (type: `array`):

One search per entry, for example 'CRISPR base editing' or 'carbon capture'. Words are combined with AND. Use quotes for an exact phrase and OR or NOT in capitals for Boolean searches. Leave empty to search by author, institution or topic only.

## `searchIn` (type: `string`):

Which text the search queries are matched against.

## `authors` (type: `array`):

Only papers by any of these authors. Give an ORCID (0000-0002-1825-0097), an OpenAlex author ID (A5023888391) or a name. Names take the best match, so ORCIDs are more precise.

## `institutions` (type: `array`):

Only papers with an author from any of these institutions, including their departments and labs. Give a ROR ID (https://ror.org/042nb2s44), an OpenAlex institution ID (I63966007) or a name.

## `topics` (type: `array`):

Only papers tagged with any of these research topics. Give an OpenAlex topic ID (T10028) or a topic name such as 'Topic Modeling'.

## `fromDate` (type: `string`):

Earliest publication date, as YYYY-MM-DD.

## `toDate` (type: `string`):

Latest publication date, as YYYY-MM-DD. With 'Newest first' sorting and no date here, the search ends today, so journal issues dated in the future do not crowd out new papers.

## `publishedWithinDays` (type: `integer`):

Only papers published in the last N days. Handy for scheduled runs. 0 means no limit.

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

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

## `sort` (type: `string`):

Newest first, most cited first, or best match to the search (best match needs a search query).

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

Stop after this many paper records in total. With several search queries the limit is shared between them. You pay per paper record returned.

## `onlyNew` (type: `boolean`):

Remember which papers were already returned for this exact search and filters, and only return new ones. The first run returns everything that matches. Ideal for scheduled alerts. Changing the search or filters starts a fresh history.

## `includeAbstracts` (type: `boolean`):

Add the abstract where its licence allows: OpenAlex abstracts (CC0) and arXiv abstracts (CC0). Crossref abstracts are never included.

## `enrichWithArxiv` (type: `boolean`):

For papers that are on arXiv, add the arXiv ID, categories, versions, comments and the arXiv abstract. arXiv allows one request every 3 seconds, so this adds about 3 seconds per 50 arXiv papers. Links only; no PDFs are downloaded.

## `enrichWithCrossref` (type: `boolean`):

For papers with a DOI, add Crossref publisher details, licence links, funders and awards, ISSNs and subjects. About one second per 20 papers.

## `openAlexApiKey` (type: `string`):

Without a key the Actor reads only the first page of results per search (up to 100 papers) and shares a small free daily allowance with other users. A free key from openalex.org (Settings, API key) unlocks paging through all results and gives you your own daily allowance of about 1,000 searches.

## `stateStoreName` (type: `string`):

Only used when 'Only papers not seen in previous runs' is on. Name of the key-value store in your account that remembers which papers were already returned. Each different search gets its own record inside it. Change it only to keep separate histories. If a run reports that it cannot open the store, enter a different name here.

## Actor input object example

```json
{
  "searchQueries": [
    "large language models"
  ],
  "searchIn": "titleAbstractKeywords",
  "publishedWithinDays": 0,
  "openAccessOnly": false,
  "sort": "newest",
  "maxItems": 100,
  "onlyNew": false,
  "includeAbstracts": true,
  "enrichWithArxiv": false,
  "enrichWithCrossref": false,
  "stateStoreName": "agents001-academic-research-feed-state"
}
```

# Actor output Schema

## `papers` (type: `string`):

No description

## `openAccess` (type: `string`):

No description

## `runSummary` (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 = {
    "searchQueries": [
        "large language models"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("agents001/academic-research-feed").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 = { "searchQueries": ["large language models"] }

# Run the Actor and wait for it to finish
run = client.actor("agents001/academic-research-feed").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 '{
  "searchQueries": [
    "large language models"
  ]
}' |
apify call agents001/academic-research-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,agents001/academic-research-feed"
        }
    }
}
```

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/vQ31rOv1oaRnCJCcZ/builds/PCKA797BxXhPiIJEQ/openapi.json
