Goodreads Scraper — Book Ratings, Authors & Metadata
Pricing
from $2.69 / 1,000 goodreads book returneds
Goodreads Scraper — Book Ratings, Authors & Metadata
Scrape Goodreads books by search or URL: ratings, rating counts, authors, pages, genres and descriptions. Goodreads API alternative, USD 3.37 per 1,000 books.
Pricing
from $2.69 / 1,000 goodreads book returneds
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
14 hours ago
Last modified
Categories
Share
Goodreads Scraper searches Goodreads by title, author or keyword, or reads Goodreads book URLs you supply, and returns one clean row per book: title, authors, average rating, rating and review counts, page count, publication date, ISBN when shown, genres and description. It is built for publishers, booksellers, data scientists and reading-app developers who need Goodreads book data without the retired Goodreads API, and it costs about USD 3.37 per 1,000 books (USD 0.003368 per book on the Free tier) plus a start fee of about USD 0.006.
What data does the Goodreads scraper return?
Each dataset row is one Goodreads book. Search results give the fields Goodreads shows in its search list; turning on includeDescription (or passing book URLs) opens each book page and fills the rest.
| Field | What it contains | From search | From book page |
|---|---|---|---|
title | Book title, including series when Goodreads shows it | yes | yes |
bookUrl | Canonical book URL https://www.goodreads.com/book/show/<id> (the row's unique key) | yes | yes |
authors | Author names; book pages also list editors and illustrators | yes | yes |
rating | Average rating (1–5) | yes | yes |
ratingsCount | Number of ratings, exact | only when Goodreads prints the exact number | yes |
reviewsCount | Number of written reviews | – | yes |
pages | Page count of the edition | – | yes |
publicationDate | Year from search; first-publication date from the book page | year | full date |
isbn | ISBN-13 when Goodreads shows one for the edition | – | yes, when present |
description | Book description | – | yes |
shelves | Top genres (shelves) | – | yes |
sourceQuery | The search term that found the book (null for URL input) | yes | yes |
scrapedAt | Collection time (ISO 8601) | yes | yes |
Goodreads now shows rounded rating counts such as "4.6m" in some search layouts. The Actor leaves ratingsCount empty instead of guessing; turn on includeDescription to get the exact count from the book page.
Is there a Goodreads API alternative?
Yes. Goodreads stopped issuing developer API keys, so this Actor reads the public Goodreads search and book pages and returns the data as JSON, CSV or Excel. You call it through the Apify API from JavaScript, Python or any HTTP client, or from an AI assistant, and you pay only for books returned.
How do I scrape Goodreads search results?
Put one or more titles, authors or keywords in searchTerms and set maxResultsPerSearch (1–50). A search for "The Hobbit" returns the same books, in the same order, that Goodreads lists for that query. Searches run one request at a time with a polite delay (requestDelayMs, default 1.2 seconds).
Can I scrape specific Goodreads books by URL?
Yes. Put book URLs in bookUrls, for example https://www.goodreads.com/book/show/234225.Dune. Only those books are read; the sample search does not run when you pass URLs. Different URL forms of the same book (with or without the title slug, query strings or anchors) produce one row and one charge.
When should I use this Actor, and when not?
Use it for reading-list enrichment, comparing ratings across editions, catalogue research, recommendation-model training data and author or series tracking.
Do not use it for:
- Full review text or reviewer profiles. The Actor returns review counts, not the reviews themselves.
- Free, openly licensed ebooks. Use DOAB Open Access Books Scraper.
- Rare and antiquarian book prices. Use viaLibri Scraper.
Input
| Field | Default | Notes |
|---|---|---|
searchTerms | ["The Hobbit"] (prefill) | Titles, authors or keywords, up to 50 |
bookUrls | – | Goodreads book URLs, up to 100 |
maxResultsPerSearch | 10 | 1–50 books per search |
includeDescription | false | Open each search result's book page for description, pages, ISBN, genres and exact counts |
requestDelayMs | 1200 | 500–10,000 ms between requests |
{"searchTerms": ["Brandon Sanderson", "Project Hail Mary"],"maxResultsPerSearch": 20,"includeDescription": true}
JavaScript (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('muhammadafzal/goodreads-scraper').call({ searchTerms: ['Dune'], maxResultsPerSearch: 5, includeDescription: true });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((b) => `${b.title} — ${b.rating} (${b.ratingsCount} ratings)`));
Python (apify-client 3.x)
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("muhammadafzal/goodreads-scraper").call(run_input={"bookUrls": [{"url": "https://www.goodreads.com/book/show/5907.The_Hobbit"}]})for book in client.dataset(run.default_dataset_id).iterate_items():print(book["title"], book["pages"], book["shelves"])
Use it from an AI assistant
Goodreads Scraper works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add https://mcp.apify.com/?tools=muhammadafzal/goodreads-scraper and ask, for example: "Look up the first four Dune books on Goodreads and give me each one's rating, number of ratings and page count."
Output example
[{"title": "Dune (Dune, #1)","bookUrl": "https://www.goodreads.com/book/show/234225","authors": ["Frank Herbert"],"isbn": "9780340839935","rating": 4.29,"ratingsCount": 1722482,"reviewsCount": 90404,"pages": 604,"publicationDate": "June 1, 1965","description": "Set on the desert planet Arrakis, Dune is the story of the boy Paul Atreides…","shelves": ["Science Fiction", "Fiction", "Fantasy", "Classics"],"sourceQuery": null},{"title": "The Hobbit, or There and Back Again","bookUrl": "https://www.goodreads.com/book/show/5907","authors": ["J.R.R. Tolkien"],"rating": 4.3,"ratingsCount": null,"publicationDate": "2002","sourceQuery": "The Hobbit"}]
How much does the Goodreads scraper cost?
You pay per book saved to the dataset, plus a start fee per started GB of allocated memory. Platform usage is included.
| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Goodreads book returned | USD 0.003368 | USD 0.003283 | USD 0.003199 | USD 0.002694 |
| Actor start (per started GB of memory) | USD 0.006251 | USD 0.006094 | USD 0.005938 | USD 0.005 |
The default memory is 256 MB, so one start event is charged. Worked totals on the Free tier: the 10-book sample search costs about USD 0.006 + 10 × 0.003368 = USD 0.04; 500 books (50 searches of 10) cost about USD 1.69. Each book is charged once per run, incomplete rows are never saved or charged, and if you set a maximum charge the run stops cleanly before going over it.
Reliability and limits
- Up to 50 searches of 50 books and 100 book URLs per run. A 10-book search finishes in well under a minute;
includeDescriptionadds one book-page request per result. - Goodreads sometimes answers automated visits with an access check. The Actor retries with a fresh session; a book page that stays blocked keeps its search data without a description, and a blocked URL input returns no row and no charge.
- Every run writes a
SUMMARYrecord withstatus(DATA,EMPTY,BLOCKEDorREJECTED), books saved, book events charged, access checks met and warnings. A run blocked on every request ends as failed with no book charges.
FAQ
Does it return Goodreads reviews? It returns the average rating and the rating and review counts, not review text.
Why is ratingsCount empty for some books?
Goodreads showed a rounded count in its search list. Turn on includeDescription to read the exact count from the book page.
Will I be charged twice for the same book? No. Rows are keyed by the Goodreads book ID, so URL variants and repeated search hits produce one row and one charge.
Do I need a Goodreads account or a proxy? No. The Actor reads public pages without logging in, and access is handled for you.
How fresh is the data? Every run reads the live Goodreads pages.
Related Actors
- DOAB Open Access Books Scraper: open-access academic books.
- viaLibri Scraper: rare and antiquarian book listings and prices.
Legal and compliance
The Actor reads public Goodreads pages without logging in and at a polite request rate. Book descriptions and metadata are Goodreads' and publishers' content; check the Goodreads terms before republishing, and use the data for research, analysis or internal tools.
Last verified: 2026-10-27