# Research Papers: Search PubMed, arXiv & Crossref (`tidelane/research-papers`) Actor

Search scientific papers in PubMed, arXiv and Crossref at once and get clean records: title, abstract, authors, journal, date, DOI, citations, open-access links and PDFs, with duplicates across sources removed. Or look up metadata for a list of DOIs, PubMed IDs and arXiv IDs. Official APIs, no key.

- **URL**: https://apify.com/tidelane/research-papers.md
- **Developed by:** [Tidelane Data](https://apify.com/tidelane) (community)
- **Categories:** AI, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 papers

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

## Research Papers: Search PubMed, arXiv & Crossref

Search **scientific papers** in three big databases at once and get one clean, uniform record per paper:

- **PubMed**: about 38 million biomedical and life-science articles, with MeSH terms
- **arXiv**: preprints in physics, mathematics, computer science, AI, statistics, economics and more
- **Crossref**: metadata of almost every journal article, book chapter and conference paper with a DOI, with **citation counts**

Every record has **title, abstract, authors, journal, publication date, DOI, keywords or categories, links to the paper, full text and PDF** where available, and an open-access flag. A paper found in several databases is returned once.

Or use **lookup mode** to turn a list of **DOIs, PubMed IDs and arXiv IDs** into full records, for example to enrich a reference list.

- ✅ **One schema for all sources**: no more mapping three different APIs
- ✅ **Date filters and newest-first sorting**, for literature monitoring with a schedule
- ✅ **Deduplicated** by DOI across sources
- ✅ **Advanced queries**: exact phrases, PubMed field tags, arXiv fields like `ti:`, `au:`, `cat:cs.LG`
- ✅ **Official APIs** used within their rate limits; no key needed
- ✅ **Fair billing**: per returned paper

### Input examples

Newest papers on a topic since 2025, from all sources:

```json
{
    "query": "crispr base editing",
    "from": "2025",
    "sortBy": "date",
    "maxResultsPerSource": 250
}
```

AI preprints and journal articles:

```json
{
    "query": "\"large language model\" agents",
    "sources": ["arxiv", "crossref"],
    "maxResultsPerSource": 400
}
```

Look up known papers:

```json
{
    "mode": "lookup",
    "ids": ["10.1038/s41586-020-2649-2", "42900733", "arXiv:1706.03762"]
}
```

### Output examples

Real output from a test run (abstracts and author lists shortened). From Crossref:

```json
{
    "source": "crossref",
    "doi": "10.1038/s41586-020-2649-2",
    "title": "Array programming with NumPy",
    "abstract": "Array programming provides a powerful, compact and expressive syntax for accessing, manipulating and operating on data in vectors, matrices and higher-dimension…",
    "authors": ["Charles R. Harris", "K. Jarrod Millman", "Stéfan J. van der Walt", "…"],
    "journal": "Nature",
    "publisher": "Springer Science and Business Media LLC",
    "publicationDate": "2020-09-16",
    "year": 2020,
    "type": ["journal-article"],
    "citationCount": 25397,
    "url": "https://doi.org/10.1038/s41586-020-2649-2",
    "pdfUrl": "https://www.nature.com/articles/s41586-020-2649-2.pdf",
    "license": "https://creativecommons.org/licenses/by/4.0",
    "openAccess": true
}
```

From PubMed:

```json
{
    "source": "pubmed",
    "doi": "10.1073/pnas.2607793123",
    "pmid": "42900733",
    "title": "Evolution of the arbuscular mycorrhizal regulatory network through differential GRAS gene retention and protein interaction in land plants.",
    "abstract": "Plants rely on an ancient genetic \"toolkit\" to establish arbuscular mycorrhizal symbiosis (AMS) with fungal partners. …",
    "authors": ["Wen-Shen Wu", "Peng Zhao", "Zhen Zeng", "…"],
    "journal": "Proceedings of the National Academy of Sciences of the United States of America",
    "publicationDate": "2026-10-27",
    "type": ["Journal Article"],
    "keywords": ["Mycorrhizae", "Symbiosis", "Phylogeny", "Solanum lycopersicum"],
    "url": "https://pubmed.ncbi.nlm.nih.gov/42900733/",
    "fullTextUrl": "https://doi.org/10.1073/pnas.2607793123"
}
```

From arXiv:

```json
{
    "source": "arxiv",
    "doi": "10.48550/arxiv.1706.03762",
    "arxivId": "1706.03762",
    "version": 7,
    "title": "Attention Is All You Need",
    "abstract": "The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. …",
    "authors": ["Ashish Vaswani", "Noam Shazeer", "Niki Parmar", "…"],
    "publicationDate": "2017-06-12",
    "updated": "2023-08-02",
    "keywords": ["cs.CL", "cs.LG"],
    "primaryCategory": "cs.CL",
    "url": "https://arxiv.org/abs/1706.03762",
    "pdfUrl": "https://arxiv.org/pdf/1706.03762v7",
    "openAccess": true
}
```

A summary per source (results, total matches, duplicates skipped) is saved as `OUTPUT` in the key-value store.

### Pricing

A fixed price per returned paper. In our test 498 papers from all three sources took 17 seconds with the default 256 MB memory.

Paid Apify plans pay less: 10% off on Starter, 20% on Scale and 30% on Business and higher plans.

### FAQ

**Why is arXiv slower?** arXiv asks for at most one request every three seconds. The Actor follows this; each request returns up to 200 papers.

**Why does PubMed have no citation counts?** PubMed does not provide them. Crossref does (`citationCount`, the number of works citing the paper that are registered with Crossref).

**Can I get the full text?** The Actor returns metadata and abstracts plus links: `pdfUrl` (arXiv and many open-access journals) and `fullTextUrl` (PubMed Central or the publisher page). Use and share full texts according to their license.

**Why do I need a contact email?** You don't. NCBI and Crossref ask tools to send one; with it, Crossref serves requests faster. It is sent to these services only.

### More tools from Tidelane Data

- [PDF to Markdown](https://apify.com/tidelane/pdf-to-markdown): PDFs to Markdown and text, with tables and OCR for scans
- [Hacker News Scraper](https://apify.com/tidelane/hacker-news): search, mentions and Who Is Hiring jobs
- [RSS Feed Reader](https://apify.com/tidelane/rss-feed-reader): news, blogs and podcasts to JSON
- [SEC EDGAR](https://apify.com/tidelane/sec-edgar): filings, financial statements and full-text search

All our tools: [apify.com/tidelane](https://apify.com/tidelane)

***

#### Impressum

Levi Griesinger, Tidelane Data\
Besigheimer Straße 18\
74369, Löchgau, Deutschland\
E-Mail: LeviGriesinger@gmail.com

# Actor input Schema

## `mode` (type: `string`):

Search: find papers by keywords. Lookup: get the records of known DOIs, PubMed IDs or arXiv IDs.

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

Keywords, "exact phrases" in quotes. PubMed and arXiv field syntax also works, for example ti:transformer AND cat:cs.LG for arXiv.

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

PubMed: biomedical literature. arXiv: preprints in physics, math, computer science, AI and more. Crossref: metadata of almost all journal articles with a DOI. Empty uses all three.

## `from` (type: `string`):

Year or date, for example 2024 or 2024-05-01.

## `to` (type: `string`):

Year or date, for example 2025 or 2025-12-31.

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

Best match or newest first.

## `maxResultsPerSource` (type: `integer`):

Papers to return from each source. arXiv answers slowly (one request every 3 seconds, 200 papers each).

## `dedupe` (type: `boolean`):

A paper found in several sources (same DOI) is returned once, from the first source in the list.

## `includeAbstract` (type: `boolean`):

Turn off for smaller results.

## `crossrefTypes` (type: `array`):

Only these Crossref work types, for example journal-article, proceedings-article, book-chapter, posted-content.

## `ids` (type: `array`):

Lookup mode: DOIs (10.1038/s41586-020-2649-2), PubMed IDs (42900733) or arXiv IDs (2610.26713).

## `contactEmail` (type: `string`):

NCBI and Crossref ask tools to send a contact email; Crossref then serves requests faster. Sent to these services only.

## Actor input object example

```json
{
  "mode": "search",
  "query": "crispr base editing",
  "sources": [
    "pubmed",
    "arxiv",
    "crossref"
  ],
  "sortBy": "relevance",
  "maxResultsPerSource": 100,
  "dedupe": true,
  "includeAbstract": true
}
```

# Actor output Schema

## `results` (type: `string`):

All results of the run as dataset items.

## `summary` (type: `string`):

Summary per input with status (ok, error and the reason).

# 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": "crispr base editing"
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidelane/research-papers").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": "crispr base editing" }

# Run the Actor and wait for it to finish
run = client.actor("tidelane/research-papers").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": "crispr base editing"
}' |
apify call tidelane/research-papers --silent --output-dataset

```

## MCP server setup

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

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/9aedZ2rJLAm0ixnxg/builds/rCGofnzdvc8rXHvsO/openapi.json
