# Research Papers Search: OpenAlex, Crossref, Europe PMC (`maliksaid/research-papers-search`) Actor

Search academic research papers in OpenAlex, Crossref and Europe PMC with one query. Get one row per paper, merged by DOI: title, authors, year, journal, citation count and open access link. Built for AI agents and literature reviews.

- **URL**: https://apify.com/maliksaid/research-papers-search.md
- **Developed by:** [Malik Said](https://apify.com/maliksaid) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 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/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

## Research Papers Search: OpenAlex, Crossref, Europe PMC

Search academic research papers in three open scholarly databases with one query. The Actor merges results by DOI, so you get one row per paper. Each row has the title, authors, year, journal, citation counts and an open access link when one exists. It is built for AI agents, literature reviews and research tools.

### What it covers

| Source | Coverage | What it adds |
|---|---|---|
| OpenAlex | All fields of research | Venue, open access status and link, citation count |
| Crossref | DOI records from most journals, books and conferences | Publisher record, citation count, licence |
| Europe PMC | Life sciences and medicine, including PubMed and preprints | PubMed and PubMed Central IDs, citation count |

One search reads up to the "Maximum papers" number from each source. A typical search with 25 papers finishes in a few seconds.

### What you get

| Field | Meaning |
|---|---|
| `title` | Paper title |
| `authors` | Author names as published in the scholarly record, up to 50 |
| `authorCount` | Number of authors |
| `year`, `publicationDate` | Publication year and date |
| `venue`, `publisher` | Journal, book or preprint server, and the publisher |
| `type` | Work type as the source labels it |
| `doi`, `url` | DOI and DOI link |
| `abstractSnippet` | First 600 characters of the abstract, only under an open licence (see below) |
| `license` | Creative Commons licence of the paper, when a source reports one |
| `isOpenAccess`, `openAccessUrl` | Open access status and a link to the free full text |
| `citationCount` | Highest citation count from any source |
| `citationCounts` | Citation count from each source |
| `sources` | Sources that returned the paper |
| `openalexId`, `pmid`, `pmcid`, `europepmcId` | IDs in each database |
| `rank` | Position in the merged list |

Sample record from a test run (query `metformin gestational diabetes`, 2020 to 2024, open access only):

```json
{
    "id": "doi:10.1007/s00125-024-06252-y",
    "doi": "10.1007/s00125-024-06252-y",
    "title": "Metformin and small for gestational age babies: findings of a randomised placebo-controlled clinical trial of metformin in gestational diabetes (EMERGE)",
    "authors": [
        "Fidelma Dunne",
        "Christine Newman",
        "Alberto Alvarez‐Iglesias",
        "Paula Mary O’Shea",
        "Declan Devane",
        "Paddy Gillespie",
        "Aoife Maria Egan",
        "Martin James O'Donnell",
        "Andrew Smyth"
    ],
    "authorCount": 9,
    "year": 2024,
    "publicationDate": "2024-08-31",
    "venue": "Diabetologia",
    "publisher": "Springer Science+Business Media",
    "type": "article",
    "abstractSnippet": "AIMS/HYPOTHESIS: Gestational diabetes mellitus (GDM) is associated with adverse perinatal outcomes because of suboptimal glucose management and glucose control and excessive weight gain. Metformin can offset these factors but is associated with small for gestational age (SGA) infants. We sought to identify risk factors for SGA infants, including the effect of metformin exposure on SGA status. METHODS: In this prespecified secondary analysis of the EMERGE trial, which evaluated the effectiveness of metformin vs placebo in treating GDM and found reduced gestational weight gain and longer time...",
    "license": "cc-by",
    "isOpenAccess": true,
    "openAccessUrl": "https://link.springer.com/content/pdf/10.1007/s00125-024-06252-y.pdf",
    "url": "https://doi.org/10.1007/s00125-024-06252-y",
    "citationCount": 10,
    "citationCounts": {
        "openalex": 10,
        "crossref": 9,
        "europepmc": 7
    },
    "sources": [
        "openalex",
        "crossref",
        "europepmc"
    ],
    "openalexId": "W4402078045",
    "pmid": "39215812",
    "pmcid": "PMC11604746",
    "europepmcId": "MED/39215812",
    "rank": 2,
    "query": "metformin gestational diabetes",
    "scrapedAt": "2026-10-21T11:44:01.339Z"
}
```

Some fields can be empty:

- `abstractSnippet` is empty unless the paper is under CC0, CC BY or CC BY-SA. Abstracts under other licences can be under publisher copyright, so the Actor leaves them out.
- `doi` is empty for some Europe PMC records, such as Agricola entries. Those rows use the Europe PMC link in `url`.
- `isOpenAccess` is null when no source states the status.
- `pmid` and `pmcid` are empty for papers outside PubMed.

### How to use it

1. Enter a search query, for example `urban heat island mitigation`.
2. Optional: pick sources, a year range, or open access only.
3. Set the maximum number of papers. The default is 25.
4. Run the Actor. Read the results as JSON, CSV or Excel, or call it from an AI agent through the Apify API or MCP server.

### Input

| Option | Default | Meaning |
|---|---|---|
| Search query | Sample query | Words to search for |
| DOIs to look up | None | Look up known papers by DOI instead of searching. One row per DOI found, in your order |
| Sources | All three | OpenAlex, Crossref, Europe PMC |
| From year, To year | None | Publication year range |
| Open access only | Off | Keep only papers a source marks as open access |
| Sort by | Relevance | Relevance, newest first or most cited first |
| Paper types | All | Keep only journal articles, preprints, reviews, book chapters or datasets. Others are skipped free |
| Maximum papers | 25 | Papers to save. 0 reads up to 1,000 records per source |
| OpenAlex API key | None | Optional free key. See below |

#### OpenAlex key

OpenAlex works without a key, but the keyless budget is small and shared by everyone on the same IP address. If that budget runs out, the run logs a warning, skips OpenAlex and returns results from the other sources. For steady use, get a free key at openalex.org/settings/api and paste it in the input. The key is stored as a secret.

### Look up papers by DOI

Paste a reference list into **DOIs to look up** to get the metadata, citation counts, licence and open access link for each paper:

```json
{
    "dois": ["10.1038/nature12373", "https://doi.org/10.1126/science.1259855"]
}
```

The Actor asks OpenAlex and Crossref for each DOI and merges the answers. A DOI that neither source knows is named in the log and costs nothing.

### Pricing

You pay a small fee per run start and a fee per paper saved. Duplicates across sources are merged before saving, so each paper is charged once. See the Pricing tab for the current prices.

### Data sources and use

- The Actor uses the official public APIs of OpenAlex, Crossref and Europe PMC. It needs no login.
- It identifies itself to each API with a contact address, as Crossref and OpenAlex ask.
- It sends a few requests per run and reads at most 1,000 records per source.
- It collects no email addresses, affiliations or other contact details. Author names come from the published record.
- OpenAlex data is CC0. Crossref states that almost none of its metadata is subject to copyright. Europe PMC is run by EMBL-EBI and asks users to respect the rights of the original data owners. Credit the sources and the paper authors when you publish results.
- arXiv and ClinicalTrials.gov are not included. Their robots.txt files disallow the API paths for automated clients.

### Support

Open an issue on the Issues tab. Include the run ID and the input you used.

# Actor input Schema

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

Words to search for in paper titles, abstracts and metadata. Example: urban heat island mitigation. Leave empty to run a sample search.

## `dois` (type: `array`):

Optional. Look up known papers by DOI, for example 10.1038/nature12373 or https://doi.org/10.1038/nature12373. Each DOI found gives one row from OpenAlex and Crossref, in your order. A DOI no source knows is skipped free. When set, the search query is not used.

## `sources` (type: `array`):

Scholarly databases to search. OpenAlex covers all fields. Crossref holds the DOI records of most journals. Europe PMC covers life sciences and medicine, including PubMed.

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

Keep papers published in this year or later. Leave empty for no lower limit.

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

Keep papers published in this year or earlier. Leave empty for no upper limit.

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

Keep only papers that a source marks as open access.

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

Order of the results. Each source sorts its own list, then the merged list is sorted the same way.

## `types` (type: `array`):

Keep only these types. Leave empty for every type. Papers of other types are skipped free.

## `maxResults` (type: `integer`):

Stop after saving this many papers. Each source returns up to this many records before duplicates are merged. Set 0 to read up to 1,000 records per source.

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

Free key from openalex.org/settings/api. Without a key, OpenAlex gives a small daily budget shared by everyone on the same IP address. When that budget runs out, the run skips OpenAlex and uses the other sources.

## Actor input object example

```json
{
  "query": "urban heat island mitigation",
  "dois": [],
  "sources": [
    "openalex",
    "crossref",
    "europepmc"
  ],
  "openAccessOnly": false,
  "sortBy": "relevance",
  "types": [],
  "maxResults": 25
}
```

# 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 = {
    "query": "urban heat island mitigation",
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("maliksaid/research-papers-search").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 = {
    "query": "urban heat island mitigation",
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("maliksaid/research-papers-search").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 '{
  "query": "urban heat island mitigation",
  "maxResults": 25
}' |
apify call maliksaid/research-papers-search --silent --output-dataset

```

## MCP server setup

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

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/tqWGR7ZrIlccRYvBK/builds/HF1ifUzUER9fmyyUc/openapi.json
