Unpaywall API: Get free version of a paper
Finds 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, the copy links are null.
Unofficial. Not affiliated with or endorsed by Unpaywall.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Paper, required
paper Paper title or DOI, for example The Moral Machine experiment or 10.1038/s41586-018-0637-6.
10.1038/35057062
- Author optional
author Optional author name to distinguish papers with similar titles, for example Edmond Awad.
(default)
Input as JSON
{ "paper": "10.1038/35057062" }Output
{ "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" } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"unpaywall.org/get_free_version","input":{"paper":"10.1038/35057062"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "unpaywall.org/get_free_version" , "input": { "paper": "10.1038/35057062" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "unpaywall.org/get_free_version" , "input": { "paper": "10.1038/35057062" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run unpaywall.org/get_free_version# with {"paper":"10.1038/35057062"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "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." }, "author": { "type": "string", "default": "", "description": "Optional author name to distinguish papers with similar titles, for example Edmond Awad." } }}Output schema
{ "type": "object", "required": [ "title", "journal", "year", "doi", "free_to_read", "best_free_link", "landing_page", "host", "licence", "version", "other_free_copies" ], "properties": { "doi": { "type": "string" }, "host": { "type": [ "string", "null" ] }, "year": { "type": [ "integer", "null" ] }, "title": { "type": "string" }, "journal": { "type": [ "string", "null" ] }, "licence": { "type": [ "string", "null" ] }, "version": { "type": [ "string", "null" ] }, "free_to_read": { "enum": [ "yes", "no" ], "type": "string" }, "landing_page": { "type": [ "string", "null" ] }, "best_free_link": { "type": [ "string", "null" ] }, "other_free_copies": { "type": "array", "items": { "type": "object", "required": [ "link", "host", "landing_page" ], "properties": { "host": { "type": "string" }, "link": { "type": "string" }, "landing_page": { "type": [ "string", "null" ] } }, "additionalProperties": false } } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
unpaywall.org/get_free_version- Returns
- title, journal, year, DOI, best free link, landing page, host, licence, version, other free copies
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method unpaywall.org/get_free_version with the inputs above.
Ask your agent
- Find a free legal copy of the paper The Moral Machine experiment
- Is there an open access version of DOI 10.1038/s41586-018-0637-6?
- Get the free full text for the 2019 paper on transformer attention by Vaswani
- Where can I read the paper Deep residual learning for image recognition for free?
- On unpaywall.org, look up a legal free copy of the article titled Attention Is All You Need
See more
Finds a paper on Semantic Scholar by title, DOI or Semantic Scholar link and returns its abstract, one-sentence summary, authors, publication details, citation counts and a free PDF link when there is one.
semanticscholar.org/get_paperGets an arXiv paper's title, authors, abstract, subjects, submission dates and publication details from its exact title, arXiv link or number.
arxiv.org/get_paperSearches OpenAlex scholarly works by topic, with optional institution, publication-year and open-access filters, ranked by relevance, citations or newest date.
openalex.org/search_papersSearches Semantic Scholar for research papers in relevance order, with field of study, year range and open-access filters, returning AI one-sentence summaries, citations and free PDF links when available.
semanticscholar.org/search_papersGets the full PubMed abstract and publication details for one article by title, PubMed link, or PubMed number (PMID). A title is searched in PubMed titles first and must closely match a found article. Some articles have no abstract or free full text.
pubmed.ncbi.nlm.nih.gov/get_articleFinds arXiv preprints by topic or title words, with optional author, subject, submission date range and sorting. Returns up to 100 papers with abstracts, subjects, dates and links.
arxiv.org/search_papersGets a formatted citation and publication details for the best-matching Crossref work by title or DOI. Optional author and year help choose among similar works; citations reflect the metadata deposited with Crossref.
crossref.org/get_citationFinds ebook and audiobook editions a public library owns on OverDrive, with copies, holds and estimated wait when unavailable.
overdrive.com/check_library_availability