Goodreads Books & Reviews Scraper
Pricing
from $0.60 / 1,000 book or review items
Goodreads Books & Reviews Scraper
Extract public Goodreads book metadata, ratings, and reader reviews from book URLs or search queries for research and book marketing workflows.
Pricing
from $0.60 / 1,000 book or review items
Rating
0.0
(0)
Developer
Fetch Cat
Maintained by CommunityActor stats
0
Bookmarked
11
Total users
6
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
Extract public Goodreads book metadata, aggregate ratings and visible reader reviews from book URLs or search queries. Export book and review rows to JSON, CSV or Excel for catalog enrichment, editorial research and reader-feedback analysis.
This is a public-page snapshot, not a complete review archive. Reviews are limited to the cards available on the fetched book page. Goodreads can block access or show fewer reviews than its aggregate count.
Quick start
- Paste one public Goodreads
/book/show/URL. - Keep reviews enabled and start with a small
maxReviewsPerBook, or disable reviews for a metadata-only export. - Start the Actor and open its dataset to download results.
{"bookUrls": [{ "url": "https://www.goodreads.com/book/show/41733839-the-great-gatsby" }],"includeReviews": true,"maxReviewsPerBook": 5}
Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.
Ready-to-run examples
Choose a public example to see its settings before starting a run:
- Scrape Goodreads ratings without review text
- Find Goodreads books by fantasy search query
- Scrape Goodreads reviews for The Great Gatsby
What you get
Book metadata rows and optional visible reader-review rows share a dataset. Use itemType to separate them and bookId or bookUrl to associate review records with a book. Aggregate ratings and review totals describe the source book rather than the number of review cards collected.
Who is it for?
- Catalog teams enriching a known list of books with available metadata.
- Editorial researchers reviewing titles, editions and public aggregate ratings.
- Reader-feedback analysts examining a small visible text-review sample in their own tools.
- Data teams organizing source-linked book and review exports.
How you can use the data
- Enrich a known Gatsby catalog entry. Use the existing exact book URL and separate its book row from reviews. Keep bookId, bookUrl, authors and available format, language or description fields together before joining to your own catalog.
- Review a small text-feedback sample. Enable reviews with a low per-book cap and filter for review rows. Keep reviewText, rating and source review links for downstream theme analysis, without equating the sample with the book's aggregate review count.
- Inspect search editions before choosing a source. Use the title query with reviews off to review up to five book candidates. Enable
includeResearchto join each edition to its work, publication and series context. ISBNs are included only when present; search matches never guarantee the intended edition. - Keep snapshot comparisons in your own system. Match book and review links across separate exports rather than expecting incremental collection, built-in sentiment analysis or change detection.
Input settings
Provide at least one bookUrls entry or one queries entry. Either works alone. Supplying both combines their book candidates. The example prefills in the form are not API defaults.
| Setting | API key | Behavior |
|---|---|---|
| Goodreads book URLs | bookUrls | Up to 25 public HTTPS Goodreads book URLs. Each entry can be a URL object or a string. |
| Search queries | queries | Up to 10 nonempty queries, each at most 200 characters. Resolves up to five book candidates per query. Editions may differ. |
| Include reviews | includeReviews | Defaults to true. Set false to save only book metadata. |
| Edition and work research | includeResearch | Defaults to false. Adds source-bound catalog, reference-import and work-level text-review context to book rows; no extra item fees. |
| Maximum reviews per book | maxReviewsPerBook | Integer from 0 to 100. Default 10. A cap, not a guaranteed review count. Zero saves no review rows. |
| Maximum run time | maxRunSeconds | Optional integer from 35 to 270. Values above 60 still use the hard 60-second processing ceiling. |
Duplicate book IDs from URLs and queries are processed once. There is no review sorting or pagination control: reviews follow the available page order. Proxy connections are not supported. No connection selector is needed.
For discovery, use a bounded query request:
{"queries": ["the great gatsby"],"includeReviews": false,"maxReviewsPerBook": 0}
Output data
Book rows and review rows share one dataset. Use itemType to distinguish them and bookId or bookUrl to associate reviews with books. Optional scalar fields can be null, and arrays can be empty when Goodreads does not expose the information.
Illustrative shape only, not a fresh measurement of this book:
{"itemType": "book","bookId": "41733839","bookUrl": "https://www.goodreads.com/book/show/41733839-the-great-gatsby","bookTitle": "The Great Gatsby","authors": ["F. Scott Fitzgerald"],"averageRating": null,"ratingsCount": null,"reviewsCount": null}
| Row | Available fields |
|---|---|
| Book identity | itemType, bookId, bookUrl, bookTitle, authors, authorUrls |
| Book metadata | bookDescription, genres, coverUrl, bookFormat, numberOfPages, inLanguage |
| Aggregate ratings | averageRating, ratingsCount, reviewsCount |
| Review identity and text | itemType, bookId, bookUrl, bookTitle, reviewId, reviewUrl, reviewerName, reviewerUrl, rating, reviewText |
| Visible review details | dateRead, dateAdded, likesCount, commentsCount |
Review rows require nonempty text and a review link. Dates and engagement counts are saved only when visible. Aggregate review counts do not mean that all those reviews are downloadable. Use Apify's dataset export or retrieve dataset items through the API.
The key-value store record RUN_SUMMARY reports saved rows, warnings, isolated failures and per-input empty-result reasons when available. It is not a separate review dataset.
Edition-aware catalog, reference import and work-level review research
Set includeResearch: true for a nested research object on book rows. Review rows and the existing overview/export column selection stay unchanged. This option does not fetch more reviews or add item fees.
{"bookUrls": [{ "url": "https://www.goodreads.com/book/show/5907.The_Hobbit" }],"includeReviews": false,"includeResearch": true}
edition: exact source book ID/URL, ISBN/ISBN13/ASIN, publisher, publication date and language. Missing identifiers remainnull.work: resolved work ID/URL, original title and original publication date, kept separate from edition publication.seriesresolves actual source memberships and their positions.workReviewStatistics: five source star counts and language counts for work-level text reviews, not edition readership, geography or a complete audience census.languageCoveragereports listed and unrepresented text-review counts. Missing counts staynull, not zero, and language counts are never forced to sum to 100%.- Source-populated
workSocialCounts,editionsUrl,awardsWon,charactersandplacesprovide context where present. Places are story settings, not reader locations; an editions URL is not an edition count. cslJson: an edition-bound CSL JSON reference array. Author names remain literal; unknown edition dates and identifiers are omitted rather than inferred. Original-work dates never replace edition dates.
Use a full JSON dataset export, not the existing overview view, to retain research. To import book references into Zotero or another CSL JSON-compatible manager, download JSON items as books.json, then run:
jq '[.[] | select(.itemType == "book") | .research.cslJson[]?]' books.json > references.json
Import references.json as CSL JSON using your reference manager's normal file import. This does not call an external catalog or write to a private library. See Zotero's supported standard formats.
research.source distinguishes embedded page data from first-party public metadata. research.status and limitations explain absent, malformed, wrong-edition or partial source data. Early-stopped metadata-only browser recovery may not contain that payload; useful legacy book data is retained with an explicit limitation, without waiting longer or making an extra request. For example, saved Gatsby language counts cover 133,396 of 141,052 work text reviews and Hobbit counts cover 90,830 of 96,242; these are dated source snapshots, not current totals or complete-review exports. Other fields remain available when source language coverage is partial.
Download your results
Open your run's dataset, choose Export and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.
See Apify's download and export guide for the available formats and field options.
Pricing
The start event is charged once after validation and before book lookup, including attempts with no usable books. Each saved book-metadata row and each saved review row creates a separate item event. Failed targets and skipped empty review placeholders do not create paid item rows.
Use exact URLs, small batches and low review caps. See the live Pricing tab for current rates and account discounts.
Tips for best results
- Use an exact book URL when the edition matters. Inspect candidate titles and editions before turning a search match into a catalog join.
- Choose metadata-only or review output deliberately. Disable reviews or use a zero review cap when book metadata alone is enough.
- Separate row types before counting or analyzing. One saved book and each saved text review are different rows and items.
- Keep aggregate totals apart from the collected sample. A high displayed review count does not mean all those reviews are available.
- Read per-input warnings before retrying. A legitimate no-match differs from blocking or unexpected extraction errors.
Limits and caveats
Reviews are limited to visible cards on fetched book pages, with no review sorting or pagination controls. Aggregate counts do not establish downloadable review coverage. Review rows require both nonempty text and a review link.
Queries resolve up to five candidate books each, and editions can differ. ISBN text can be used as a query without guaranteed edition matching. Dedicated ISBN lookup or ISBN output fields, private shelves, author-page crawling and complete genre or list exports are not supported.
Runs have a hard 60-second processing ceiling and an 8 MiB response-download limit, even when maxRunSeconds is set above 60. These limits can leave partial rows and warnings, with no incremental export or automatic history across runs.
A legitimate no-match query or unavailable public book page can succeed without rows, with reasons in RUN_SUMMARY. Blocking and unexpected extraction failures remain errors rather than proof of privacy or deletion. Useful records from other books are retained when safe.
Optional source values can be null or empty. Explicit includeReviews: false exports can use Goodreads' anonymous first-party metadata service to reduce transfers, including full research when includeResearch: true. This route makes one anonymous bootstrap request per run and one compact request per book; an unqualified response falls back to the established page route within the same limits. Editions that cannot preserve all selected metadata and research values use that page route. Default and review-enabled requests retain the page route. No login or proxy support is added. This is not an official or affiliated Goodreads product. Sentiment analysis and change comparisons require your own tools.
Automation and integrations
Save your settings for next time
Once you have an input that works for you, save it as an Apify task. This keeps your settings together so you can use them again without filling in the form from scratch.
Run on a schedule
Need fresh results regularly? You can schedule the Actor or a saved task to run at a time that suits you.
Each scheduled run collects the data again. If you want to compare results or highlight changes, add that step in your own workflow.
Send results to your other tools
Use n8n, Make or Zapier to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the Apify integration guides for your chosen tool.
For a custom connection, an Apify webhook can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.
API usage
Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.
The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its defaultDatasetId to fetch the results.
For setup instructions, see Apify's JavaScript client guide, Python client guide and Actor runs API reference.
cURL
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~goodreads-books-reviews-scraper/runs' \-H "Authorization: Bearer $APIFY_TOKEN" \-H 'Content-Type: application/json' \--data @- <<'JSON'{"bookUrls": [{"url": "https://www.goodreads.com/book/show/41733839-the-great-gatsby"}],"includeReviews": true,"maxReviewsPerBook": 5}JSON
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('fetch_cat/goodreads-books-reviews-scraper').call({"bookUrls": [{"url": "https://www.goodreads.com/book/show/41733839-the-great-gatsby"}],"includeReviews": true,"maxReviewsPerBook": 5});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('fetch_cat/goodreads-books-reviews-scraper').call(run_input={'bookUrls': [{'url': 'https://www.goodreads.com/book/show/41733839-the-great-gatsby'}], 'includeReviews': True, 'maxReviewsPerBook': 5})print(client.dataset(run['defaultDatasetId']).list_items().items)
API and AI-agent usage notes
The asynchronous response contains defaultDatasetId. Fetch its items after the run finishes.
MCP and AI agents
You can ask your AI assistant to collect data with Goodreads Books & Reviews Scraper and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.
Connect your assistant through the Apify MCP server. MCP gives your assistant a way to find this scraper, run it and read the results. Follow the official setup and sign-in guide for your app.
Easier setup with an Apify plugin
If you use a supported coding assistant, the official Apify plugin can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.
Use Apify AI in Console
Prefer to keep everything in Apify? Open Apify AI in Console and ask it to find Fetch Cat's Goodreads Books & Reviews Scraper. You can describe the data you want and ask questions about the results.
Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.
Choose your assistant
- Claude and Claude Code (Anthropic): Apify setup guide.
- ChatGPT and Codex (OpenAI): Apify setup guides.
- Grok Bot (xAI): Apify plugin guide.
- Gemini CLI (Google): MCP server setup guide. Use the server URL below with the HTTP configuration supported by Gemini CLI.
Connect just this scraper
To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=fetch_cat/goodreads-books-reviews-scraper"}}}
Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.
Use Apify's general server
Already connected to the general Apify MCP server at https://mcp.apify.com? You can use it to find this scraper without adding another server. Ask your assistant to use Goodreads Books & Reviews Scraper by Fetch Cat, or give it the identifier fetch_cat/goodreads-books-reviews-scraper.
Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.
Example requests
- “Use Fetch Cat’s Goodreads Books & Reviews Scraper to retrieve metadata and up to 3 visible text reviews from the existing Great Gatsby book URL. Separate book and review rows and keep source links with ratings and text.”
- “Collect metadata-only book candidates for the great gatsby query with reviews off. Show titles, authors, editions where available and book links so I can choose the intended source manually.”
- “Retrieve metadata from the 2 exact Goodreads book URLs I provide, with reviews disabled. Show available genres, cover links and aggregate ratings without claiming a complete review archive or inferring missing fields.”
Normal Apify charges apply. Check the live Pricing tab before asking your assistant to run a larger batch.
Pay with x402
If your AI agent has a funded wallet, it can pay for Apify usage through x402. This experimental option lets an agent use Apify without a conventional account.
Apify AGI provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.
Some MCP setups also support paying for each request directly. That is a different payment option, so check the official guide for its availability.
Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.
Other ways for agents to pay
Apify also supports MPP for prepaid access through AGI and Skyfire for eligible Actors. If your agent already uses one of these, see the agentic payment guide to choose the right setup.
FAQ
Can I export every review or sort by newest?
No. The Actor saves visible review cards from the fetched book page, up to your cap. It does not load all review pages or offer sort controls. Keep aggregate ratings separate from the review sample in your analysis.
Does it need a Goodreads login or access private shelves?
No login or saved cookies are required. Private shelves and login-only content are outside the product's scope. This is not an official Goodreads API or an affiliated Goodreads product.
Why are results empty, partial or missing fields?
A legitimate no-match query or an unavailable public book page can succeed without rows, with reasons in RUN_SUMMARY. Fields can be empty when Goodreads does not expose them. Blocking and unexpected extraction failures remain errors, not proof of privacy or deletion. Useful records from other books are retained when safe. Try a precise public book URL rather than a broad query, and inspect run warnings before retrying.
Can I search by ISBN?
An ISBN can be a search query, but a matching edition is not guaranteed. Inspect the returned title and book URL. Dedicated ISBN lookup and ISBN output fields are not provided.
How are costs controlled?
Start with one book and a low review cap, or set includeReviews to false. A book row and every saved review are separate items, and the start event can apply even when no rows are returned. Consult the live Pricing tab before running.
Related Actors
- Amazon Reviews Scraper — Review research for products sold on Amazon.
- Shopify App Reviews Scraper — Feedback on Shopify apps.
- Apple App Store Reviews Scraper — Reviews of iOS apps.
- Google Play Reviews Scraper — Android app feedback.
- Product Hunt Scraper — Public product-launch research.
Support and feedback
For custom additions or integrations, email hello@fetchcat.dev.
Found an error or have a feature request? Open an issue with the run URL, a non-sensitive input example and what you expected.
Need help sharing it? See Apify’s guide to sharing a run when reporting an issue. Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.
Tried this scraper? We'd love to hear how it worked for you. Leave a review to help others choose the right tool and help us improve it. Your feedback means a lot to us.
Made with care for curious people, AI agents and the possibilities in data. ♥