Goodreads Books & Reviews Scraper avatar

Goodreads Books & Reviews Scraper

Pricing

from $0.60 / 1,000 book or review items

Go to Apify Store
Goodreads Books & Reviews Scraper

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

Hanna Nosova

Hanna Nosova

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

10 days ago

Last modified

Share

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 bookTitle, 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?

CategoryExample fields
Book identitybookId, bookUrl, bookTitle
Author dataauthors, authorUrls
MetadatabookDescription, genres, coverUrl, bookFormat, numberOfPages, inLanguage
RatingsaverageRating, ratingsCount, reviewsCount
ReviewsreviewId, reviewUrl, reviewerName, reviewerUrl, rating, reviewText
EngagementlikesCount, commentsCount

Pricing

This Actor uses Apify pay-per-event pricing. The prices below come from the current Actor pricing configuration. Apify public plans map to Store discount tiers, so the table shows both the user-facing plan context and the pricing tier name. The final price shown in Apify depends on the user account plan and any custom agreement.

EventWhat is chargedPrice
startOne-time fee per run$0.005
EventWhat is chargedFree / no discountStarter / BronzeScale / SilverBusiness / GoldCustom / PlatinumCustom / Diamond
itemPer book metadata row or reader review row produced$1.15 / 1,000$1 / 1,000$0.78 / 1,000$0.6 / 1,000$0.4 / 1,000$0.28 / 1,000

Each saved dataset row is one billable item: a book metadata row and each saved reader review row are charged separately. Apify may also charge platform usage for compute, storage, proxies, or data transfer outside this Actor pricing. Check the Actor run and the Apify Pricing tab for the exact cost shown to your account.

Quick start

  1. Open the actor on Apify.

  2. Add one or more Goodreads book URLs.

  3. Optionally add search queries such as the great gatsby.

  4. Choose whether to include reviews.

  5. Set maxReviewsPerBook.

  6. Run the actor.

  7. Download the dataset as JSON, CSV, Excel, or through the API.

Input example

Use this compact direct-book request for a first run:

{
"bookUrls": [{ "url": "https://www.goodreads.com/book/show/41733839-the-great-gatsby" }],
"includeReviews": true,
"maxReviewsPerBook": 5
}

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 settings

FieldTypeDescription
bookUrlsarrayGoodreads book pages to scrape
queriesarrayGoodreads book searches to resolve
includeReviewsbooleanSave public review rows
maxReviewsPerBookintegerReview cap per book page
maxRunSecondsintegerOptional 35–270 second safety budget; saved rows remain available when the actor stops before the deadline
proxyConfigurationobjectOptional Apify Proxy settings

Output example

{
"itemType": "book",
"bookId": "41733839",
"bookUrl": "https://www.goodreads.com/book/show/41733839-the-great-gatsby",
"bookTitle": "The Great Gatsby",
"authors": ["F. Scott Fitzgerald"],
"averageRating": 3.93,
"ratingsCount": 6067294,
"reviewsCount": 136391
}

Output fields

Book rows use itemType, bookId, bookUrl, bookTitle, authors, bookDescription, genres, averageRating, ratingsCount, reviewsCount, coverUrl, bookFormat, numberOfPages, and inLanguage. Review rows use itemType, bookId, bookUrl, bookTitle, reviewId, reviewUrl, reviewerName, reviewerUrl, rating, reviewText, dateRead, dateAdded, likesCount, and commentsCount.

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

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);

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'])

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

Claude Code setup:

$claude mcp add apify --transport http https://mcp.apify.com

Claude Desktop-compatible configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com"
}
}
}

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.

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.

FAQ

Can I scrape private Goodreads shelves?

No. This actor is for public book pages and public review content only.

The first version focuses on visible public review cards with a per-book cap. Use reasonable caps for cost control.

Can I search by ISBN?

If Goodreads autocomplete resolves the ISBN query to a public book page, the actor can scrape that page.

Does it require a Goodreads account?

No account is required for the public data targeted by this actor.

Support

If a run fails or returns unexpected public book data, open an issue from the Actor page and include the Apify run ID or run URL, input JSON, expected output, actual output, and one reproducible public URL.

Privacy and data handling

This Actor only requests the permissions needed to run the input you provide. It uses your input (such as URLs, search terms, identifiers, filters, and limits) only to fetch the requested public data from the relevant source site or API for this Actor, then writes results to your Apify dataset/key-value store.

Data may pass through Apify platform services and Apify Proxy during the run, and requests are sent only to the target site or public data provider required for this Actor's results. FetchCat does not send your inputs or outputs to advertising networks, data brokers, or model-training services, and does not retain run data outside Apify storage after the run except when you explicitly share run details for transient support debugging.

You are responsible for using this Actor lawfully, respecting the target site's terms, and avoiding unnecessary personal or sensitive data in inputs. Review the output before storing, sharing, or combining it with other data.