Extract public Goodreads book metadata, aggregate ratings, and reader reviews from Goodreads book URLs or search queries.
What does Goodreads Books & Reviews Scraper do?
Goodreads Books & Reviews Scraper collects structured data from public Goodreads book pages.
It can save book metadata rows and public review rows in the same dataset.
Use it when you need book-market signals without manually copying Goodreads pages.
Who is it for?
馃摎 Publishers can monitor reader reaction to backlist and frontlist titles.
鉁嶏笍 Authors can analyze public review themes around comparable books.
馃彨 Libraries can enrich catalog analysis with ratings and public reader feedback.
馃搱 Market researchers can compare reader sentiment across genres and authors.
馃洅 Book marketers can build review exports for campaign planning.
Why use this Goodreads scraper?
It accepts direct Goodreads book URLs for precise targeting.
It also accepts search queries and resolves matching public book pages.
It returns clean fields such as title, authors, ratings, review counts, reviewer names, review text, and visible engagement counts.
It is designed with low default limits so first test runs stay inexpensive.
What Goodreads data can you extract?
| Category | Example fields |
|---|---|
| Book identity | bookId, bookUrl, title |
| Author data | authors, authorUrls |
| Metadata | description, genres, coverUrl, bookFormat, numberOfPages, inLanguage |
| Ratings | averageRating, ratingsCount, reviewsCount |
| Reviews | reviewId, reviewUrl, reviewerName, reviewerUrl, rating, reviewText |
| Engagement | likesCount, commentsCount |
Quick start
Open the actor on Apify.
Add one or more Goodreads book URLs.
Optionally add search queries such as
the great gatsby.Choose whether to include reviews.
Set
maxReviewsPerBook.Run the actor.
Download the dataset as JSON, CSV, Excel, or through the API.
Input: Goodreads book URLs
Use bookUrls when you already know the exact Goodreads pages.
Example:
{
"bookUrls": [
{ "url": "https://www.goodreads.com/book/show/41733839-the-great-gatsby" }
],
"includeReviews": true,
"maxReviewsPerBook": 10
}
Input: search queries
Use queries when you want the actor to find matching public Goodreads books first.
Example:
{
"queries": ["the great gatsby"],
"includeReviews": true,
"maxReviewsPerBook": 5
}
Input options
| Field | Type | Description |
|---|---|---|
bookUrls |
array | Goodreads book pages to scrape |
queries |
array | Goodreads book searches to resolve |
includeReviews |
boolean | Save public review rows |
maxReviewsPerBook |
integer | Review cap per book page |
proxyConfiguration |
object | Optional Apify Proxy settings |
Output example
{
"itemType": "book",
"bookId": "41733839",
"bookUrl": "https://www.goodreads.com/book/show/41733839-the-great-gatsby",
"title": "The Great Gatsby",
"authors": ["F. Scott Fitzgerald"],
"averageRating": 3.93,
"ratingsCount": 6067294,
"reviewsCount": 136391
}
Review output example
{
"itemType": "review",
"bookId": "41733839",
"bookTitle": "The Great Gatsby",
"reviewerName": "Nataliya",
"rating": 5,
"reviewText": "Public review text visible on Goodreads..."
}
Tips for better results
Use direct Goodreads book URLs when accuracy matters most.
Keep maxReviewsPerBook low while testing.
Run several smaller jobs instead of one very large exploratory job.
Use query mode for discovery, then re-run with selected direct URLs.
Disable reviews when you only need metadata and aggregate ratings.
Integrations
Send exported Goodreads review data to Google Sheets for editorial review.
Load CSV exports into Airtable to tag books by genre, rating, and sentiment.
Push JSON results into a warehouse for trend dashboards.
Connect the actor to Make or Zapier through Apify webhooks.
Use Apify API clients to schedule recurring monitoring of selected titles.
API usage with Node.js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('YOUR_USERNAME/goodreads-books-reviews-scraper').call({
bookUrls: [{ url: 'https://www.goodreads.com/book/show/41733839-the-great-gatsby' }],
includeReviews: true,
maxReviewsPerBook: 5,
});
console.log(run.defaultDatasetId);
API usage with Python
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('YOUR_USERNAME/goodreads-books-reviews-scraper').call(run_input={
'queries': ['the great gatsby'],
'includeReviews': True,
'maxReviewsPerBook': 5,
})
print(run['defaultDatasetId'])
API usage with cURL
curl -X POST 'https://api.apify.com/v2/acts/YOUR_USERNAME~goodreads-books-reviews-scraper/runs?token=APIFY_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"queries":["the great gatsby"],"includeReviews":true,"maxReviewsPerBook":5}'
MCP usage
Use this actor from Claude Desktop or Claude Code through the Apify MCP server.
MCP URL pattern:
https://mcp.apify.com/?tools=YOUR_USERNAME/goodreads-books-reviews-scraper
Example prompt:
Run the Goodreads Books & Reviews Scraper for The Great Gatsby and summarize recurring reader complaints from the first 20 reviews.
Data quality notes
Goodreads page layouts can vary by book.
Some fields may be null when Goodreads does not show them publicly.
Review dates and engagement counts are saved only when visible on the public page.
Search queries may return several matching editions.
Legal and ethical use
This actor extracts publicly available Goodreads pages.
You are responsible for using the results in line with applicable laws, Goodreads terms, and privacy rules.
Do not use scraped data for spam, harassment, or invasive profiling.
Respect reasonable limits and avoid unnecessary high-volume runs.
Troubleshooting: no results
Check that the Goodreads URL is public and starts with /book/show/.
Try a direct book URL instead of a broad query.
Lower the review cap and run again.
If your network is blocked, enable Apify Proxy in the input.
Troubleshooting: missing reviews
Some books show fewer public review cards than their aggregate review count.
Goodreads may personalize, paginate, or hide parts of the review list.
The actor saves public review cards visible in the fetched page.
Support
If a run does not produce the expected public book data, share the run URL and the input so we can investigate.