Goodreads Review Scraper
Pricing
Pay per usage
Goodreads Review Scraper
Goodreads review scraper that collects book reviews, star ratings, and reviewer profiles without login or authentication, giving authors and researchers clean data for sentiment analysis and competitive research.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Kawsar
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Goodreads Review Scraper: Extract Book Reviews, Ratings, and Reviewer Profiles
Goodreads Review Scraper pulls reviews from any book on Goodreads using their internal API. No login or authentication needed. Just paste in one or more book URLs, set how many reviews you want per book, and run.
You get structured data including review text, star ratings, reviewer profiles, shelf labels, and tags, ready to export as CSV or JSON for analysis.
Unlike scrapers that parse HTML, this actor talks directly to the same API Goodreads uses in its own interface, so results come back fast and in a consistent format.
Use cases
- Sentiment analysis: collect hundreds of reader reviews to train classifiers or run opinion mining on reader reactions to a book
- Author research: pull reviews for your own books or titles you compete with, and see what readers actually say
- Book recommendation engines: gather ratings and tags to power recommendation logic or similarity scoring
- Market research: analyze reader responses to new releases in a specific genre or category
- Academic research: build datasets of reader reviews for literary analysis or sociological studies
- Publishing decisions: check reader feedback on comparable titles before commissioning similar work
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
bookUrl | string | Single Goodreads book page URL. Use for one book at a time. | |
bookUrls | array | List of Goodreads book page URLs, one per line. Use for batch runs across multiple books. | |
maxReviews | integer | 100 | Maximum reviews to collect per book. Hard cap of 1000. |
timeoutSecs | integer | 300 | Overall actor timeout in seconds. |
requestTimeoutSecs | integer | 30 | Per-request timeout in seconds. |
proxyConfiguration | object | Datacenter (Anywhere) | Proxy type and location for requests. Supports Datacenter, Residential, Special, and custom proxies. Optional. |
You can use bookUrl, bookUrls, or both at the same time. Duplicate URLs are ignored.
Example: single book
{"bookUrl": "https://www.goodreads.com/book/show/3.Harry_Potter_and_the_Sorcerer_s_Stone","maxReviews": 100}
Example: multiple books
{"bookUrls": ["https://www.goodreads.com/book/show/3.Harry_Potter_and_the_Sorcerer_s_Stone","https://www.goodreads.com/book/show/5907.The_Hobbit","https://www.goodreads.com/book/show/7260188-the-hunger-games"],"maxReviews": 200}
What data does this actor extract?
The actor stores results in Apify's dataset. Each entry is one review:
{"reviewId": "kca://review:goodreads/amzn1.gr.review:goodreads.v1.tI_H8-8bJGQv1O4IIOpeTA","reviewUrl": "https://www.goodreads.com/review/show/2280609898","reviewText": "<b>4.5 Stars!</b><br /><br />Buddy read with...","reviewTextPlain": "4.5 Stars! Buddy read with the one who started it all!...","rating": 4,"createdAt": "2018-02-01T20:15:18+00:00","updatedAt": "2021-02-19T16:45:57+00:00","lastRevisionAt": "2018-03-20T18:24:36+00:00","spoilerStatus": false,"likeCount": 114,"commentCount": 17,"recommendFor": null,"userId": 44125660,"userName": "Beth","userUrl": "https://www.goodreads.com/user/show/44125660-beth","userImageUrl": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/users/...","isAuthor": false,"userFollowersCount": 627,"userTextReviewsCount": 929,"shelfName": "read","shelfDisplayName": "Read","shelfUrl": "https://www.goodreads.com/review/list/44125660?shelf=read","tags": ["2018-reads", "audiobook", "book-series", "4-stars", "young-adult-fantasy"],"workId": "kca://work/amzn1.gr.work.v1.TbpxJa2CwiSSz_9W2FruoA","scrapedAt": "2025-01-15T10:30:00+00:00"}
| Field | Type | Description |
|---|---|---|
reviewId | string | Unique review identifier |
reviewUrl | string | Direct link to the review |
reviewText | string | Full review text with HTML markup |
reviewTextPlain | string | Review text with HTML stripped |
rating | integer | Star rating (1 to 5, or null if no rating given) |
createdAt | string | When the review was first posted |
updatedAt | string | When the review was last updated |
lastRevisionAt | string | When the review text was last revised |
spoilerStatus | boolean | Whether the review is flagged as a spoiler |
likeCount | integer | Number of likes |
commentCount | integer | Number of comments |
recommendFor | string | Who the reviewer recommends the book for, if set |
userId | integer | Reviewer's numeric ID |
userName | string | Reviewer's display name |
userUrl | string | Link to the reviewer's profile |
userImageUrl | string | Reviewer's profile picture URL |
isAuthor | boolean | Whether the reviewer is a published author on Goodreads |
userFollowersCount | integer | How many followers the reviewer has |
userTextReviewsCount | integer | Total reviews written by the reviewer |
shelfName | string | Shelf slug (e.g. read, currently-reading) |
shelfDisplayName | string | Human-readable shelf name (e.g. Read) |
shelfUrl | string | Link to the reviewer's shelf |
tags | array | Custom shelf tags applied by the reviewer |
workId | string | The book's internal Goodreads identifier |
scrapedAt | string | When this review was collected |
How it works
- The actor fetches each book page URL and extracts the internal book identifier from the page
- It then calls the Goodreads API using cursor-based pagination to collect reviews page by page
- Each page returns up to 30 reviews; the actor keeps fetching until it hits your
maxReviewslimit or runs out of reviews - For batch runs, the actor processes each book in order and pushes all results into the same dataset
- Each review is pushed to the dataset as it arrives
FAQ
Do I need a Goodreads account to use this? No. The actor requires no login or personal credentials.
How many reviews can I collect per run?
Up to 1000 per book. If you pass 5 book URLs with maxReviews: 200, you can collect up to 1000 reviews total in that run.
Does this work for all books on Goodreads? It works for any book with publicly visible reviews on Goodreads.
Integrations
Connect Goodreads Review Scraper with other apps using Apify integrations. You can pipe results into Google Sheets, send notifications via Slack, trigger workflows in Make or Zapier, or sync with Airbyte. You can also use webhooks to trigger actions as soon as results are ready.