# Scholars Reading List search API
> Search ~200 million scholarly papers (OpenAlex titles and abstracts) by meaning or by exact words, find
> papers similar to a given one, look a paper up by DOI / OpenAlex id / PMCID, and walk its citations.
> Read-only JSON over HTTPS, no key. Built for ScienceMadeReadable; open to anyone's programs and agents.
Base URL: https://api.sciencemadereadable.com/api/data
(On Maxime's machines: http://127.0.0.1:8810 on lambda itself, https://lambda.tail69222b.ts.net:18810 on
the tailnet. Same API and the same data, without the public rate limit.)
Interactive reference (every parameter, try it in the browser): /docs · machine-readable: /openapi.json
This guide: /llms.txt
Only able to open a web address (no code, no headers)? Put the question in the address and get the answer as
plain text: https://ask.sciencemadereadable.com/why do cats purr, or /search/why do cats purr (spaces as %20
or +; options after ?, e.g. ?k=30&year_from=2020).
Using an AI app that speaks MCP (Claude, ChatGPT, Cursor, VS Code, Codex...)? Add the MCP server
https://api.sciencemadereadable.com/mcp instead: the same search as tools, no key (see "MCP server" below).
## What is covered right now
- Search by meaning, every paper: 125,130,657 papers published from 1007-04-01.
- Search by meaning, papers ScienceMadeReadable can open (collection=smr): 3,902,393 papers published from 1939-10-30.
- Search by exact words and paper lookup (/works): 203,725,202 papers, all years.
- Data release 20261012T073823Z, published 2026-10-12T09:49:25Z.
- OpenAlex snapshot of 2026-10-05 (titles, abstracts, citations, labels).
- Plus 239,167 papers OpenAlex added since, fetched daily (last fetch 2026-10-12). Their citation counts and labels are as of that fetch; the citation walk does not include them yet.
## Quick start
```sh
B=https://api.sciencemadereadable.com/api/data
curl -G "$B/search" --data-urlencode "q=does intermittent fasting help weight loss" -d k=5 -d abstracts=false
curl -G "$B/search" --data-urlencode 'q="gut microbiome" AND (autism OR ASD) NOT mice' -d k=5
curl "$B/works/10.1126/science.aan8048" # by DOI (also W123..., PMC123..., https://doi.org/...)
curl "$B/similar/W2782456798?k=5&abstracts=false"
curl "$B/walk?id=10.1126/science.aan8048&k=30" # what papers like this one cite that it does not
```
```python
import requests
B = "https://api.sciencemadereadable.com/api/data"
r = requests.get(f"{B}/search", params={"q": "microplastics in human placenta", "k": 20,
"year_from": 2020, "abstracts": "false"}, timeout=30)
r.raise_for_status()
for p in r.json()["results"]:
print(p["year"], p["citations"], p["title"], p["doi"] or p["openalex"])
```
## Endpoints
### GET /search/{question}
The same search for tools that can only open an address: the question is the rest of the path, the answer is
plain text (Markdown): each result's title, year, venue, authors, citations, link and abstract. Spaces as
`%20` or `+` (a `+` counts as a space only when the address has no `%20`). Takes the options of /search after
`?` (k, mode, year_from, year_to, type, open_access, license, pmc_open_access, collection, abstracts).
`https://api.sciencemadereadable.com/api/data/search/does%20intermittent%20fasting%20help%20weight%20loss?k=5`
### GET /search?q=...
The main entry. Returns `{"mode", "results": [...], "filters", "timing", ...}`.
- `q` (2–2000 characters). Plain language works: "why do cats purr", or a paragraph.
- `mode` = `auto` (default) | `semantic` | `keyword`.
- **semantic** (by meaning): finds papers about the idea even without the same words. Best for questions
and descriptions. Answers carry `ranking` (how they were ordered).
- **keyword** (exact words, English stemming): plain words are ANDed; `"exact phrase"`, `OR`, `NOT` or
`-word`, brackets, `word*`, `"a b"~5` (within 5 words), `title:`, `abstract:`, `keywords:`. Answers carry
`matches` (exact count of matching papers) and `query` (how it was understood).
- **auto** picks keyword when `q` contains search syntax (quotes, AND/OR/NOT in capitals, brackets, `*`,
`-word`, `field:`), else semantic. If an auto keyword search matches nothing it searches by meaning and
says so in `fallback`.
- `k` results, 1–100 (default 10). There is no paging: ask for up to 100 at once.
- Filters: `year_from`, `year_to`, `type` (article, review, preprint, book, book-chapter, conference-paper,
dissertation, report, letter, editorial, ...), `open_access=true`, `license` (e.g. `cc-by`),
`pmc_open_access=true` (full text in PubMed Central's open-access set).
- `collection` = `all` (default) | `smr`: only papers ScienceMadeReadable can open and rewrite (PubMed
Central, CC BY, research articles).
- `abstracts=false` drops abstracts from the answer (about 10x smaller). Use it unless you need them.
- `junk_penalty` (semantic only): ranking is similarity − junk_penalty × `junk`; default 0.3 for `all`,
0 for `smr`. 0 = pure similarity.
- `map=true` adds each result's position on the map of science (`x`, `y`, both 0–1) and where the
question lands (`map`).
Identical records appear once; a preprint and its published version are different records and can both
appear (merge by `doi` or title if that matters). Left out unless you ask with `type=`: datasets, figures, covers and other non-publications. Always left out:
retracted papers (OpenAlex flag, or titles starting "[RETRACTED]" / "Retraction Note:").
### GET /similar/{ref}
Papers closest in meaning to one paper. `ref` = W-number, DOI or PMCID. Same `k`, filters, `abstracts`,
`collection` and `junk_penalty` as /search. 404 if the paper is not in the semantic index (see coverage).
### GET /works/{ref}
One paper's full record (fields below). `ref` = `W2782456798`, `https://openalex.org/W...`, a DOI
(`10.1126/science.aan8048`, `https://doi.org/...`, `doi:...`) or a PMCID (`PMC1234567`). 404 if unknown.
### GET /walk?id=...
A citation walk from one paper (W-number or DOI): the papers that cite most of the same references (`k`
of them, default 30) and, among what *they* cite, what the starting paper does not: `answers` (W-numbers)
are the strongest candidates for "what this paper should also have cited / what to read next". Also
returns `nodes` (title, year, citations, topic per paper), `columns`, `links` (citation edges), `stats`.
Papers listing more than `max_refs` (300) references or with more than `max_cites` (500) citations count
as outliers. Slow: 0.5–5 s. Fails with an `error` when the paper has no references in the snapshot.
### GET /map/place?ids=W1,W2&q=... · GET /map/regions · GET /map/counts
Positions on the map of science for up to 200 papers and/or a question; field names, colours and label
positions; exact publication counts per year and subfield. Mostly for drawing maps.
## MCP server
`https://api.sciencemadereadable.com/mcp`: Streamable HTTP, stateless, no authentication; every MCP protocol
revision from 2024-11-05 to 2026-07-28. Answers are Markdown written for a model to read and cite (DOI links,
W-numbers). Tool calls count against the same 30 a minute; over that, the call returns a tool error saying
how long to wait. Opening the address in a browser shows how to add it.
```sh
claude mcp add --transport http --scope user science https://api.sciencemadereadable.com/mcp # Claude Code
codex mcp add science --url https://api.sciencemadereadable.com/mcp # Codex
```
Other apps: add a remote MCP server with that address (setup for each: https://sciencemadereadable.com/?api).
| tool | does |
|---|---|
| `search_papers` | /search: `query`, `limit` (1-100), `mode`, `year_from`, `year_to`, `publication_type`, `open_access_only`, `readable_only`, `abstracts` = short (default) / full / none |
| `get_papers` | /works for up to 20 `ids` at once (DOI, W-number, PMCID, URLs): full records |
| `find_similar_papers` | /similar: `paper`, `limit`, the same filters |
| `citation_walk` | /walk: `paper`, `breadth` (neighbours to learn from, default 30), `limit` per section |
Also two prompts, `literature_review(question)` and `check_claim(claim)`, and this guide as a resource.
## Result fields
| field | meaning |
|---|---|
| `id` | OpenAlex W-number, e.g. `W2782456798`; `openalex` is its URL. Use it to cite and to call /works, /similar, /walk |
| `doi`, `pmcid` | identifiers when known (DOI without `https://doi.org/`) |
| `title`, `abstract` | as OpenAlex has them; abstracts can contain HTML/JATS tags |
| `date`, `year` | publication date |
| `type` | article, review, preprint, book-chapter, ... |
| `authors`, `authors_count` | first 12 names joined with `" | "`, and the full count |
| `venue`, `publisher` | journal / repository / book and its publisher |
| `citations` | times cited (OpenAlex, at the snapshot date) |
| `is_oa`, `oa_status`, `license`, `url`, `pdf_url` | open access; links to the landing page and PDF when known |
| `topic`, `field`, `keywords`, `mesh` | OpenAlex's subject labels and MeSH terms (see limits) |
| `pmc_oa`, `pmc_license`, `pmc_type` | PubMed Central open-access copy: present, its licence, article type |
| `smr` | 1 if ScienceMadeReadable can open it: https://sciencemadereadable.com |
| `score` | semantic: cosine similarity (≈0.3–0.7; compare within one search only). keyword: BM25 |
| `junk` | 0–1, how likely the record is spam, an advert or not scholarship (semantic results only) |
| `is_retracted` | always 0 in search results (retracted papers are left out); can be 1 in /works |
## Using it well (for agents)
- **Plain questions go to semantic, precise needs to keyword.** "effects of screen time on toddlers' sleep"
→ semantic. A named gene, drug, acronym, author's exact phrase, or "everything that mentions X" →
keyword with quotes. For a literature review, run both and merge by `id`.
- **Phrase like a paper, not like a search box.** Semantic search matches writing style too. "how to loose
weight" pulls in blog-like records; "effectiveness of dietary and exercise interventions for weight loss
in adults" pulls in trials and reviews. Rewriting a casual question into research language before
searching is the single biggest quality gain; the junk penalty handles most of the rest.
- **Snowball**: take the best 2–3 results → `/similar/{id}` for more of the same, `/walk?id=` for the
literature around them. Deduplicate by `id`.
- **Judge papers from the record**: `type` (review vs article), `citations` relative to `year`, `venue`,
`junk`. Citation counts favour older papers and big fields; do not treat them as quality alone.
- **Save tokens**: `abstracts=false` for screening, then `/works/{id}` only for the papers you keep.
- **Cite** with DOI when present, else the `openalex` URL. Do not invent details the record lacks.
- **Be gentle**: the public door allows 30 requests per minute per address (reading this guide, /docs and
/openapi.json does not count). Beyond that: HTTP 429 with a `Retry-After` header (seconds; also
`retry_after` in the body): wait that long, then retry. Spend calls well: one search with `k=100` rather
than several small ones, `abstracts=false` then `/works` only for the papers you keep, never in parallel.
## Limits and honesty
- Search covers English titles + abstracts only (no full texts); papers without an English abstract are
not in it. Search by meaning reaches back only as far as the coverage above says; exact-word search and
/works cover the whole corpus.
- Data is an OpenAlex snapshot (see coverage): very recent papers and corrections arrive later.
- `topic` / `field` labels come from that snapshot and are often wrong: OpenAlex has since relabelled more
than half of a random sample. Don't rely on them for classification; the text is more reliable.
- `junk` is a model (trained on labels from an AI judge, validated on 60 test questions): it pushes
junk down, but it also pushes down some real papers with thin records (no authors or references listed),
and it does not judge whether a paper is *right* (crank papers can score clean).
- Errors: 400/422 bad parameters (the body says which), 404 unknown paper or route, 429 too many requests,
502/503 search briefly unavailable (e.g. during a nightly data update, ~1–3 minutes): retry later.
## Sources
Paper records: OpenAlex (CC0). Full-text flags: PubMed Central (NCBI). Embeddings: DenseOn
(lightonai/DenseOn). Operated for ScienceMadeReadable. Requests (including search words) appear in the
server's request log, which does not record your address.