Goodreads Book Scraper avatar

Goodreads Book Scraper

Pricing

from $1.99 / 1,000 books

Go to Apify Store
Goodreads Book Scraper

Goodreads Book Scraper

Scrape Goodreads search results by keyword: book titles, series, authors, ratings, rating counts, publication year, editions, and cover images. Multiple keywords per run, export to JSON, CSV, or Excel.

Pricing

from $1.99 / 1,000 books

Rating

0.0

(0)

Developer

ParseBird

ParseBird

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

15 days ago

Last modified

Categories

Share

Goodreads Book Scraper

Goodreads Book Scraper searches Goodreads by keyword, title, author, or ISBN and saves every matching book with its series, authors, average rating, rating count, publication year, number of editions, and cover image. Enter one or more search words and get one clean row per book.

Turn any Goodreads search into a spreadsheet of books, with series and translator credits split into their own fields, run dozens of keywords at once, and go past the 2,000-book limit of a single Goodreads search.

Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

Actor: parsebird/goodreads-book-scraper — scrapes Goodreads book search results. Input: {"keywords": ["shaker"] (array of strings, required; titles, author names, topics, or ISBNs, one search per keyword), "maxItems": 30 (books per keyword, 1-10000; Goodreads shows max 2,000 per search, above that the actor adds title-only and author-only searches and skips duplicates), "searchField": "all"|"title"|"author" (default "all"), "proxyConfiguration": {"useApifyProxy": false} (optional; the actor switches to Apify Proxy by itself when Goodreads rate-limits)}. Run via ApifyClient("YOUR_TOKEN").actor("parsebird/goodreads-book-scraper").call(run_input=input). Output, one row per book: keyword, rank, bookId, workId, title (with series), titleWithoutSeries, series[] {name, number}, url, author {name, url, isGoodreadsAuthor}, authors[] {name, url, isGoodreadsAuthor, role}, cover, coverLarge, rating {average, count}, publishYear, editions, editionsUrl. Pricing: pay per book saved. Get your API token at https://console.apify.com/account#/integrations. Full API spec: https://apify.com/parsebird/goodreads-book-scraper/api

What is Goodreads Book Scraper?

Goodreads Book Scraper is a Goodreads scraping tool that runs the same book search you see on Goodreads.com and turns the results into structured data. Goodreads stopped issuing new developer API keys in December 2020, so this scraper works as a Goodreads API alternative for readers, publishers, authors, booksellers, and data teams.

The easiest way to try it: keep the prefilled keyword shaker, click Start, and open the dataset. You get 30 books with authors, ratings, rating counts, publication years, and edition counts in a few seconds.

No Goodreads account or API key is needed.

What can Goodreads Book Scraper do?

  • 🔎 Search by anything — book titles, author names, topics, or ISBNs. An ISBN search returns the exact book.
  • 📚 Many keywords per run — add a list of keywords and each one runs as its own search. Every row records its keyword and rank.
  • 🎯 Search in titles or authors only — narrow the match to the title or the author name, just like the Goodreads search filter.
  • 📈 More than 2,000 books per keyword — Goodreads stops a search at 100 pages. When you ask for more, the scraper also runs a title search and an author search for the same keyword and adds the books it has not saved yet.
  • 🧩 Clean, split fields — the series name and number come out of the title, every contributor gets a role (author, translator, editor, illustrator), and cover links come in thumbnail and full size.
  • 🛡️ Rate-limit handling — when Goodreads starts refusing requests, the scraper retries on a new connection and moves to Apify Proxy without you changing anything.

Because Goodreads Book Scraper runs on the Apify platform, you also get:

  • ⏰ Scheduling to track ratings and new books daily, weekly, or monthly.
  • 🔌 API access and client libraries for Python and JavaScript.
  • 🔗 Integrations with Make, Zapier, Google Sheets, Slack, webhooks, and more.
  • 📦 Export to JSON, CSV, Excel, XML, or HTML from the Storage tab or the API.

What data can you extract from Goodreads?

FieldDescription
keyword / rankThe search keyword and the book's position among the books saved for it
bookId / workIdGoodreads book (edition) ID and work ID, which groups all editions
titleFull title as Goodreads shows it, including the series, e.g. Shaker (Blackwings MC, #5)
titleWithoutSeriesThe title on its own, e.g. Shaker
seriesList of series with name and number (number can be 5.5 or 1-3)
urlBook page URL on Goodreads
authorFirst listed author: name, url, and isGoodreadsAuthor
authorsEvery contributor with name, url, isGoodreadsAuthor, and role (Author, Translator, Editor, Illustrator, ...)
cover / coverLargeThumbnail cover URL and full-size cover URL (coverLarge is null when Goodreads has no cover)
rating.average / rating.countAverage star rating (out of 5, null for books with no ratings) and number of ratings
publishYearYear the work was first published (negative for BC, e.g. -800 for Homer)
editions / editionsUrlNumber of editions of the work and the link to its editions page

How to scrape Goodreads books

  1. Open Goodreads Book Scraper in Apify Console and click Try for free.
  2. Under Search keywords, enter one or more words: a title (the hobbit), an author (Brandon Sanderson), a topic (stoicism), or an ISBN (9780439023481).
  3. Set Max books per keyword, for example 100.
  4. Optionally choose Search in → Title or Author to narrow the match.
  5. Click Start and wait for the run to finish.
  6. Open the Output tab to preview books, or export them as JSON, CSV, Excel, XML, or HTML.

Input parameters

ParameterTypeRequiredDefaultDescription
keywordsarray of stringsYes["shaker"]Words to search for on Goodreads: titles, author names, topics, or ISBNs. Each keyword is a separate search.
maxItemsintegerNo30Maximum books to save per keyword (1 to 10,000).
searchFieldstringNoallWhere Goodreads matches the keyword: all (title, author, ISBN), title, or author.
proxyConfigurationobjectNo{"useApifyProxy": false}Optional proxy. Not needed in most runs; the scraper moves to Apify Proxy on its own when Goodreads rate-limits.

Example input:

{
"keywords": ["shaker"],
"maxItems": 50
}

Output example

Each book is one dataset item. Download the results in JSON, CSV, Excel, XML, or HTML.

[
{
"keyword": "shaker",
"rank": 1,
"bookId": 43999679,
"workId": 68403363,
"title": "Shaker (Blackwings MC, #5)",
"titleWithoutSeries": "Shaker",
"series": [{ "name": "Blackwings MC", "number": "5" }],
"url": "https://www.goodreads.com/book/show/43999679-shaker",
"author": {
"name": "Teagan Brooks",
"url": "https://www.goodreads.com/author/show/18042726.Teagan_Brooks",
"isGoodreadsAuthor": true
},
"authors": [
{
"name": "Teagan Brooks",
"url": "https://www.goodreads.com/author/show/18042726.Teagan_Brooks",
"isGoodreadsAuthor": true,
"role": "Author"
}
],
"cover": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1550046473i/43999679._SY75_.jpg",
"coverLarge": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1550046473i/43999679.jpg",
"rating": { "average": 4.49, "count": 3493 },
"publishYear": 2019,
"editions": 6,
"editionsUrl": "https://www.goodreads.com/work/editions/68403363-shaker-blackwings-mc-5"
},
{
"keyword": "odyssey homer",
"rank": 8,
"bookId": 1375,
"workId": 1474309,
"title": "The Iliad / The Odyssey",
"titleWithoutSeries": "The Iliad / The Odyssey",
"series": [],
"url": "https://www.goodreads.com/book/show/1375.The_Iliad_The_Odyssey",
"author": {
"name": "Homer",
"url": "https://www.goodreads.com/author/show/903.Homer",
"isGoodreadsAuthor": false
},
"authors": [
{ "name": "Homer", "url": "https://www.goodreads.com/author/show/903.Homer", "isGoodreadsAuthor": false, "role": "Author" },
{ "name": "Robert Fagles", "url": "https://www.goodreads.com/author/show/1005.Robert_Fagles", "isGoodreadsAuthor": false, "role": "Translator" },
{ "name": "Bernard Knox", "url": "https://www.goodreads.com/author/show/280215.Bernard_Knox", "isGoodreadsAuthor": false, "role": "Introduction" }
],
"cover": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1388181863i/1375._SX50_.jpg",
"coverLarge": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1388181863i/1375.jpg",
"rating": { "average": 4.08, "count": 87207 },
"publishYear": -800,
"editions": 132,
"editionsUrl": "https://www.goodreads.com/work/editions/1474309"
}
]

Use cases

  • Book market research — see which titles, series, and authors dominate a genre or topic, and how many ratings they have.
  • Publishing and acquisitions — compare ratings and edition counts of comparable titles before signing or pricing a book.
  • Author and series tracking — schedule a run for an author name and watch rating counts grow over time.
  • Bookstore and library catalogs — match ISBNs or titles to Goodreads IDs, ratings, and cover images.
  • Reading apps and recommendation engines — seed a database with book IDs, series, and ratings for many keywords at once.
  • Data science and AI — build datasets of books, authors, and ratings for analysis, dashboards, or model training.

How it works

  1. For each keyword, Goodreads Book Scraper loads the Goodreads search results page by page (20 books per page), several pages in parallel.
  2. Each result row is read into structured fields: the series is split out of the title, every contributor gets a role, and the cover link is also given in full size.
  3. Goodreads serves at most 100 pages (2,000 books) per search. If you ask for more books and the keyword has more results, the scraper also searches the keyword in titles only and in author names only, and saves the books that were not in the first search. Each book is saved once per keyword.
  4. Goodreads' search pages are not stable: the same search can repeat some books on later pages and skip others. When a search has fewer results than you asked for, the scraper reads it again (up to two more times) and adds the books it missed, stopping early when a pass finds nothing new.
  5. When a search for an ISBN or book ID opens a book page directly, the scraper reads that book and saves it as one row.
  6. Goodreads limits how many requests one IP address can send. When it starts refusing, the scraper retries on a new connection and switches to Apify Proxy, first datacenter and then residential if needed.

How much does it cost to scrape Goodreads?

Goodreads Book Scraper uses pay-per-event pricing. You pay per book saved to the dataset. Compute and proxy costs are included in the price, so there are no extra platform usage charges.

EventFree planBronzeSilverGold
book-scraped — per book saved$0.00299$0.00259$0.00229$0.00199
Per 1,000 books$2.99$2.59$2.29$1.99

For example, the prefilled run (30 books) costs about $0.09 on the Free plan, and 1,000 books cost $2.99. Use Max books per keyword or a spending limit to cap a run; the scraper stops as soon as the limit is reached. Apify's Free plan includes monthly platform credits you can use to try the scraper.

Use Goodreads Book Scraper with the API

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("parsebird/goodreads-book-scraper").call(run_input={
"keywords": ["Brandon Sanderson", "Ursula K. Le Guin"],
"searchField": "author",
"maxItems": 100,
})
for book in client.dataset(run["defaultDatasetId"]).iterate_items():
print(book["keyword"], book["title"], book["rating"]["average"], book["rating"]["count"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('parsebird/goodreads-book-scraper').call({
keywords: ['stoicism', 'habit building'],
maxItems: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const topRated = items
.filter((b) => b.rating.count >= 1000)
.sort((a, b) => b.rating.average - a.rating.average)
.slice(0, 10);
console.log(topRated.map((b) => `${b.rating.average} ${b.title} by ${b.author?.name}`));

See the API tab for all endpoints and the Apify API client docs for more options.

Goodreads Book Scraper only reads book search results that Goodreads shows publicly to logged-out visitors: book titles, author names, ratings, and edition counts. It does not log in or collect private user data. Make sure your use complies with Goodreads' terms, copyright rules, data protection laws such as GDPR, and any other rules that apply to you, and consult a lawyer if in doubt. Read more in Apify's post Is web scraping legal?

Other content and media scrapers

FAQ

Do I need a Goodreads account or API key? No. Goodreads Book Scraper reads the public search results without logging in. Goodreads stopped issuing developer API keys in 2020, so no key is involved.

How many books can I get per keyword? Goodreads shows at most 100 pages of 20 books (2,000 books) for one search. Above that, the scraper adds a title-only and an author-only search for the same keyword. In testing, the keyword shaker returned 2,145 unique books this way. Broad keywords have far more matches than Goodreads will list, so split them into narrower keywords to go further.

Why does the result count in the log not match the number of books? Goodreads shows an estimated total ("about 151 results"), and its result pages overlap: some books appear twice and others are skipped. The scraper saves each book once and re-reads small searches to fill the gaps, so you get close to, but not always exactly, the estimated total. In testing, the keyword shaker heights (about 151 results) returned 136 to 145 unique books per run.

What does publishYear mean? It is the year the work was first published, as shown in the Goodreads search results, not the year of the specific edition. Ancient works have negative years, e.g. -800 for The Odyssey. Books without a known year return null.

Can I search by ISBN? Yes. Put the ISBN-10 or ISBN-13 in Search keywords. Goodreads opens the matching book directly and the scraper saves it as one row. The editions count is null for these rows because the book page doesn't show it.

Does it scrape reviews, descriptions, or genres? No. This actor returns the data shown in Goodreads search results. Use the url field to open each book page for more details.

Do I need a proxy? Usually not. Goodreads limits how many requests one IP address can send in a short time. When that happens, the scraper switches to Apify Proxy by itself. You only need to set a proxy if you want to force one for every request.

Can I schedule runs or connect the results to other tools? Yes. Use Apify schedules for recurring runs and integrations to send results to Google Sheets, Slack, Zapier, Make, or a webhook. Results are also available through the API.

Something doesn't work. What should I do? Open an issue on the Issues tab with your input and run link.