Books Scraper — Titles, Authors, ISBN, Editions (Open Library)
Pricing
from $0.70 / 1,000 result items
Books Scraper — Titles, Authors, ISBN, Editions (Open Library)
Search books by title, author, ISBN or subject: title, authors, first publish year, editions count, ISBNs, subjects, languages, cover image, Open Library and Goodreads ids; ISBN lookup with publisher, pages and description. No API key.
Pricing
from $0.70 / 1,000 result items
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Search 20+ million Open Library book records by title, author, subject, publisher or ISBN and get clean JSON: authors, first publish year, edition count, ISBNs, subjects, languages, publishers, ratings, reading-log popularity, Goodreads/Amazon/OCLC ids, covers and e-book availability. Look up ISBNs for publisher, pages, format and description; list an author's works, browse a subject, or pull every edition of a work. No API key, no proxy, no browser.
Use cases
- Catalogue enrichment for bookshops and marketplaces: turn a list of ISBNs into title, authors, publisher, pages, format, cover and description.
- Publisher and competitor research: list a publisher's catalogue (
searchField: "publisher") or a subject's newest titles. - Rights and translation scouting: find which languages and editions exist for a work, with years and publishers.
- Reading-list and recommendation products: rank books in a subject by popularity (reading logs, want-to-read) or rating.
- Author due diligence: bio, birth/death dates, Wikidata/VIAF/ISNI ids and most-read works of an author.
- Library and e-learning: filter to works with a readable/borrowable scan on archive.org (
ebookOnly).
Input
| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
queries | string[] | required | Titles, keywords, author names, subjects, ISBN-10/13 (hyphens ok), Open Library keys OL…W / OL…M / OL…A or their URLs |
mode | string | auto | auto (detect ISBN/key/text), search, isbn, author, subject, work |
searchField | string | any | any, title, author, subject, publisher, place, person, isbn (search mode) |
limit | integer | 5 | 1–100 results per query (search/author/subject) |
offset | integer | 0 | 0–10 000, for paging across runs |
sortBy | string | relevance | see Sort orders; subject mode: only relevance/editions (most editions), new, old — other sorts are refused there |
language | string | any | MARC 21 code, see Languages; search and author modes (refused in subject mode: the subjects API has no language filter) |
yearFrom / yearTo | integer | none | 1000–2100, first publication year (inclusive) |
ebookOnly | boolean | false | Only works with a scan on archive.org |
includeAvailability | boolean | false | Lending status per work (search mode) |
includeDescription | boolean | false | Work description + external links (+1 request/work; ISBN, edition and work lookups always carry the description) |
includeEditions | boolean | false | Editions list per work (+1 request/work) |
maxEditions | integer | 10 | 1–50 |
includeAuthorDetails | boolean | false | authorsDetailed: bio, dates, Wikipedia/Wikidata/VIAF/ISNI, photo (+1 request per distinct author, cached) |
coverSize | string | L | S, M, L |
maxSubjects | integer | 15 | 0–200 |
dedupe | boolean | true | Save each work/edition/author once across queries |
fields | string[] | all | Keep only these output fields, in your order; query is always kept. Case, snake_case and Open Library names (author_name, cover_i) are read as the field; unknown names are left out and named in the status; a list with no known field is refused. Rows with none of the listed fields (e.g. the author row for ["title"]) are not saved and not charged |
Reference
Lookup modes
| Mode | What you pass | What you get |
|---|---|---|
auto | anything | ISBN → edition record; OL…W → work; OL…M → edition; OL…A → author + works; text → search |
search | keywords | Works matching the text (optionally in one searchField) |
isbn | ISBN-10/13 | One edition: publisher, date, pages, format, identifiers, work description, subjects, author names. Check digit is validated (warning only) |
author | name or OL…A | One author row (for names, the record with the most works is chosen, alternatives are logged) + their works |
subject | subject name/slug | Works in that subject (science fiction → science_fiction), with total subjectWorkCount. Years and ebookOnly apply; language does not exist there |
work | OL…W / OL…M | Full work record from the search index + description |
Sort orders
| Value | Meaning |
|---|---|
relevance | Best text match (default) |
new / old | First publish year, newest / oldest first |
rating | Average user rating |
editions | Most editions |
readinglog | Most reading-log entries (overall popularity) |
want_to_read / currently_reading / already_read | Reading-log shelves |
title | Title A–Z |
scans | Works with scans first |
random | Random order |
Languages
The language select offers these MARC 21 codes; Apify refuses any other value before the run starts. Full MARC list: loc.gov MARC language codes.
| Code | Language | Code | Language | Code | Language | Code | Language |
|---|---|---|---|---|---|---|---|
| eng | English | spa | Spanish | fre | French | ger | German |
| ita | Italian | por | Portuguese | rus | Russian | chi | Chinese |
| jpn | Japanese | kor | Korean | ara | Arabic | dut | Dutch |
| swe | Swedish | pol | Polish | tur | Turkish | per | Persian |
| heb | Hebrew | hin | Hindi | ukr | Ukrainian | cze | Czech |
| dan | Danish | fin | Finnish | nor | Norwegian | hun | Hungarian |
| gre | Greek | rum | Romanian | kaz | Kazakh | uzb | Uzbek |
| kir | Kyrgyz | tgk | Tajik | aze | Azerbaijani | geo | Georgian |
| arm | Armenian | mon | Mongolian | bel | Belarusian | tat | Tatar |
| ind | Indonesian | may | Malay | vie | Vietnamese | tha | Thai |
| ben | Bengali | urd | Urdu | tam | Tamil | tel | Telugu |
| mar | Marathi | lat | Latin | cat | Catalan | bul | Bulgarian |
| hrv | Croatian | srp | Serbian | slo | Slovak | slv | Slovenian |
| lit | Lithuanian | lav | Latvian | est | Estonian | ice | Icelandic |
| afr | Afrikaans | swa | Swahili | tgl | Tagalog |
Common subject slugs
Any Open Library subject works; examples: business, entrepreneurship, management, economics, finance, marketing, leadership, self-help, psychology, science_fiction, fantasy, mystery_and_detective_stories, romance, history, biography, programming, computer_science, artificial_intelligence, machine_learning, mathematics, medicine, cooking, travel, children, poetry. Browse more at openlibrary.org/subjects.
Examples
Enrich a list of ISBNs for a shop catalogue
{ "queries": ["978-0-307-88789-4", "9780062316097", "0735211299"], "mode": "isbn", "includeAuthorDetails": true, "coverSize": "M" }
Newest books in a subject (new-release tracking)
{ "queries": ["entrepreneurship"], "mode": "subject", "yearFrom": 2024, "sortBy": "new", "limit": 50 }
An author's most-read works with all editions (rights scouting)
{ "queries": ["Peter Drucker"], "mode": "author", "sortBy": "readinglog", "limit": 10, "includeEditions": true, "maxEditions": 20, "includeAuthorDetails": true }
A publisher's catalogue in one language
{ "queries": ["O'Reilly Media"], "searchField": "publisher", "language": "eng", "yearFrom": 2020, "sortBy": "new", "limit": 100, "fields": ["title", "authors", "firstPublishYear", "isbn13", "url"] }
Free-to-read classics for an e-learning library
{ "queries": ["economics"], "searchField": "subject", "ebookOnly": true, "includeAvailability": true, "sortBy": "readinglog", "limit": 25 }
Output
Search / author / subject rows describe a work; ISBN rows describe an edition; author mode adds one author row. Real example (author-mode work row for "Peter Drucker", sortBy: "readinglog"; arrays trimmed):
{"query": "Peter Drucker","mode": "author","workKey": "OL274337W","title": "The Practice of Management","authors": ["Peter F. Drucker"],"authorKeys": ["OL4345625A"],"firstPublishYear": 1954,"latestPublishYear": 2017,"editionCount": 37,"isbn13": "9780060913168","isbn10": "0330020315","isbnCount": 44,"languages": ["chi", "und", "eng"],"publishers": ["Butterworth Heinemann", "Taylor & Francis Group"],"subjects": ["Business", "Nonfiction", "Industrial management"],"pagesMedian": 404,"firstSentence": "THE manager is the dynamic, life-giving element in every business.","rating": 5,"ratingsCount": 2,"readingLogCount": 144,"wantToRead": 130,"goodreadsId": "114837","amazonAsin": "B002JN0B82","oclc": "567448468","ddc": "658","ebookAccess": "borrowable","hasFulltext": true,"coverUrl": "https://covers.openlibrary.org/b/id/6418448-L.jpg","url": "https://openlibrary.org/works/OL274337W","source": "openlibrary","fetchedAt": "2026-09-13T08:17:11.726Z","numFound": 320}
| Field | Rows | Description |
|---|---|---|
query, mode, found | all | Input query (always kept, also with fields), lookup type; found is true on every row (queries that match nothing or fail are not rows — see SUMMARY) |
workKey, editionKey, authorKey | work / edition / author | Stable Open Library ids |
title, subtitle, authors, authorKeys | work, edition | |
firstPublishYear, publishYears, latestPublishYear, editionCount | work | |
isbn13, isbn10, isbns, isbnCount | work (strings: the first ISBN-13/-10; isbns: first 20), edition (lists) | |
languages, publishers, subjects, places, people, timePeriods | work | |
rating, ratingsCount, readingLogCount, wantToRead, currentlyReading, alreadyRead | work | Popularity signals |
goodreadsId, amazonAsin, librarythingId, oclc, lccn, lcc, ddc | work, edition | External identifiers / classifications |
ebookAccess, hasFulltext, publicScan, archiveOrgIds, availability | work | E-book status |
publishDate, publishYear, pages, physicalFormat, publishPlaces, series, edition, description | edition | |
editions, editionsTotal | with includeEditions | Brief edition list: key, year, publishers, ISBNs, languages, pages, format, cover |
authorsDetailed, name, bio, birthDate, deathDate, wikidataId, viaf, isni, photoUrl | author / includeAuthorDetails | The dataset's Authors view shows the author rows |
numFound, subjectWorkCount | search / subject | Total matches at the source |
coverUrl, url, source, fetchedAt | all |
Every field's type, meaning and an example are in the dataset schema (Output tab / API).
Use it from code / agents
curl -X POST "https://api.apify.com/v2/acts/yadroo~openlibrary-books/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"queries":["9780307887894","9780062316097"],"mode":"isbn"}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/openlibrary-books').call({ queries: ['machine learning'], mode: 'subject', sortBy: 'new', limit: 30 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("yadroo/openlibrary-books").call(run_input={"queries": ["Nassim Taleb"], "mode": "author", "includeAuthorDetails": True})items = client.dataset(run["defaultDatasetId"]).list_items().items
MCP: add https://mcp.apify.com to Claude / Cursor / any MCP client and call the yadroo/openlibrary-books tool with the same JSON input.
Pricing
Pay per event: $0.001 per run start + $0.001 per dataset row (work, edition or author). Queries that match nothing or fail are not rows and are not charged.
Store discounts: Bronze −10 %, Silver −20 %, Gold and above −30 % on the row price; the start event is the same on every plan; platform usage is included.
Typical runs: 10 ISBN lookups ≈ $0.011; 100 books in a subject ≈ $0.101; an author row + 50 works ≈ $0.052.
The run never goes over your Maximum cost per run: it stops with the status Stopped at your spending limit: N rows delivered, and it spends enrichment requests only on rows the limit still pays for.
Limits & FAQ
- Speed and politeness: Open Library is a volunteer-run non-profit. Its API policy allows 3 requests per second to clients that identify themselves, as this actor does with its User-Agent. The actor sends one request at a time, at least 350 ms apart (retries included). An ISBN costs about 3 requests: the edition, its work (subjects, description) and its author names, with authors cached within the run. Enrichment options add one request per work, and
includeAuthorDetailsadds one per distinct author. - Capacity: a 15-minute run (the default timeout) does roughly 2 000 requests. That is about 600–700 ISBNs, or a few hundred enriched works. Near the timeout the actor stops starting requests, saves what it has and ends with the status
Stopped before the run timeout: N rows saved. Raise the timeout or split the job for more. - Bulk data: Open Library asks not to bulk-download through its API. For whole-catalogue work (millions of records) use its free monthly data dumps instead of this actor.
- Data quality: records are community-edited: duplicates of authors/works exist,
ratingsare sparse, some ISBNs map to the wrong work. For name lookups in author mode the record with the most works is chosen and alternatives are logged; pass anOL…Akey to force one. - Freshness: live API, new records appear as soon as they are added to Open Library.
- Not found / errors: ISBNs, keys or searches that match nothing, and requests that fail, are not dataset rows (you are not charged for them). They are listed in the run's
SUMMARYrecord (notFound,notFoundCount,errors: [{ input, error }],errorCount) and in the status message, e.g.7 record(s) saved · 1 query not found · 1 failed. The run fails only when nothing could be fetched at all. Each request gets 30 s per attempt and up to 3 attempts. Retries on 429/5xx, dropped connections and non-JSON answers wait 2 s and then 4 s, or whateverRetry-Afterasks for. When 3 requests in a row fail like that, Open Library is treated as down: the run stops and the status names the queries not tried. - Not included: prices, stock or seller offers (Open Library does not have them), and full text of books.
- Roadmap: trending lists.
Made by Yadroo. Sibling actors: arxiv-papers, openalex-works, wikipedia-search, rss-to-json, hackernews-search.