# Research Paper Search: Google Scholar Alternative (OpenAlex) (`kramer_labs/research-paper-search`) Actor

Search 250M+ scholarly papers by keyword, or look up DOIs: title, authors, year, journal, citations, abstract, open-access PDF link, topic. Filter by year, citations, type, open access; sort by relevance, citations, or newest. Open CC0 data. $2 per 1,000 papers.

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

## Pricing

$2.00 / 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.

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 Paper Search: Google Scholar alternative (OpenAlex)

**Search more than 250 million scholarly papers and export clean rows.** You get title, authors, year, journal, citation count, abstract, DOI, a free PDF link when one exists, and topic. Search by keyword or look up a list of DOIs. Filter by year, citations, type, and open access, and sort by relevance, most cited, or newest.

- **Built on OpenAlex**, the open catalog of the world's research (successor to Microsoft Academic). The data is CC0 public domain, so it's yours to use however you like.
- **Fields Google Scholar exports don't give you:** full abstract, all authors and institutions, field and topic, keywords, retraction flag, open-access PDF link.
- **Exact phrases:** put quotes around a phrase (`"growth mindset"`) to match it exactly in titles and abstracts.
- **Most cited first:** find the landmark papers on a topic in one run.
- **Ready-to-paste citations:** every paper comes with an **APA 7 reference** and a **BibTeX** entry. Journal names are cross-checked against Crossref, the official DOI registry.

### Sample output (real, `"growth mindset"`, most cited, open access, articles since 2015, Oct 2026)

```json
{
  "type": "paper",
  "query": "\"growth mindset\"",
  "rank": 1,
  "title": "A national experiment reveals where a growth mindset improves achievement",
  "year": 2019,
  "publicationDate": "2019-08-07",
  "authors": ["David Scott Yeager", "Paul Hanselman", "Gregory M. Walton", "…", "Angela Lee Duckworth", "Carol Sorich Dweck"],
  "authorCount": 25,
  "institutions": ["The University of Texas at Austin", "Stanford University", "Northwestern University", "…"],
  "venue": "Nature",
  "workType": "article",
  "citedBy": 1511,
  "doi": "10.1038/s41586-019-1466-y",
  "url": "https://doi.org/10.1038/s41586-019-1466-y",
  "isOpenAccess": true,
  "pdfUrl": "https://www.nature.com/articles/s41586-019-1466-y.pdf",
  "abstract": "A global priority for the behavioural sciences is to develop cost-effective, scalable interventions that could improve the academic outcomes of adolescents at a population level, but no such interventions have so far bee…",
  "field": "Psychology",
  "topic": "Education, Achievement, and Giftedness",
  "keywords": ["growth mindset", "academic performance", "adolescents", "online intervention"],
  "language": "en",
  "isRetracted": false,
  "referencesCount": 42,
  "openAlexId": "W2964722401",
  "citationApa": "Yeager, D. S., Hanselman, P., Walton, G. M., … Dweck, C. S. (2019). A national experiment reveals where a growth mindset improves achievement. Nature, 573(7774), 364–369. https://doi.org/10.1038/s41586-019-1466-y [shortened: the real field lists the first 19 authors, as APA 7 requires]",
  "bibtex": "@article{yeager2019national,\n  title = {A national experiment reveals where a growth mindset improves achievement},\n  author = {Yeager, David Scott and … and Dweck, Carol Sorich},\n  journal = {Nature},\n  year = {2019},\n  volume = {573},\n  number = {7774},\n  pages = {364--369},\n  doi = {10.1038/s41586-019-1466-y}\n} [authors shortened]"
}
```

OpenAlex had 4,019 works matching that phrase. Rank 2 was "Motivation to learn: an overview of contemporary theories" (1,054 citations).

### How to use

1. Add **search queries** (one per line) and/or **DOIs**.
2. Optional: **sort by** relevance / most cited / newest; **from / to year**; **minimum citations**; **open access only**; **type** (article, review, preprint, book, dissertation…); **max papers per query**.
3. Run, then export from the Dataset tab (JSON, CSV, Excel, BibTeX-ready fields, or API).

#### Sample inputs

```json
{ "queries": ["\"growth mindset\""], "sortBy": "citations", "fromYear": 2015, "openAccessOnly": true, "type": "article" }
```

```json
{ "dois": ["10.1177/1529100612453266", "https://doi.org/10.1038/s41586-019-1466-y"] }
```

### Pricing

- **$0.002 per paper** ($2 per 1,000). No start fee.
- Queries with no matches, and DOIs that aren't found, cost nothing.

### Who it's for

- **Students and researchers:** literature reviews, a reading list of the most-cited papers, free PDFs first, and APA/BibTeX citations ready to paste
- **AI and RAG builders:** abstracts and metadata to feed a model or a research agent
- **Analysts, journalists, and R\&D teams:** what the research says on a topic, who publishes it, and how it's trending
- **Librarians and bibliometrics:** citation counts and open-access status for a list of DOIs

### FAQ

**Is this Google Scholar data?** No. Google doesn't allow Scholar to be scraped. OpenAlex indexes a similar universe of papers (journals, preprints, books, theses) from Crossref, PubMed, arXiv, institutional repositories, and more, and its data is open.
**Are the citations exactly right?** They're built from the paper's metadata to APA 7 and BibTeX rules, with journal names checked against Crossref. Titles are kept as published (APA wants sentence case for article titles), and source metadata occasionally has errors, so check a reference before you submit it.
**Full text?** No. You get the abstract, plus `pdfUrl` when a legal open-access copy exists.
**How many results can one query return?** Up to 10,000 (set "max papers per query"). Narrow with quotes and filters for better results.
**"Daily budget used up"?** OpenAlex gives this Actor a free daily allowance that resets at midnight UTC. If it ever runs out, add your own free OpenAlex key in the input and the run continues.

**Students:** want this in a simple app? [PsychLab Assistant](https://bruinpsych.netlify.app/) is our free front end for the same paper search, with one-click APA citations. More tools at [Kramer Labs](https://kramer-labs.netlify.app/).

### Data source and responsible use

Data comes from the OpenAlex API. OpenAlex data is CC0 public domain, so you can reuse it freely, including commercially. Rows are bibliographic metadata (titles, authors, abstracts as published). Full texts stay with their publishers; `pdfUrl` points only to legal open-access copies.

# Actor input Schema

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

Searched in titles and abstracts. Put a phrase in quotes for an exact match, e.g. "spaced repetition". One search per line.

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

Get full records for known papers: 10.1177/1529100612453266 or https://doi.org/… links.

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

Relevance to your query, most cited first, or newest first.

## `maxPapersPerQuery` (type: `integer`):

Caps cost. Up to 10,000.

## `fromYear` (type: `integer`):

e.g. 2015. Empty = any.

## `toYear` (type: `integer`):

e.g. 2024. Empty = any.

## `minCitations` (type: `integer`):

Only papers cited at least this many times. 0 = any.

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

Only papers with a free, legal full-text copy (pdfUrl).

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

Kind of work. Any = all types.

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

Turn off for smaller exports.

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

Not needed normally. Only if the Actor's shared free daily OpenAlex budget runs out: get a free key at openalex.org/settings/api.

## Actor input object example

```json
{
  "queries": [
    "\"spaced repetition\""
  ],
  "sortBy": "relevance",
  "maxPapersPerQuery": 100,
  "minCitations": 0,
  "openAccessOnly": false,
  "type": "",
  "includeAbstract": true
}
```

# Actor output Schema

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

No description

## `allResults` (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 = {
    "queries": [
        "\"spaced repetition\""
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kramer_labs/research-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": ["\"spaced repetition\""] }

# Run the Actor and wait for it to finish
run = client.actor("kramer_labs/research-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": [
    "\\"spaced repetition\\""
  ]
}' |
apify call kramer_labs/research-paper-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kramer_labs/research-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/BHCLQ6Da5Y3S1cb2v/builds/B8db9F8fNaKfGVgKW/openapi.json
