# Unpaywall Open Access Scraper (`ninhothedev/unpaywall-scraper`) Actor

$0.5/1K 🔥 Fast Unpaywall scraper! Find free legal open-access PDFs & OA status for any DOI. No key. JSON, CSV, Excel or API in seconds. Drop DOIs & pull thousands for research, libraries & literature reviews ⚡

- **URL**: https://apify.com/ninhothedev/unpaywall-scraper.md
- **Developed by:** [ninhothedev](https://apify.com/ninhothedev) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Unpaywall Open Access Scraper

**Find free, legal, full-text PDFs for any research paper.** This actor queries the
[Unpaywall](https://unpaywall.org) database of 30M+ open-access articles and returns
the best free PDF / landing-page URL, the open-access status, license, journal,
publisher and authors for any DOI — or for works matched by a title/keyword search.

No API key. No login. Datacenter-proxy friendly (clean public JSON API). You only
provide a contact email, which Unpaywall requires for attribution.

***

### What it does

- 🔓 **Resolve DOIs → free full text.** Give it a list of DOIs, get back the best
  open-access PDF URL for each.
- 🔎 **Search by title / keyword.** Don't have the DOI? Search and resolve in one pass.
- 🧾 **Rich metadata.** Title, year, journal, publisher, genre, OA status, license,
  version, host type, number of OA locations, and authors.
- ⚡ **Fast & cheap.** Lightweight HTTP, 512 MB, no browser, no residential proxy.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `mode` | select | `dois` (resolve a DOI list) or `search` (title/keyword). Default `dois`. |
| `dois` | array | DOIs to resolve, e.g. `["10.1038/nature12373"]`. |
| `queries` | array | Title/keyword queries to search, e.g. `["crispr gene editing"]`. |
| `email` | string | Contact email required by Unpaywall (placeholder domains like example.com are rejected). |
| `maxItems` | integer | Max records to return (default 100, max 1000). |

#### Example input

```json
{
  "mode": "dois",
  "dois": ["10.1038/nature12373", "10.1126/science.1259855"],
  "email": "you@your-org.edu",
  "maxItems": 100
}
```

### Output

Each item:

```json
{
  "doi": "10.1038/nature12373",
  "title": "Nanometre-scale thermometry in a living cell",
  "genre": "journal-article",
  "journal": "Nature",
  "publisher": "Springer Science and Business Media LLC",
  "year": 2013,
  "published_date": "2013-07-30",
  "is_oa": true,
  "oa_status": "green",
  "has_repository_copy": true,
  "best_oa_url": "https://arxiv.org/pdf/1304.1068",
  "best_oa_pdf": "https://arxiv.org/pdf/1304.1068",
  "best_oa_host_type": "repository",
  "best_oa_license": "cc-by",
  "best_oa_version": "submittedVersion",
  "oa_locations_count": 3,
  "authors": ["G. Kucsko", "P. C. Maurer", "N. Y. Yao"],
  "source": "unpaywall",
  "scraped_at": "2026-07-20T06:00:00Z"
}
```

`oa_status` is one of `gold`, `green`, `bronze`, `hybrid` or `closed`. DOIs unknown
to Unpaywall (HTTP 404) are silently skipped.

### Pricing

Runs on the low-compute model — roughly **$0.5 per 1,000 records** depending on your
plan. A DOI lookup is a single lightweight API call, so large batches stay cheap and
fast.

### Use cases

- **Open-access discovery** — bulk-check which papers in a reference list are free to read.
- **Research** — resolve hundreds of DOIs to OA status and links in one run.
- **Legal PDF finding** — surface author-deposited and repository copies, never pirated ones.
- **Library tools** — enrich catalogs with OA links, licenses and versions.

### Comparison

| | This actor | Manual Unpaywall lookups | Browser scrapers |
|---|---|---|---|
| API key needed | No (email only) | No | Often |
| Bulk DOIs | ✅ | ❌ one at a time | ⚠️ slow |
| Structured JSON | ✅ | ⚠️ | ⚠️ |
| License + OA status | ✅ | ✅ | ❌ |
| Proxy cost | Datacenter (cheap) | — | Residential (pricey) |

### Related actors

- [Crossref Scraper](https://apify.com/ninhothedev/crossref-scraper)
- [OpenAlex Scraper](https://apify.com/ninhothedev/openalex-scraper)
- [ORCID Scraper](https://apify.com/ninhothedev/orcid-scraper)
- [arXiv Scraper](https://apify.com/ninhothedev/arxiv-scraper)

### Keywords

unpaywall, open access, DOI, free PDF, full text, scholarly, academic papers,
research, OA status, license, literature review, crossref, openalex, orcid, arxiv,
open science, green OA, gold OA, legal PDF finder

### Notes

Data is provided by the Unpaywall / OpenAlex project. Please respect their
[terms](https://unpaywall.org/products/api) and use a real contact email.

# Actor input Schema

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

How to look up works. 'dois' resolves a list of DOIs to their best free full-text location. 'search' finds works by one or more title/keyword queries and resolves each result.

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

List of DOIs to resolve (used when mode = 'dois'). Example: 10.1038/nature12373. DOIs that are unknown to Unpaywall (404) are skipped.

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

Title or keyword queries to search for (used when mode = 'search'). Each query returns its best-matching works. Example: crispr gene editing.

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

Unpaywall requires a contact email for attribution/rate-limiting. Any valid address works; placeholder domains like example.com are rejected by the API, so a real default is provided.

## `maxItems` (type: `integer`):

Maximum number of Open Access records to return across all inputs.

## Actor input object example

```json
{
  "mode": "dois",
  "dois": [
    "10.1038/nature12373",
    "10.1126/science.1259855"
  ],
  "queries": [
    "crispr gene editing"
  ],
  "email": "daniello@biwo-bauwelt.com",
  "maxItems": 100
}
```

# 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 = {
    "dois": [
        "10.1038/nature12373",
        "10.1126/science.1259855"
    ],
    "queries": [
        "crispr gene editing"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ninhothedev/unpaywall-scraper").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 = {
    "dois": [
        "10.1038/nature12373",
        "10.1126/science.1259855",
    ],
    "queries": ["crispr gene editing"],
}

# Run the Actor and wait for it to finish
run = client.actor("ninhothedev/unpaywall-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "dois": [
    "10.1038/nature12373",
    "10.1126/science.1259855"
  ],
  "queries": [
    "crispr gene editing"
  ]
}' |
apify call ninhothedev/unpaywall-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ninhothedev/unpaywall-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/WfZYJJjcwiX3SgOvC/builds/6rwwTFQrej4re7x88/openapi.json
