
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape Goodreads books by keyword or from book, Listopia list, shelf, genre, series and author URLs. Get title, authors, rating, rating distribution, ratings and reviews counts, genres, pages, publish dates, ISBN, series, awards, description and cover, plus optional reviews. No login needed.
Turn Goodreads into a clean books dataset. Paste a search term, a Listopia list, a genre, a shelf, a series or an author page and get every book with its rating, rating distribution, ratings and reviews counts, genres, page count, publish dates, ISBNs, series, awards, description and cover, plus optional community reviews. No login, no API key, and it costs a fraction of a cent per book.
| Field | What it does |
|---|---|
startUrls | Goodreads book, search, list, shelf, genre, series or author URLs |
searchTerms | Keywords, titles, authors or ISBNs to search |
maxItems | Maximum books in total (0 = no limit) |
endPage | Stop each list or search at this page number |
includeReviews | Add reviews to each book |
maxReviewsPerBook | Reviews per book (0 = up to 5,000) |
reviewsSort | DEFAULT, NEWEST or OLDEST |
reviewsMinRating / reviewsMaxRating | Star range for reviews (1-5) |
reviewsLanguage | 2-letter language code for reviews, e.g. en |
reviewsSearchText | Only reviews that mention this text |
proxyConfiguration | Proxy settings (datacenter by default) |
{
"startUrls": [
"https://www.goodreads.com/list/show/1362.Best_History_Books_",
"https://www.goodreads.com/author/list/1221698.Neil_Gaiman",
"https://www.goodreads.com/book/show/5.Harry_Potter_and_the_Prisoner_of_Azkaban"
],
"searchTerms": ["dune"],
"maxItems": 100,
"includeReviews": true,
"maxReviewsPerBook": 50,
"reviewsSort": "NEWEST"
}
Supported URL types:
https://www.goodreads.com/book/show/5.Harry_Potter_and_the_Prisoner_of_Azkabanhttps://www.goodreads.com/search?q=dunehttps://www.goodreads.com/list/show/1362.Best_History_Books_https://www.goodreads.com/genres/business and https://www.goodreads.com/genres/most_read/businesshttps://www.goodreads.com/shelf/show/fictionhttps://www.goodreads.com/series/45175-harry-potterhttps://www.goodreads.com/author/show/1221698.Neil_Gaiman or https://www.goodreads.com/author/list/1221698.Neil_Gaiman (all of the author's books)One dataset row per book. The Books table shows the main columns, Book details shows publishing data, and Reviews shows one row per review.
| Field | Description |
|---|---|
bookId, url, workId | Goodreads IDs and book URL |
title, titleComplete, originalTitle | Titles (complete title includes the series) |
authorName, authorUrl, authorAbout, authors | Primary author with bio, plus all contributors and their roles |
rating, numberOfRatings, numberOfReviews | Average rating and counts |
ratingDistribution | Number of 1, 2, 3, 4 and 5 star ratings |
genres | Top genres, most voted first |
series, seriesName, seriesPosition | Series membership |
description, descriptionHtml | Book description as plain text and as HTML |
bookFormat, numberOfPages, publishedBy, language | Edition details |
publishedDate, firstPublishedDate | Edition and first publication date (YYYY-MM-DD) |
isbn, isbn13, asin | Identifiers |
awards | Awards with category, year and WINNER / NOMINEE |
characters, places, quotesCount | Story details |
image, buyLinks, editionsUrl | Cover image and store links |
sourceUrl, scrapedAt | Which input found the book, and when |
reviews | Reviews when enabled: reviewerName, rating, text, html, date, likes, comments, shelves, isSpoiler |
Example (shortened; the reviewer is a made-up sample):
{
"bookId": 5,
"url": "https://www.goodreads.com/book/show/5.Harry_Potter_and_the_Prisoner_of_Azkaban",
"title": "Harry Potter and the Prisoner of Azkaban",
"titleComplete": "Harry Potter and the Prisoner of Azkaban (Harry Potter, #3)",
"image": "https://m.media-amazon.com/images/S/compressed.photo.goodreads.com/books/1630547330i/5.jpg",
"authorName": "J.K. Rowling",
"authorUrl": "https://www.goodreads.com/author/show/1077326.J_K_Rowling",
"authors": [
{"name": "J.K. Rowling", "role": "Author", "id": 1077326, "url": "https://www.goodreads.com/author/show/1077326.J_K_Rowling"},
{"name": "Mary GrandPré", "role": "Illustrator", "url": "https://www.goodreads.com/author/show/2927.Mary_GrandPr_"}
],
"rating": 4.58,
"numberOfRatings": 5071996,
"numberOfReviews": 110476,
"ratingDistribution": {"1": 31714, "2": 48921, "3": 341981, "4": 1170280, "5": 3479100},
"genres": ["Fantasy", "Fiction", "Young Adult", "Magic", "Childrens"],
"seriesName": "Harry Potter",
"seriesPosition": "3",
"description": "Harry Potter, along with his best friends, Ron and Hermione, is about to start his third year at Hogwarts...",
"bookFormat": "Mass Market Paperback",
"numberOfPages": 547,
"publishedDate": "2004-05-01",
"firstPublishedDate": "1999-07-08",
"publishedBy": "Scholastic Inc.",
"isbn": "043965548X",
"isbn13": "9780439655484",
"language": "English",
"awards": [
{"name": "Hugo Award", "category": "Best Novel", "year": "2000", "designation": "NOMINEE", "url": "https://www.goodreads.com/award/show/9-hugo-award"}
],
"quotesCount": 982,
"reviews": [
{
"reviewId": "a1b2c3d4-0000-4000-8000-000000000000",
"reviewerName": "Sample Reader",
"reviewerIsAuthor": false,
"rating": 5,
"text": "The best book in the series. The time-travel twist still gets me.",
"date": "2026-09-01T18:22:05Z",
"likes": 12,
"comments": 1,
"isSpoiler": false,
"shelves": ["read", "favorites"]
}
],
"reviewsMatchingFilters": 110150,
"scrapedAt": "2026-10-15T03:40:00Z"
}
You pay $1.00 per 1,000 books ($0.001 per book), plus a small amount of platform usage (compute and datacenter proxy traffic). Reviews are included in the book price, so a book with 50 reviews costs the same event fee as a book without them; they only add a little compute time.
Example: 1,000 books from a Listopia list cost about $1.00 in book fees plus a few cents of usage.
Is it legal to scrape Goodreads? The scraper reads only public pages and public data that anyone can see without logging in. You are responsible for how you use the data; check Goodreads' terms and the privacy rules that apply to you, especially for review text.
Do I need a Goodreads account or proxy? No. No login is needed, and datacenter proxies are used by default. Switch to residential proxies only if you see repeated blocks.
How many books can I get? Lists and author pages are followed to the end. Goodreads shows at most 2,000 results per search term (100 pages), so use several specific terms for more. Shelf pages show 50 books and genre "most read" pages 100 without a login.
Why is a field empty?
Goodreads does not have every field for every book, for example ISBNs for some ebooks or awards for most titles. Empty fields are null or an empty list.
Can I schedule runs or use the API? Yes. Schedule the scraper to track ratings over time, or call it through the API and read the dataset as JSON, CSV or Excel.
Moving from another Goodreads scraper?
The main fields keep familiar names (bookId, title, authorName, rating, numberOfRatings, numberOfReviews, numberOfPages, publishedBy, buyLinks). Dates are ISO (YYYY-MM-DD), and fields such as ISBN, Series and Literary Awards are now isbn, series and awards.
html copy is dropped first and the list is shortened only if a single book row would still be too large to store (reviewsTruncated: true).Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalGoodreads URLs
Book, search, Listopia list, shelf, genre, series or author URLs from goodreads.com. Listing pages are followed page by page and every book on them is scraped.
searchTermsarrayOptionalSearch terms
Keywords, titles, authors or ISBNs to search on Goodreads. Each term returns up to 2,000 books (Goodreads' own limit).
maxItemsintegerOptionaldefault 20Maximum books
Maximum number of books to save in total across all inputs. Set 0 for no limit.
How far to follow search results, lists, shelves and author pages.
endPageintegerOptionalLast listing page
Stop each search or list at this page number (1 = first page only). Leave empty to follow all pages.
Optional community reviews, saved inside each book.
includeReviewsbooleanOptionaldefault falseInclude reviews
Add community reviews (text, rating, date, likes, shelves, reviewer display name) to every book.
maxReviewsPerBookintegerOptionaldefault 30Maximum reviews per book
How many reviews to add per book (0 = as many as possible, up to 5,000). At most 5,000, because the reviews are stored inside the book row, which is kept under 4 MB (longer review lists are cut and marked reviewsTruncated).
reviewsSortenumOptionaldefault "DEFAULT"Sort reviews by
Order in which reviews are collected.
reviewsMinRatingintegerOptionalMinimum review rating
Only reviews with at least this many stars (1-5).
reviewsMaxRatingintegerOptionalMaximum review rating
Only reviews with at most this many stars (1-5).
reviewsLanguagestringOptionalReview language
Only reviews in this language, as a 2-letter code (en, es, de, ...). Leave empty for all languages.
reviewsSearchTextstringOptionalReviews containing
Only reviews that mention this text.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies are used by default.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| bookId | integer | null | Goodreads book ID |
| url | string | null | Book page URL |
| title | string | null | Book title |
| authorName | string | null | Primary author |
| rating | number | null | Average rating (1-5) |
| numberOfRatings | number | null | Number of ratings |
| numberOfReviews | number | null | Number of text reviews |
| reviews | array | null | Reviews (when enabled) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Book | One Goodreads book saved to the dataset (reviews included). | $0.001 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('echofield/goodreads-scraper').call({
"startUrls": [
"https://www.goodreads.com/list/show/1362.Best_History_Books_",
"https://www.goodreads.com/book/show/5.Harry_Potter_and_the_Prisoner_of_Azkaban"
],
"searchTerms": [
"dune"
],
"maxItems": 20,
"maxReviewsPerBook": 30,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run echofield/goodreads-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=echofield/goodreads-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Search Goodreads books by title or author.
Books from a Goodreads list link.
A book's details with its latest reader reviews.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.