# Academic Paper Search: arXiv, PubMed, OpenAlex & Crossref (`pewterdesk/academic-paper-search`) Actor

Search 250M+ scholarly works across arXiv, PubMed, OpenAlex and Crossref in one call. Deduplicated, ranked results with abstracts, citation counts, open-access PDF links and BibTeX. Look up DOIs, arXiv IDs and PMIDs. Clean JSON for AI agents and RAG.

- **URL**: https://apify.com/pewterdesk/academic-paper-search.md
- **Developed by:** [PewterDesk](https://apify.com/pewterdesk) (community)
- **Categories:** AI, Education, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Paper Search: arXiv, PubMed, OpenAlex & Crossref

**Academic paper search** across arXiv, PubMed, OpenAlex and Crossref: one query returns deduplicated research papers with abstracts, citations and open-access PDF links.&#x20;

**One call searches four scholarly indexes and returns a clean, deduplicated, ranked list of papers**, with everything an AI agent, researcher or analyst needs:

- **Title, authors, year, venue and abstract.** The best abstract wins: PubMed for biomedicine, arXiv for preprints, then OpenAlex or Crossref.
- **Citation counts for every result**, including arXiv and PubMed hits, via OpenAlex enrichment.
- **Open-access status and a free PDF or full-text link** when one exists (arXiv, PubMed Central, publisher OA copies).
- **DOI, arXiv ID, PMID, PMCID and OpenAlex ID**, topics/MeSH terms, retraction flags, and optional ORCIDs and affiliations.
- **A ready-to-paste citation and a BibTeX entry** for each paper.
- **Smart deduplication.** A preprint and its published version are merged into one record, with the published DOI preferred.
- **Fused relevance ranking.** Each index's own ranking is combined with cross-source agreement and citation impact. You can also sort by newest or most cited.

All data comes from **official, open scholarly APIs**: OpenAlex (CC0), Crossref, the arXiv API and NCBI E-utilities. No scraping and no Google Scholar.

### Why this one

| | This Actor | Typical paper-search Actors |
|---|---|---|
| Sources per call | 4, merged and deduplicated | 1, or several returned separately |
| Citations on every result | ✅ | Only for the native source |
| Preprint ↔ published merge | ✅ | ❌ |
| BibTeX and formatted citation | ✅ | ❌ |
| DOI / arXiv / PMID lookup | ✅ | Partial |
| Price for a 25-paper search | **$0.03** | $0.05–0.06 per call |

### Use cases

- **AI agents and RAG.** Give your agent a "find papers" tool that returns compact JSON with abstracts and links, then fetch the PDFs it needs. This works from the Apify MCP server, the API, LangChain or n8n.
- **Literature reviews.** Run 50 queries, sort by citations and export to CSV or BibTeX.
- **Biotech and pharma BD.** Track the latest trials and papers on a target, with retraction flags.
- **Competitive and technology intelligence.** Monitor new arXiv and journal output on a topic with a scheduled run.

### Input

```json
{
  "queries": ["retrieval augmented generation hallucination", "\"long covid\" fatigue"],
  "identifiers": ["10.1056/NEJMoa2031054", "arXiv:1706.03762", "PMID: 33283989"],
  "maxResults": 25,
  "sortBy": "relevance",
  "yearFrom": 2020,
  "openAccessOnly": false
}
```

Search tips: quote exact phrases. arXiv field syntax (`ti:`, `au:`, `cat:cs.CL`) is passed through to arXiv.

### Output (one row per paper)

```json
{
  "query": "retrieval augmented generation hallucination",
  "rank": 1,
  "title": "Reducing hallucination in structured outputs via Retrieval-Augmented Generation",
  "authors": ["Orlando Ayala", "Patrice Bechard"],
  "year": 2024,
  "venue": "NAACL-HLT",
  "abstract": "A common and fundamental limitation of Generative AI ...",
  "doi": "10.18653/v1/2024.naacl-industry.19",
  "pdfUrl": "https://arxiv.org/pdf/2404.08189v1",
  "isOpenAccess": true,
  "citationCount": 95,
  "arxivId": "2404.08189",
  "topics": ["hallucination mitigation", "retrieval-augmented generation", "cs.LG"],
  "isRetracted": false,
  "citation": "Ayala & Bechard (2024). Reducing hallucination ... https://doi.org/10.18653/v1/2024.naacl-industry.19",
  "bibtex": "@inproceedings{ayala2024reducing, ...}",
  "sources": ["arxiv", "openalex"]
}
```

Dataset views: **Papers** (table), **Abstracts** and **BibTeX**.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Search completed (a query that returned at least one paper) | $0.005 |
| Paper returned | $0.001 |
| Searches with no results, ID lookups that aren't found, candidates fetched but not returned | free |

For example, a 25-paper search costs $0.03, and 100 DOI lookups cost $0.10. The Actor respects your run's maximum charge and stops cleanly when it's reached.

### Optional API keys

You don't need any keys. For heavy daily use, add your own free **OpenAlex key** (openalex.org/settings/api) for a dedicated budget, and a free **NCBI key** for faster PubMed calls. If OpenAlex is unavailable, the run carries on with the other sources.

### FAQ

**Does it include Google Scholar or Semantic Scholar?** No. Only official, openly licensed APIs are used, which keeps the Actor reliable and ToS-safe.

**Can it download full text?** It returns the open-access PDF or full-text link. To convert PDFs to Markdown for RAG, pair it with our *Documents to AI-Ready Markdown* Actor.

**How fresh is the data?** Every call is live: arXiv and PubMed update daily, and OpenAlex and Crossref within days.

***

Built by **PewterDesk** ([pewterdesk.pages.dev](https://pewterdesk.pages.dev)). More tools: [apify.com/pewterdesk](https://apify.com/pewterdesk).

# Actor input Schema

## `queries` (type: `array`):

One search per line, in natural language or keywords. Quote exact phrases, e.g. "large language model" hallucination.

## `identifiers` (type: `array`):

DOIs, arXiv IDs or URLs, PubMed IDs or URLs. Each one returns a fully merged record with citations and BibTeX.

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

Indexes to search. Results are merged and deduplicated across them.

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

Merged, deduplicated papers returned per query (each is one billable paper).

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

How many top hits to pull from each index before merging. Fetched candidates are free; only returned papers are billed.

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

Relevance blends each source's ranking, cross-source agreement and citation impact.

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

Optional lower bound on publication year.

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

Optional upper bound on publication year.

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

Only papers with a free full-text version.

## `excludeRetracted` (type: `boolean`):

Drops works flagged as retracted by OpenAlex, Crossref or PubMed.

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

Abstracts come from PubMed, arXiv, OpenAlex or Crossref, whichever has the best version.

## `maxAbstractLength` (type: `integer`):

Trim abstracts to save LLM context.

## `includeAuthorDetails` (type: `boolean`):

Adds 'authorsDetailed' with ORCID and institutions.

## `enrichCitations` (type: `boolean`):

Uses OpenAlex to add citation counts and open-access links to papers found only on arXiv, PubMed or Crossref.

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

Optional. A free key from openalex.org/settings/api gives you your own daily budget for heavy use.

## `ncbiApiKey` (type: `string`):

Optional free key from your NCBI account. It makes PubMed calls about 3× faster.

## Actor input object example

```json
{
  "queries": [
    "retrieval augmented generation hallucination"
  ],
  "sources": [
    "openalex",
    "crossref",
    "arxiv",
    "pubmed"
  ],
  "maxResults": 25,
  "maxResultsPerSource": 20,
  "sortBy": "relevance",
  "openAccessOnly": false,
  "excludeRetracted": true,
  "includeAbstracts": true,
  "maxAbstractLength": 0,
  "includeAuthorDetails": false,
  "enrichCitations": true
}
```

# Actor output Schema

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

Deduplicated, enriched scholarly papers with abstracts, citations and BibTeX (default dataset).

## `runSummary` (type: `string`):

Counts for this run (processed, failed, stopped at spending limit) as JSON.

# 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 = {
    "queries": [
        "retrieval augmented generation hallucination"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pewterdesk/academic-paper-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 = { "queries": ["retrieval augmented generation hallucination"] }

# Run the Actor and wait for it to finish
run = client.actor("pewterdesk/academic-paper-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 '{
  "queries": [
    "retrieval augmented generation hallucination"
  ]
}' |
apify call pewterdesk/academic-paper-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pewterdesk/academic-paper-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/qj9qNQiq3Z0uQTv3I/builds/QuDiWsOg9K0Hnppzw/openapi.json
