# Literature Search: Google Scholar Alternative + BibTeX (`pandadad0214/literature-search`) Actor

Search 250M+ scholarly papers by topic or seed papers, filter by year, citations, type and open access, screen every result for retractions, attach legal open-access PDFs, and export a ranked reading list, BibTeX, RIS, CSV and Excel. Built on OpenAlex, Crossref and Unpaywall. No scraping.

- **URL**: https://apify.com/pandadad0214/literature-search.md
- **Developed by:** [Panda Federation](https://apify.com/pandadad0214) (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 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

## Literature Search: Google Scholar Alternative with Retraction Screening, BibTeX, RIS & Excel

**Search 250M+ scholarly papers by topic or from papers you already trust. Get a ranked reading list with every result screened for retractions, legal open-access PDF links, and exports for Zotero, EndNote, LaTeX and Excel.**

Google Scholar has no API, and scraping it breaks Google's terms and fails without warning. **Literature Search** uses the open scholarly infrastructure instead: **OpenAlex** (250M+ works, CC0) for search, **Crossref** for publisher metadata and retraction/correction notices (including the Retraction Watch database), and **Unpaywall** for legal open-access copies. You get structured data you can trust and re-run, with no CAPTCHAs and no blocked IPs.

- 🔎 **Scholar-style search, with real filters:** Boolean queries, title/abstract or full-text search, year range, minimum citations, document type, language, open access only
- 🌱 **Explore from seed papers:** papers that cite your seeds, papers your seeds cite, or related work
- 🚦 **Every paper screened:** **OK**, **CHECK** (preprint, expression of concern, editorial notice) or **FIX** (retracted). You can exclude retracted papers entirely
- 🔓 **Legal open-access PDFs** from Unpaywall, with licence and version (published vs. accepted manuscript)
- 📚 **Ranked reading list** that blends search relevance with field-normalised citation impact, so a strong 2024 paper isn't buried under a 2015 classic
- 🧾 **Ready-to-use exports:** BibTeX, RIS, CSV, a colour-coded Excel workbook, and formatted citations in APA 7, MLA 9, Chicago, Harvard, IEEE or Vancouver (citeproc-js and the official CSL styles)
- 🧪 **Reproducible:** every run saves the exact query, filters, date and match count, ready to paste into a methods section
- 💸 **$0.003 per paper returned.** 100 papers cost $0.30. Searches with no results cost nothing

### Who it's for

- **Researchers, postdocs and R\&D teams:** scope a new topic, track recent work, or build a background reading list in minutes
- **Medical writers, consultants and analysts:** build a verified source list with no retracted papers and links to free full text
- **Librarians and research support staff:** run reproducible searches and hand over RIS files for Zotero, EndNote or Rayyan
- **Developers and AI agents:** a clean JSON literature API with abstracts, for RAG pipelines and research agents, over the Apify API or MCP

> **Not for coursework or ghostwriting.** This is a search and source-checking tool. It doesn't write anything, and it isn't meant for completing assignments or academic work on someone else's behalf. Read what you cite.

### How to use it

1. Click **Try for free** and enter a **search query**. Use quotes for phrases and capitalised AND / OR / NOT, e.g. `"retrieval augmented generation" AND (clinical OR medicine)`.
2. Optional: add **filters** (years, open access, minimum citations, types) or **seed DOIs** to search around papers you trust.
3. Set **Maximum papers**. You pay per returned paper, so this also caps the cost.
4. Click **Start**. 100 papers usually take 15–30 seconds.
5. Open **READING_LIST** for the ranked list, or download **RESULTS_XLSX**, **REFERENCES_RIS** or **REFERENCES_BIBTEX** from the **Storage → Key-value store** tab.

#### Input example

```json
{
  "query": "\"retrieval augmented generation\" AND (clinical OR medicine)",
  "searchIn": "titleAbstract",
  "yearFrom": 2023,
  "yearTo": 2025,
  "minCitations": 0,
  "openAccessOnly": false,
  "types": [],
  "retractedPapers": "flag",
  "sortBy": "relevance",
  "maxResults": 100,
  "citationStyle": "apa"
}
```

Seed-paper example: papers that cite *LeCun, Bengio & Hinton (2015), Deep learning* and mention medical image segmentation, open access only, most cited first:

```json
{
  "query": "medical image segmentation",
  "seedDois": ["10.1038/nature14539"],
  "seedMode": "citing",
  "openAccessOnly": true,
  "sortBy": "citations",
  "citationStyle": "ieee"
}
```

### Output example

Real output from a platform run (query above, 2023–2025):

**Reading list (READING_LIST, Markdown)**

> **1. Benchmarking Retrieval-Augmented Generation for Medicine**
> **OK** · 2024 · Findings of the Association for Computational Linguistics: ACL · 310 citations · score 100 · [PDF](https://aclanthology.org/2024.findings-acl.372.pdf)
>
> Xiong, G., Jin, Q., Lu, Z., & Zhang, A. (2024). Benchmarking retrieval-augmented generation for medicine. *Findings of the Association for Computational Linguistics ACL 2024*, 6233–6251. https://doi.org/10.18653/v1/2024.findings-acl.372

One dataset row (shortened):

```json
{
  "rank": 1,
  "readingRank": 1,
  "readingScore": 100,
  "status": "OK",
  "title": "Benchmarking Retrieval-Augmented Generation for Medicine",
  "authors": "Guangzhi Xiong, Qiao Jin, Zhiyong Lu, Aidong Zhang",
  "year": 2024,
  "venue": "Findings of the Association for Computational Linguistics: ACL (Findings of ACL)",
  "type": "conference-paper",
  "doi": "10.18653/v1/2024.findings-acl.372",
  "citations": 310,
  "citationPercentile": 100.0,
  "isOpenAccess": true,
  "oaStatus": "hybrid",
  "pdfUrl": "https://aclanthology.org/2024.findings-acl.372.pdf",
  "license": "cc-by",
  "retracted": false,
  "notices": [],
  "citation": "Xiong, G., Jin, Q., Lu, Z., & Zhang, A. (2024). Benchmarking retrieval-augmented generation for medicine. ...",
  "bibtex": "@inproceedings{Xiong2024Benchmarking, ...}",
  "ris": "TY  - CONF ...",
  "abstract": "While large language models (LLMs) have achieved state-of-the-art performance on ...",
  "notes": []
}
```

A retracted paper, as the screen reports it:

```json
{
  "status": "FIX",
  "title": "RETRACTED: Hydroxychloroquine or chloroquine with or without a macrolide for treatment of COVID-19: a multinational registry analysis",
  "year": 2020,
  "citations": 1201,
  "retracted": true,
  "notes": ["RETRACTED or withdrawn. Do not cite it as valid evidence. Notice: retraction doi:10.1016/s0140-6736(20)31324-6, ..."]
}
```

#### What OK, CHECK and FIX mean

| Status | Meaning |
|---|---|
| 🟢 **OK** | No retraction, withdrawal or expression of concern on record. Corrections are noted but don't change the status |
| 🟡 **CHECK** | Preprint (not peer-reviewed), expression of concern, or a record that is an editorial notice rather than a paper |
| 🔴 **FIX** | Retracted or withdrawn (Crossref / Retraction Watch notice, or OpenAlex flag). Never ranked in the reading list |

"OK" means no notice was found. It doesn't mean a paper is correct, so read it critically. Before you submit, run the bibliography through our **[Reference Checker](https://apify.com/pandadad0214/reference-checker)**.

### Files you get

| Key-value store key | What it is |
|---|---|
| `READING_LIST` | Ranked Markdown reading list: citation, status, OA link and abstract per paper, plus a "Retracted: do not cite" section. Paste it into an LLM or a doc |
| `CITATIONS` | Bibliography in your chosen style (retracted papers left out) |
| `REFERENCES_BIBTEX` | .bib file for LaTeX / Overleaf |
| `REFERENCES_RIS` | .ris file for Zotero, Mendeley, EndNote, Rayyan, Covidence |
| `RESULTS_XLSX` | Excel workbook: colour-coded status, clickable links, filters, and a Search log sheet |
| `RESULTS_CSV` | Same columns as CSV (UTF-8, opens cleanly in Excel) |
| `SUMMARY` | Search log: exact query, filters, OpenAlex request, match count, date, counts by status |

Need the citations in other styles or more formats? Send the DOIs to our **[Citation Formatter](https://apify.com/pandadad0214/citation-formatter)**.

### How the reading score works

`readingScore` (0–100) = **60% search relevance** (OpenAlex's relevance rank within your results) + **40% citation impact** (OpenAlex's field- and year-normalised citation percentile, or citations per year if that's missing). Without a text query, or when you sort by citations or date, the score uses citation impact only. Retracted papers score 0 and are never ranked. The dataset keeps your chosen sort order in `rank`.

### Pricing

**$0.003 per paper returned** (pay-per-event). The retraction screen, Unpaywall lookup, abstract, citation, BibTeX, RIS and Excel/CSV exports are all included.

| Papers | Cost |
|---|---|
| 25 (a quick scope) | $0.075 |
| 100 (a reading list) | $0.30 |
| 500 (a broad search) | $1.50 |
| 2,000 (the per-run maximum) | $6.00 |

A search with no matches costs nothing. Choose **Exclude** for retracted papers and they are dropped before you're charged. The Actor also respects the maximum charge per run you set in Apify.

### FAQ

**How is this different from scraping Google Scholar?**
Scholar scrapers break when Google changes its pages or blocks the scraper's IPs, and scraping goes against Google's terms. This Actor only uses open APIs built for this purpose. OpenAlex covers more than 250M works (journals, conferences, preprints, books, theses, datasets) with abstracts and citation counts. Coverage differs from Scholar's: OpenAlex is strongest on content with DOIs and weaker on some grey literature.

**Are citation counts the same as Google Scholar's?**
No. They're OpenAlex counts, which are usually lower than Scholar's because Scholar also counts non-scholarly pages. They're consistent and reproducible, which matters if you report them.

**How reliable is the retraction screen?**
Every paper with a DOI is checked against Crossref's update notices. These include the Retraction Watch database, which Crossref has published openly since 2023, and OpenAlex's retraction flag. Papers without a DOI only get the OpenAlex check. A paper retracted yesterday may not be in either source yet.

**Why are some abstracts missing?**
Some publishers don't share abstracts with open indexes. OpenAlex rebuilds abstracts from an index of words, so the odd spacing glitch can appear.

**Can I use my own OpenAlex key?**
Yes, though you don't need one. A free key from openalex.org gives your runs their own daily OpenAlex budget, which is useful for very large or frequent searches. It's stored as a secret input and never logged.

**Can AI agents call it?**
Yes, through the Apify API, the Python or JavaScript clients, or Apify's MCP server. Each run returns clean JSON with abstracts and OA links, which suits RAG and research agents.

### Data sources and credits

- [OpenAlex](https://openalex.org) (CC0) for search, abstracts, topics and citation metrics
- [Crossref](https://www.crossref.org) for publisher metadata and retraction / correction notices, including [Retraction Watch](https://retractionwatch.com) data
- [Unpaywall](https://unpaywall.org) for legal open-access locations
- [citeproc-js](https://github.com/Juris-M/citeproc-js), [citation.js](https://citation.js.org) and the [CSL project](https://citationstyles.org) styles (CC BY-SA 3.0) for citations, BibTeX and RIS

***

#### Built by Panda Federation

**Self-healing, local-first AI systems and data tools that run themselves.**

The Panda Federation research toolkit:

- **[Literature Search](https://apify.com/pandadad0214/literature-search)**: find papers and screen them for retractions
- **[Citation Formatter](https://apify.com/pandadad0214/citation-formatter)**: DOIs, ISBNs and messy references to APA, MLA, Chicago, Harvard, IEEE, Vancouver, BibTeX and RIS
- **[Reference Checker](https://apify.com/pandadad0214/reference-checker)**: fake citations and retracted papers, found

[More from Panda Federation on Apify](https://apify.com/pandadad0214) · [GitHub](https://github.com/pandadad0214)

# Actor input Schema

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

Topic or Boolean query. Use quotes for phrases and AND / OR / NOT in capitals, e.g. "retrieval augmented generation" AND (clinical OR medicine) NOT survey. Leave empty to explore around seed papers only.

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

Title and abstract is the most precise (like a database search). Full text also matches papers that only mention your terms in the body.

## `seedDois` (type: `array`):

Optional. Start from papers you already trust. Combine with a query to search inside that network, or use alone. Up to 50 DOIs.

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

Which papers around the seeds to return.

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

Earliest publication year (inclusive).

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

Latest publication year (inclusive).

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

Only return papers with a free, legal full-text copy.

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

Only return papers cited at least this many times (OpenAlex counts).

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

Leave empty for all paper types (peer reviews, errata, retraction notices and abstracts-only records are always left out unless you pick them here).

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

Optional two-letter language code, e.g. en, de, es.

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

Flag keeps retracted papers in the results, marked FIX, so you know to avoid them (they are charged as returned papers). Exclude drops them before they are returned (not charged).

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

Order of the dataset. The reading list is always ranked by reading score (relevance plus field-normalised citation impact).

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

You pay per returned paper, so this also caps the cost ($0.003 x papers).

## `readingListSize` (type: `integer`):

How many top papers go into the ranked READING_LIST file. All papers are still in the dataset and exports.

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

Style for the citation column and the CITATIONS file. Formatted by citeproc-js with the official CSL style.

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

Add the abstract where OpenAlex has one (some publishers withhold them).

## `checkUnpaywall` (type: `boolean`):

Look up the best legal open-access copy of each paper.

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

Optional. A free key from openalex.org gives you your own daily budget for very large or frequent searches. Stored encrypted; never logged.

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

Sent to Crossref and Unpaywall as the polite-pool contact. Leave empty to use ours.

## Actor input object example

```json
{
  "query": "\"retrieval augmented generation\" AND (clinical OR medicine)",
  "searchIn": "titleAbstract",
  "seedMode": "citing",
  "openAccessOnly": false,
  "minCitations": 0,
  "retractedPapers": "flag",
  "sortBy": "relevance",
  "maxResults": 100,
  "readingListSize": 25,
  "citationStyle": "apa",
  "includeAbstracts": true,
  "checkUnpaywall": true
}
```

# Actor output Schema

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

No description

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

No description

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

No description

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

No description

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

No description

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

No description

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

No description

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

No description

## `summary` (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": "\"retrieval augmented generation\" AND (clinical OR medicine)"
};

// Run the Actor and wait for it to finish
const run = await client.actor("pandadad0214/literature-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": "\"retrieval augmented generation\" AND (clinical OR medicine)" }

# Run the Actor and wait for it to finish
run = client.actor("pandadad0214/literature-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": "\\"retrieval augmented generation\\" AND (clinical OR medicine)"
}' |
apify call pandadad0214/literature-search --silent --output-dataset

```

## MCP server setup

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