Goodreads Reviews API — Reader Reviews with Filters

Read a book’s reviews

Reader reviews of a book in Goodreads’ popular order, or newest or oldest first, filtered by stars, language or words in the text. Each review has its rating, full text, dates, likes, comment count, the reader’s shelf and tags, and the reviewer. Up to 300 in one request, continuing with a cursor. 1 credit per 30 reviews returned.

POST /book-reviews Reviews
https://api.fetchlayer.dev/goodreads/book-reviews
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

book integer | string required

The book: a Goodreads book id (5907), a book URL (https://www.goodreads.com/book/show/5907), or an ISBN-10/ISBN-13.

sort string optional

popular (Goodreads’ own ranking), newest or oldest. (default: popular)

rating integer optional

Only reviews with this star rating (1–5).

language string optional

Only reviews in this language (a code like en, es, de, zh-TW). book-detail lists the languages a book has reviews in.

search string optional

Only reviews whose text contains these words (up to 100 characters).

scope string optional

Reviews of every edition (all_editions) or of this edition only (this_edition). (default: all_editions)

limit integer optional

How many reviews to return, 1–300; a larger value is served at 300. Billed at 1 credit per 30 reviews returned, so 30 is 1 credit and 100 is 4. (default: 30)

cursor string optional

The nextCursor from a previous response, passed back with the same other parameters, to continue where it stopped.

format string optional

json or markdown, lowercase; any other value is a 400. Over MCP, markdown returns the result rendered as text; the REST API accepts it and returns JSON. (default: json)

timeoutMs number optional

Per-request time limit in milliseconds (max 600000).

Response Fields

book-reviews

Read a book’s reviews

transport string

The data source: always the platform id, "goodreads".

notes string[]

Caveats about this response you can act on, such as a series listing fewer works than its total. Empty when there are none.

book object

{ id, workId, title, url } of the book.

scope string

The scope served.

sort string

The order served.

filters object

{ rating, language, search } as applied; null for a filter not used.

reviewCount number

Reviews in this response, which sets the cost: 1 credit per 30.

reviews object[]

The reviews, in the order requested.

reviews[].id string

The review id; pass it to review-comments.

reviews[].url string | null

Link to the review on goodreads.com.

reviews[].rating number | null

Stars given, 1–5; null for a review without a rating.

reviews[].text string

The review as plain text; textHtml keeps its formatting.

reviews[].createdAt string | null

When it was written (ISO 8601); updatedAt is the last edit.

reviews[].hasSpoilers boolean

Whether the reader marked it as containing spoilers.

reviews[].likes number | null

Likes on the review.

reviews[].comments number | null

How many comments it has; review-comments reads them.

reviews[].shelf string | null

The reader’s shelf for the book, e.g. read or currently-reading.

reviews[].tags string[]

The reader’s own shelves and tags for the book.

reviews[].preReleaseSource string | null

Where the reader got an advance copy, when the review says so.

reviews[].reviewer object

{ id, name, url, imageUrl, isAuthor, reviewCount, followers } for the reader.

totalCount number | null

How many reviews Goodreads has for this request in all, when it says.

nextCursor string | null

Pass back as cursor, with the same other parameters, to continue. null when there is nothing further.

hasNextPage boolean

Whether more reviews remain.

pagesScraped number

Pages of results this response covers. Reviews are billed on reviewCount instead.

Request

curl -X POST "https://api.fetchlayer.dev/goodreads/book-reviews" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"book":5907,"sort":"popular","limit":5}'

Response

{
  "transport": "goodreads",
  "notes": [],
  "book": {
    "id": 5907,
    "workId": 1540236,
    "title": "The Hobbit, or There and Back Again",
    "url": "https://www.goodreads.com/book/show/5907.The_Hobbit_or_There_and_Back_Again"
  },
  "scope": "all_editions",
  "sort": "popular",
  "filters": {
    "rating": null,
    "language": null,
    "search": null
  },
  "totalCount": 95956,
  "reviewCount": 5,
  "reviews": [
    {
      "id": "kca://review:goodreads/amzn1.gr.review:goodreads.v1.K57x5TdipsgcUAYo53Udhg",
      "url": "https://www.goodreads.com/review/show/36953286",
      "rating": 5,
      "text": "In a hole in the ground there lived a hobbit.\n\nBooks exist in time and place and our experience of them is affected by the specific time and place in which we encounter them. Sometimes an uplifting or inspiring book can…",
      "textHtml": "<blockquote>\n  <b>In a hole in the ground there lived a hobbit.</b>\n</blockquote>Books exist in time and place and our experience of them is affected by the specific time and place in which we encounter them. Sometimes a…",
      "createdAt": "2008-11-05T15:18:37.000Z",
      "updatedAt": "2026-10-23T05:36:45.147Z",
      "hasSpoilers": false,
      "likes": 927,
      "comments": 155,
      "shelf": "read",
      "tags": [
        "all-time-favorites-fiction"
      ],
      "preReleaseSource": null,
      "reviewer": {
        "id": 1526851,
        "name": "Will Byrnes",
        "url": "https://www.goodreads.com/user/show/1526851-will-byrnes",
        "imageUrl": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/users/1291462190i/1526851._UX200_CR0,50,200,200_.jpg",
        "isAuthor": false,
        "reviewCount": 1373,
        "followers": 121527
      }
    }
  ],
  "nextCursor": "NDc0MDIsMTI5MTU4NTUwNzAwMA",
  "hasNextPage": true,
  "pagesScraped": 1
}
Product overviewGoodreads API: what it returns, pricing and use cases