# Unpaywall API

> Unpaywall returns open-access paper links and copy details as a workflow and API.

Unpaywall finds a legal free copy of a paper using its title or DOI, with an optional author name to distinguish similar titles. Get free version returns the best available link and other copies; if no free copy is indexed, copy links are null.

- Page: https://fous.com/tools/unpaywall
- Handle: `@unpaywall`
- Category: [Science](https://fous.com/tools/category/science)
- Source website: https://unpaywall.org
- Last verified: Sep 29, 2026

## Methods

### Get free version

Operation `get_free_version`, version 1. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.

Find a legal free copy of a paper by title or DOI, with its best available link and other copies. If no free copy is indexed, copy links are null.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `paper` | string | yes | `"10.1038/35057062"` | Paper title or DOI, for example The Moral Machine experiment or 10.1038/s41586-018-0637-6. |
| `author` | string | no | `"Edmond Awad"` | Optional author name to distinguish papers with similar titles, for example Edmond Awad. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "paper"
  ],
  "properties": {
    "paper": {
      "type": "string",
      "description": "Paper title or DOI, for example The Moral Machine experiment or 10.1038/s41586-018-0637-6.",
      "examples": [
        "10.1038/35057062",
        "The Moral Machine experiment",
        "10.1038/nature01092"
      ]
    },
    "author": {
      "type": "string",
      "default": "",
      "description": "Optional author name to distinguish papers with similar titles, for example Edmond Awad.",
      "examples": [
        "Edmond Awad"
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "paper": "10.1038/35057062"
    },
    {
      "paper": "The Moral Machine experiment",
      "author": "Edmond Awad"
    },
    {
      "paper": "10.1038/nature01092"
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `doi` | string | `"10.1038/35057062"` |  |
| `host` | string or null | `"Springer Science and Business Media LLC"` |  |
| `year` | integer or null | `2001` |  |
| `title` | string | `"Initial sequencing and analysis of the human genome"` |  |
| `journal` | string or null | `"Nature"` |  |
| `licence` | string or null | `"Public domain"` |  |
| `version` | string or null | `"published"` |  |
| `free_to_read` | string | `"yes"` |  |
| `landing_page` | string or null | `"https://doi.org/10.1038/35057062"` |  |
| `best_free_link` | string or null | `"https://www.nature.com/articles/35057062.pdf"` |  |
| `other_free_copies` | array |  |  |
| `other_free_copies[].host` | string | `"University of Michigan"` |  |
| `other_free_copies[].link` | string | `"https://hdl.handle.net/2027.42/62798"` |  |
| `other_free_copies[].landing_page` | string or null | `"https://hdl.handle.net/2027.42/62798"` |  |

**Example input**

```json
{
  "paper": "10.1038/35057062"
}
```

**Example output**

```json
{
  "doi": "10.1038/35057062",
  "host": "Springer Science and Business Media LLC",
  "year": 2001,
  "title": "Initial sequencing and analysis of the human genome",
  "journal": "Nature",
  "licence": "Public domain",
  "version": "published",
  "free_to_read": "yes",
  "landing_page": "https://doi.org/10.1038/35057062",
  "best_free_link": "https://www.nature.com/articles/35057062.pdf",
  "other_free_copies": [
    {
      "host": "University of Michigan",
      "link": "https://hdl.handle.net/2027.42/62798",
      "landing_page": "https://hdl.handle.net/2027.42/62798"
    }
  ]
}
```

## Quick start

Replace `YOUR_API_KEY` with a Fous API key. To create one, open Developers at the bottom of Fous Studio, turn on Developer mode, then go to API keys (https://app.fous.com/keys). Change the values in `input` to run the same tool on new data.

```bash
curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 180 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "api": "@unpaywall",
  "visibility": "public",
  "operation": "get_free_version",
  "version": 1,
  "input": {
    "paper": "10.1038/35057062"
  },
  "response": {
    "format": "json"
  }
}'
```

```python
# Save as fous.py and run with python3 fous.py. No packages needed.
import json
import urllib.error
import urllib.request

api_key = "YOUR_API_KEY"

body = json.loads("{\n  \"api\": \"@unpaywall\",\n  \"visibility\": \"public\",\n  \"operation\": \"get_free_version\",\n  \"version\": 1,\n  \"input\": {\n    \"paper\": \"10.1038/35057062\"\n  },\n  \"response\": {\n    \"format\": \"json\"\n  }\n}")
request = urllib.request.Request(
    "https://api.fous.com/v1/query",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=180) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8', errors='replace')}") from error
if result.get("success") is False:
    raise RuntimeError(result.get("error", {}).get("message", "Request failed"))
print(json.dumps(result["data"]["output"], indent=2))
```

```typescript
// Save as fous.mts and run with npx tsx fous.mts.
const apiKey = "YOUR_API_KEY";

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(180_000),
  body: JSON.stringify({
  "api": "@unpaywall",
  "visibility": "public",
  "operation": "get_free_version",
  "version": 1,
  "input": {
    "paper": "10.1038/35057062"
  },
  "response": {
    "format": "json"
  }
}),
});
type ApiResult = { success: boolean; data?: { output: unknown }; error?: { message: string } };
const result: ApiResult = await response.json();
if (!response.ok || result.success === false) {
  throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
if (!result.data) throw new Error("Missing API response data");
console.log(result.data.output);
```

## Use from an AI assistant

Connect this tool to Claude Code, Claude Desktop, Cursor, VS Code, Codex and any MCP client as its own MCP server. Each method is a typed tool whose arguments are the method’s input.

- Server URL: `https://api.fous.com/mcp/tools/unpaywall`
- Authorization: `Authorization: Bearer <Fous API key>`

**Tools**

- `get_free_version`: Get free version. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.
- `fous_get_run`: the result of a run that was still going, by its `request_id`. Free.

Claude Code:

```bash
claude mcp add --scope user --transport http fous-unpaywall https://api.fous.com/mcp/tools/unpaywall --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"
```

To give the assistant every tool, connect `https://api.fous.com/mcp`: it finds one with `fous_search_tools` and runs it with `fous_run_tool`. Setup for other clients: https://fous.com/llms-full.txt.

## Use cases

- Find free versions of papers by title or DOI
- Distinguish papers with similar titles using an author name
- Compare available copies by host and landing page
- Check a paper’s journal, year, licence, and version

## FAQ

### Can I run it with my own inputs?

Yes. Change the inputs in Studio and press Run, or send new inputs from your code, or ask a connected AI assistant.

### Can I call this Unpaywall tool as an API?

Yes. Send a POST request to /v1/query with your Fous API key and the inputs, and get JSON back.

### How much does it cost?

Each completed run costs 1 credit. Failed runs without a completed receipt are free; completed work can remain charged if delivery is interrupted. With pay as you go, a credit costs 1¢. Monthly plans cost less per credit.

### Do I need a Unpaywall account?

No. You only need a Fous account.

### How current is the data?

Fous gets the data from unpaywall.org when you run it. Some results are reused for up to 24 hours, and results that use your account or key are never reused. It was last verified on Sep 29, 2026.

### Can I find a free copy by paper title?

Yes. Get free version accepts a paper title or DOI and returns the best available link when a free copy is indexed.

### Can I find other copies of a paper?

Get free version returns other available copies, including their host, link, and landing page.

### What if no free copy is indexed?

Get free version returns null copy links when no free copy is indexed.

## Related

- [Semantic Scholar API](https://fous.com/tools/semantic-scholar.md): Semantic Scholar returns paper and citation search, paper abstracts, summaries, authors and influence, plus author metrics and up to 10 top-cited papers; dates, summaries, PDFs and affiliation matches may be unavailable.
- [OpenAlex API](https://fous.com/tools/openalex.md): OpenAlex is an open catalog of scholarly research and connections, offering ranked papers and institution research summaries with annual output, leading topics, and coauthors.
- [arXiv API](https://fous.com/tools/arxiv.md): arXiv returns up to 100 matching research preprints or individual paper details, and newly announced subject papers in announcement order; announcement dates may differ from today, and replacements are excluded.
- [Crossref API](https://fous.com/tools/crossref.md): Find scholarly works and format citations from their registered metadata.
- [Google Scholar API](https://fous.com/tools/google-scholar.md): Google Scholar provides papers, citing papers, ready-made citations and researcher profiles with metrics and up to 20 top-cited papers; public access may be temporarily limited.
- [PubMed API](https://fous.com/tools/pubmed.md): PubMed searches medical and life-science articles by topic and retrieves one article’s abstract and publication details; abstracts and free full-text links may be unavailable.
- [AP News API](https://fous.com/tools/ap-news.md): AP News provides reporting, up to 50 public-page headlines, searchable articles visible in its search, and full text when accessible.
- [OverDrive API](https://fous.com/tools/overdrive.md): Find ebooks and audiobooks at public libraries.
- [All Science tools](https://fous.com/tools/category/science)
