Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Goodreads Books Scraper icon

Goodreads Books Scraper

Search Goodreads and get books as clean rows: title, author, average rating, ratings count, edition year, cover image and link. No API key needed.

53 runs on Apify $0.00114 per book ($1.14 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust queries, searchField, maxItems (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.00114 per book = $1.14 per 1,000

You are charged forWhenPrice
Book scrapedOne book with its rating and ratings count. Searches that match nothing are never charged.$0.00114

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.

Inputs

FieldWhat it doesType
queriesBook titles, author names or plain keywords to search Goodreads for. Up to 20 per run. Each term is searched in turn until the run reaches the row limit below.array
searchFieldWhich part of a book to match on. 'Everything' is Goodreads' own default and mixes titles, authors and series. 'Title only' and 'Author only' return genuinely different sets - searching 'christie' as an author gives you Agatha Christie's novels, as a title it gives books with Christie in the name.string
maxItemsTotal number of books to return across all search terms. The budget is shared evenly between the terms, so four terms and 40 rows gives you ten of each. Keep it low while you are testing - you pay per row.integer
proxyUrlsLeave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port.array

What you get

A structured dataset — each result includes fields like:

querytitleauthoravgRatingratingsCountpublishedYeareditionPublishedYearurlcoverUrleditionsCountbookIdsearchFieldrank

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

OpenAlex Scholarly Works Scraper

Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

Crossref Scholarly Works Scraper

Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.

2 use cases

See all Developer & Research Tools →

Goodreads Books Scraper: search results as rows, with ratings and counts

Type a title, an author or a plain keyword and get Goodreads search results back as rows. Title, author, average rating, how many people rated it, the year of the edition Goodreads lists, the full-size cover and the book link.

What it gives you is the search listing, not the book page. That means ratings and counts, and it means no blurb, no ISBN, no genres and no reviews. The listing also does not show a book's first publication year or its edition count, so those two columns are always empty.

InputTitles, authors or keywords, up to 20 per run
OutputOne row per book
Ceiling2,000 books per run
Account neededNone, no API key, no browser
Price$1.14 per 1,000 books, flat on every plan

📚 What Goodreads Books Scraper does

It runs each of your search terms and pages through the results until it has your share of the row budget. The budget is split evenly between terms, so four terms and 40 rows gives you ten of each rather than 40 of the first one.

searchField changes the answer more than it looks. Searching christie as an author gives you Agatha Christie's novels. The same word as a title gives you books with Christie in the name. Those are genuinely different result sets, not the same set reordered.

Two things it refuses to bill you for. A book Goodreads lists without a rating is skipped, because a row with no rating is the thing you came for missing. And "Goodreads looked and found nothing" is a real answer, kept separate from "the request never got through", so a term that genuinely has no matches costs nothing per row.

Goodreads serves 20 books per search page, and its deep pages start handing back books you have already seen. Paging stops at 50 pages per term, which is past where distinct results ran out in testing.

📥 What you give it

{
  "queries": ["dune", "project hail mary"],
  "searchField": "all",
  "maxItems": 20
}
FieldWhat the run uses if you leave itWhat it is
queriesbox starts at dune and project hail maryTitles, author names or keywords, one per line, up to 20. Each is searched in turn.
searchFieldallall is Goodreads' own default and mixes titles, authors and series. title and author return different sets.
maxItems20Total books across every term, up to 2,000, shared evenly between them. This is also your spending cap.
proxyUrlsnoneOptional. Your own servers, one URL per line as http://user:pass@host:port.

📤 What you get back

A real row from a recent run:

{
  "ok": true,
  "charged": true,
  "recordType": "book",
  "query": "dune",
  "searchField": "all",
  "rank": 1,
  "bookId": "44767458",
  "title": "Dune (Dune, #1)",
  "author": "Frank Herbert",
  "avgRating": 4.29,
  "ratingsCount": 1712265,
  "publishedYear": null,
  "editionPublishedYear": 2019,
  "editionsCount": null,
  "url": "https://www.goodreads.com/book/show/44767458",
  "coverUrl": "https://m.media-amazon.com/images/S/compressed.photo.goodreads.com/books/1555447414i/44767458.jpg",
  "scrapedAt": "2026-09-26T13:16:35.247Z"
}
FieldWhat it is
bookIdGoodreads' own id for the work. Stable, so use it to dedupe across runs.
avgRating, ratingsCountThe average out of five and how many ratings it is built on. Every delivered row has both.
editionPublishedYearThe year the edition Goodreads lists was published. For a reissue that is the reissue's year (2019 for the Dune above), not the year the book first came out.
publishedYear, editionsCountAlways null. The search listing does not show the first publication year or the edition count. The columns stay so anything built on them keeps working.
titleAs listed, series marker and all, like Dune (Dune, #1).
coverUrlThe full-size cover image on Goodreads' own servers.
query, searchField, rankWhich term found it, how it was searched, and its position in those results.

🧾 Reading the output

Three kinds of row can land in your dataset, and recordType tells them apart.

RowHow to spot itCharged
A bookrecordType: "book"yes
The sample row_sample: true, recordType: "sample"no
A diagnostic_diagnostic: true and an errorCodeno

The charged field is a label, not a receipt. It is stamped when the row is built, before billing happens, so read it the way you read recordType: it separates real books from sample and diagnostic rows, nothing more.

CodeWhat it means
NO_RESULTSGoodreads has nothing matching that term. A real answer, and nothing was charged for it.
ROW_INCOMPLETEA book was listed without a rating, so it was skipped rather than delivered. Not charged.
TIME_BUDGETThe run ran out of time before reaching a term. Everything already delivered is complete.
BLOCKEDGoodreads refused that request after the run had already retried it. Re-run, or supply your own servers in proxyUrls.
NETWORKGoodreads was unreachable. Re-run it.
PROXY_INPUT_ADJUSTEDA network setting in your input was not usable, so the run used its own.
CHARGE_ERRORBilling could not be recorded for some rows. Rare, and worth telling us about.

One bad term never stops the others, and a diagnostic row never fails the run.

▶️ How to run it

1. Open Goodreads Books Scraper and click Try for free. 2. Put one term per line into Search terms. 3. Pick Search in if you want author-only or title-only matching. 4. Set Maximum rows. Start at 20 to see the shape of the output. 5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$1.14 per 1,000 books. Flat on every Apify plan, no volume tiers.

You pay per book row delivered. Duplicates across terms, books skipped for having no rating, the sample row, diagnostic rows and a term that finds nothing are all free.

💡 What people use it for

  • Checking how an author's back catalogue is rated, by searching them with searchField set to

author and sorting on ratingsCount.

  • Building a shortlist for a reading list or a shop buy, where avgRating alone is misleading and

ratingsCount is the number that matters.

  • Watching how a new release accumulates ratings week by week, scheduled and deduped on bookId.
  • Resolving a messy list of titles to real Goodreads links and ids before enriching it elsewhere.
  • Pulling cover images at full size for a catalogue page.

🚧 What it does not do

  • Search results only. No blurb, no ISBN, no genres, no page count, no publisher.
  • No reviews and no reviewer data. Only the rating average and the count.
  • No user shelves, no lists, no author pages, and nothing that needs a Goodreads login.
  • Books with no rating are skipped, so a very obscure or just-announced title may not appear.
  • 50 pages per term. Goodreads' deep pages repeat, so a single term will not yield thousands of

distinct books however high you set maxItems.

  • No first publication year and no edition count. editionPublishedYear is the year of the

edition the listing shows, which for a classic can be decades after it first came out.

  • Relevance order is Goodreads', applied before paging, so asking for 20 gives you the 20 it

serves first.

  • Rows are a snapshot. Ratings move daily, and scrapedAt records when they were read.

🧭 Which book or title scraper do you need?

If you wantUse
Goodreads search results with ratingsThis one
ISBN, publisher, page count and categoriesBooks Scraper
Films and TV with critic scoresRotten Tomatoes Scraper
IMDb ids for titles and peopleIMDb Search Scraper

❓ Questions people ask

Do I need a Goodreads account or an API key? Neither. Goodreads closed its public API years ago; this reads the public search pages instead.

Can I get the book description or the ISBN? Not from here. Books Scraper covers ISBN, publisher and page count.

Why do author and title searches give different books? Because they are different searches. author matches the writer, title matches words in the name of the book.

Why did I get fewer rows than I asked for? Either the terms ran out of distinct results, or some books had no rating and were skipped. The diagnostic rows say which.

Can I search 20 authors in one run? Yes, one per line, and the row budget splits evenly between them.

Is scraping Goodreads legal? These are public catalogue pages. Author names are personal data under GDPR, so have a reason for collecting them. Apify's write-up on scraping and the law is a sensible starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the run ID and the search term you used. The errorCode on the diagnostic row usually names the problem on its own.