For Developers & AI
Open API over 15,000+ rare pre-modern texts translated to English. No auth needed to start — sign in for a free key to lift rate limits and help us see what you're building.
The easiest path: just ask Claude
You don't need to install anything to use this collection with an AI. Open Claude (or any assistant with web access) and ask it to look something up on sourcelibrary.org — it will search, read pages, and quote with citation links. No SDK, no key, no setup.
“Use sourcelibrary.org to find what Paracelsus says about the spagyric process. Quote a few passages with citation URLs.”
“Search sourcelibrary.org for early modern texts on the harmony of the spheres — give me three with page links.”
“On sourcelibrary.org, read the first 20 pages of Fludd's Utriusque Cosmi Historia and summarize the cosmological model.”
For richer, structured access — semantic search, 50-page bulk reads, image search, DOI-backed citations — install the MCP server below or call the API directly.
30-second start (API)
One endpoint, no key required to begin. It speaks JSON-RPC over HTTP, so anything that can POST JSON can talk to it.
curl -X POST https://sourcelibrary.org/api/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0", "id": 1,
"method": "tools/call",
"params": {
"name": "search_concept",
"arguments": { "query": "prima materia", "limit": 5 }
}
}'fetch('https://sourcelibrary.org/api/mcp', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0', id: 1,
method: 'tools/call',
params: {
name: 'search_concept',
arguments: { query: 'prima materia', limit: 5 }
}
})
}).then(r => r.json()).then(console.log)CORS is open (Access-Control-Allow-Origin: *) — paste the snippet above into any browser console and it works.
Building something? Grab a free key.
The endpoints work without one — keys lift rate limits, give your traffic attribution, and help us learn what people are building so we can keep this open and free. Takes a minute. Bulk page-image downloads need one: send it as Authorization: Bearer sl_data_… on /api/image requests (anonymous scripts are capped per day; paid tiers are uncapped — see the rate card on the licensing page).
Rate limits & daily budgets
Budgets are rolling 24-hour windows across the text and quote tools; images have their own equal pool. Identity is always an upgrade: a free key out-ranks staying anonymous.
| Caller | Pages / day | Images / day | Requests |
|---|---|---|---|
| Anonymous | 500 | 500 | 60/hour |
| Signed in (free) | 1,000 | 1,000 | 1,000/hour |
| Free API key | 2,000 | 2,000 | 60/minute |
| Paid tiers | Uncapped | Uncapped | 60–1,000/minute by tier |
Your own meter: GET /api/dataset/v1/usage with your key. Verified search crawlers and user-directed assistant fetches are never limited. Full-tier keys can request images without the visible provenance marks (&clean=1 on /api/image). Text served to a key carries an invisible provenance colophon that includes your key's reference — attribution, not tracking: it names the edition and the puller, decodes to a readable note, and strips with any Unicode normalization pass.
What you can build
A researcher studying Renaissance natural philosophy wants to trace how the concept of “spiritus mundi” evolves from Ficino through Agrippa to Fludd. With the MCP server connected to Claude, they search across all three authors' translated works in a single conversation, pull exact passages with page citations, and compile a comparative analysis with DOI-backed references — work that would take days in a physical archive.
The same tools work for building research apps, enriching datasets with primary source references, or giving AI systems grounded access to pre-modern texts that aren't in their training data.
MCP Server
Gives Claude (and any MCP client) direct access to the full collection — search, read, quote, and browse 200,000+ illustrations. The endpoint is plain JSON-RPC over HTTP, so you can also call it from any HTTP client without an MCP library (see the snippets above). Pick whichever path fits.
Remote MCP Server (Streamable HTTP)
No install needed — connect any MCP client directly.
- Open claude.ai → Settings → Connectors (Claude Desktop uses the same Connectors settings).
- Click Add custom connector.
- Name it
Source Library— keep this exact name; shared pages and artifacts that call the library look your connector up by it. - URL:
https://sourcelibrary.org/api/mcp— leave the OAuth fields empty (no authentication), then save. - In any chat, open the tools menu, switch the connector on, and ask away — try the prompts below.
-H "Authorization: Bearer YOUR_KEY" for higher limitsclaude mcp add source-library https://sourcelibrary.org/api/mcp
{
"mcpServers": {
"source-library": {
"url": "https://sourcelibrary.org/api/mcp"
}
}
}claude mcp add source-library -- npx -y @source-library/mcp-server
Tools
| search_library | Find books on a topic — full-text search across the catalog |
| search_translations | Find quotable passages by keyword across the whole library |
| search_concept | Semantic passage search — matches paraphrases and adjacent ideas, not just keywords |
| search_within_book | Search inside a specific book’s pages |
| list_books | Browse with filters — language, year, category, translation status |
| list_editions | Every edition of a work the library holds, across languages and centuries |
| get_book | Book metadata: summary, chapters, edition info, DOI |
| get_book_text | Read 50+ pages in one call — OCR, translation, or both |
| get_quote | Exact text of a single page with a stable citation URL |
| get_quotes | Verbatim text + citation links for up to 25 pages in one call |
| get_locus | Resolve canonical references — Bekker (Aristotle) and Stephanus (Plato) — to the leaves that carry them |
| search_images | Search historical illustrations and artworks by subject, symbol, figure, type |
| submit_feedback | Send bug reports and requests to the team |
| share_findings | Contribute a cited research dossier back to the library (human-reviewed) |
| propose_collection | Propose a themed grouping of books (human-reviewed) |
Try asking Claude
“Search for references to ‘prima materia’ across the collection. Which authors discuss it, and how do their treatments differ?”
“Read the full translation of Fludd's History of Both Worlds, pages 1–50. Summarize the cosmological framework.”
“What does Copernicus say about the Sun's centrality in De Revolutionibus? Find the key passages with citation URLs.”
“Find all alchemical emblems depicting the ouroboros. What texts are they from?”
Command Line
Same tools as the MCP server, but standalone with colored terminal output. Add --json for scripts.
# Install npm install -g @source-library/mcp-server # Search the collection source-library search "Paracelsus" --language=German # Search inside translations source-library translations "harmony of the spheres" # Read a book source-library text history-of-both-worlds-macrocosm-fludd --from=1 --to=50 # Get exact text for quoting source-library quote history-of-both-worlds-macrocosm-fludd 57 # Browse illustrations source-library images --subject=alchemy --type=emblem # JSON output for piping source-library search "alchemy" --json | jq .results
REST API
Direct HTTP access, no authentication. The MCP server and CLI use these same endpoints.
/searchFull-text search across books and page content
| q | string | Search query (required) |
| language | string | Filter by language |
| year_from / year_to | number | Publication year range |
| sort | string | relevance, date_asc, date_desc, title |
GET /search?q=philosopher's stone&language=Latin/books/:id/textGet full book text (OCR, translation, or both) in a single call
| content | string | ocr, translation, or both (default) |
| from / to | number | Page range (inclusive) |
| format | string | json (structured) or plain (concatenated text) |
GET /books/history-of-both-worlds-macrocosm-fludd/text?content=translation&from=1&to=50/books/libraryBrowse and filter the catalogue. Every row carries id, slug, title, author, author_id, language, year, and translation progress.
| author_id | string | Canonical author slug — exactly that person's books. Discover slugs via /catalog/author-search; the response echoes the canonicalized author. |
| year_from / year_to | number | Edition-year range (numeric year only; books without a known year never match) |
| language / category / collection / library | string | Edition language, category, collection slug, contributing library |
| search | string | Free-text over titles and authors (relevance-ranked) |
| edition_key | string | Other digitizations of one printing. Take the value from a result row; only full-quality keys match, so different printings of a title are never merged. |
| work_id / has_translation / first_translation / has_edition | mixed | Editions of one work; only translated books; only first translations; only books readable in an ISO language (e.g. es) |
| sort / limit / skip | mixed | recent-translation (default), recent, title-asc, title-desc, date_asc, date_desc; pagination via limit (≤200) + skip, total in every response |
GET /books/library?author_id=jakob-bohme&sort=date_asc| GET | /books/:id | Book metadata, summary, DOI |
| GET | /catalog/author-search?q= | Find canonical authors by name — returns author_id slugs (for /books/library) plus VIAF/Wikidata anchors |
| GET | /vectors/:store | Embedding vectors — books, gallery, clip (visual), artworks. For your own UMAP, clustering, or nearest-neighbour work. |
| GET | /works | Works held in many editions across centuries — witness counts and year spans. Feed work_id back to /books/library. |
| GET | /libraries | Contributing institutions with book counts — resolves the library= filter values into named libraries |
| GET | /books/facets | Topic vocabulary (tradition, domain, form, sphere, era, mode) and books by facet; ?counts=true for the vocabulary with counts |
| GET | /books/distributions | Counts by language, category, collection, library, and decade — same filters as /books/library (no free-text search). Built for charts and timelines. |
| GET | /gallery/collections | List curated image collections (visual + thematic) with cover images and counts |
| GET | /gallery/collections/:slug | One image collection with resolved items — imageCount always equals items delivered |
| GET | /books/:id/search | Search within a book's pages |
| GET | /books/:id/quote | Single-page text for verbatim quoting |
| GET | /verify?book_id=&page= | Flat alias of /books/:id/quote — verbatim page text + citation block, for web agents with URL allow-lists |
| GET | /gallery | Search 200,000+ historical illustrations. Enumerating the corpus? Pass maxPerBook=1000 — it defaults to 3 per book so no single volume dominates the browse. |
| GET | /catalog/csv | Download the full catalogue as CSV |
Entities: people, places and concepts
Over a million named entities extracted from the AI-generated indexes of the books themselves, browsable at /explore, with the subset that carries coordinates plotted at /explore/map. A growing share is aligned to Wikidata, which brings QIDs, birth and death years, and coordinates with it.
Two limits worth knowing before you build on it
- Most entities are extracted, not identified. Alignment is by Wikipedia-URL match or exact name string. An unaligned entity means “we found this name”, not “we know what this is”.
- The source is the index, not the body. A place discussed in a book but missing from that book's index is invisible here.
Ancient toponyms are the known weak spot. The same place is written differently in every tradition that names it — Magan / Makkan / Majan / Ṣuḥār / 甕蠻 / Oman — and string matching cannot join those. Chasing a place across languages works better if you search co-occurring names: a lone toponym also collects homographs in unrelated languages, while a pair like Dilmun Meluhha returns near-pure signal.
Bulk dataset access
Pulling OCR text, translations, or page-level data in bulk? That tier is keyed — use the form above to request one, or email us with what you're building. Reviewed within 24 hours.
Page images: every URL we return is ours
Each page in an API response carries three image URLs, all on images.sourcelibrary.org:
image_full— the full-resolution master. Use this for archival work. It equals or exceeds what the originating library serves: measured page-for-page, Göttingen is 3651×4652 on both sides, and our Morgan master is 8308×10576 against 2000×2546 at the source.image_display— a ~2000px variant for viewers.image_thumb— thumbnail.
We deliberately do not hand back the originating institution's own image URLs. Roughly three quarters of the corpus was digitized by other libraries — archive.org, the Bavarian State Library, the British Library, e-rara, Gallica, Harvard and around fifteen more — and passing their per-page endpoints to every API consumer would turn this API into a fan-out onto institutions that gave us access. You would get blocked there; so would we.
Provenance is not lost: the book carries an attribution object naming the institution and linking to the item on their site. Credit the library, don't hammer it. The rare page we hold no copy of is marked image_unavailable rather than filled in with someone else's URL.
Citation URLs
Every page includes a citation URL linking directly to the source. Published editions have DOIs via Zenodo.
https://sourcelibrary.org/book/history-of-both-worlds-macrocosm-fludd?page=57
https://sourcelibrary.org/book/history-of-both-worlds-macrocosm-fludd
Author, Title, trans. Source Library (Year), p. N. DOI: 10.5281/zenodo.xxxxx
/llms.txt
Complete API documentation formatted for LLM consumption.
Pipeline Architecture
How books flow through 10 processing stages: Lambda workers, SQS queues, Gemini AI, backpressure controls. Live counts, diagrams, cost breakdowns.