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
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 }
    }
  }'
Browser (fetch)
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).

Loading...

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.

CallerPages / dayImages / dayRequests
Anonymous50050060/hour
Signed in (free)1,0001,0001,000/hour
Free API key2,0002,00060/minute
Paid tiersUncappedUncapped60–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.

https://sourcelibrary.org/api/mcp
Claude.ai & Claude Desktop (Connectors)No code — works in the chat you already use
  1. Open claude.ai → Settings → Connectors (Claude Desktop uses the same Connectors settings).
  2. Click Add custom connector.
  3. Name it Source Library — keep this exact name; shared pages and artifacts that call the library look your connector up by it.
  4. URL: https://sourcelibrary.org/api/mcp — leave the OAuth fields empty (no authentication), then save.
  5. In any chat, open the tools menu, switch the connector on, and ask away — try the prompts below.
Claude Code (one command)Add -H "Authorization: Bearer YOUR_KEY" for higher limits
claude mcp add source-library https://sourcelibrary.org/api/mcp
Other MCP clients (Cursor, Windsurf, custom)Any client that speaks Streamable HTTP
{
  "mcpServers": {
    "source-library": {
      "url": "https://sourcelibrary.org/api/mcp"
    }
  }
}
Local via npm (stdio-only clients)Legacy — prefer the remote URL above
claude mcp add source-library -- npx -y @source-library/mcp-server

Tools

search_libraryFind books on a topic — full-text search across the catalog
search_translationsFind quotable passages by keyword across the whole library
search_conceptSemantic passage search — matches paraphrases and adjacent ideas, not just keywords
search_within_bookSearch inside a specific book’s pages
list_booksBrowse with filters — language, year, category, translation status
list_editionsEvery edition of a work the library holds, across languages and centuries
get_bookBook metadata: summary, chapters, edition info, DOI
get_book_textRead 50+ pages in one call — OCR, translation, or both
get_quoteExact text of a single page with a stable citation URL
get_quotesVerbatim text + citation links for up to 25 pages in one call
get_locusResolve canonical references — Bekker (Aristotle) and Stephanus (Plato) — to the leaves that carry them
search_imagesSearch historical illustrations and artworks by subject, symbol, figure, type
submit_feedbackSend bug reports and requests to the team
share_findingsContribute a cited research dossier back to the library (human-reviewed)
propose_collectionPropose 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.

Base URL: https://sourcelibrary.org/api·OpenAPI spec (JSON)
GET/search

Full-text search across books and page content

qstringSearch query (required)
languagestringFilter by language
year_from / year_tonumberPublication year range
sortstringrelevance, date_asc, date_desc, title
GET /search?q=philosopher's stone&language=Latin
GET/books/:id/text

Get full book text (OCR, translation, or both) in a single call

contentstringocr, translation, or both (default)
from / tonumberPage range (inclusive)
formatstringjson (structured) or plain (concatenated text)
GET /books/history-of-both-worlds-macrocosm-fludd/text?content=translation&from=1&to=50
GET/books/library

Browse and filter the catalogue. Every row carries id, slug, title, author, author_id, language, year, and translation progress.

author_idstringCanonical author slug — exactly that person's books. Discover slugs via /catalog/author-search; the response echoes the canonicalized author.
year_from / year_tonumberEdition-year range (numeric year only; books without a known year never match)
language / category / collection / librarystringEdition language, category, collection slug, contributing library
searchstringFree-text over titles and authors (relevance-ranked)
edition_keystringOther 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_editionmixedEditions of one work; only translated books; only first translations; only books readable in an ISO language (e.g. es)
sort / limit / skipmixedrecent-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/:idBook 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/:storeEmbedding vectors — books, gallery, clip (visual), artworks. For your own UMAP, clustering, or nearest-neighbour work.
GET/worksWorks held in many editions across centuries — witness counts and year spans. Feed work_id back to /books/library.
GET/librariesContributing institutions with book counts — resolves the library= filter values into named libraries
GET/books/facetsTopic vocabulary (tradition, domain, form, sphere, era, mode) and books by facet; ?counts=true for the vocabulary with counts
GET/books/distributionsCounts by language, category, collection, library, and decade — same filters as /books/library (no free-text search). Built for charts and timelines.
GET/gallery/collectionsList curated image collections (visual + thematic) with cover images and counts
GET/gallery/collections/:slugOne image collection with resolved items — imageCount always equals items delivered
GET/books/:id/searchSearch within a book's pages
GET/books/:id/quoteSingle-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/gallerySearch 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/csvDownload 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.

Page

https://sourcelibrary.org/book/history-of-both-worlds-macrocosm-fludd?page=57

Book

https://sourcelibrary.org/book/history-of-both-worlds-macrocosm-fludd

With DOI

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.