{
  "data": {
    "id": "SE0siaqd22MLHJstA",
    "actId": "G16n73DmJWBnyen2O",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-10-28T11:16:45.855Z",
    "finishedAt": "2026-10-28T11:16:50.937Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 4965,
      "runTimeSecs": 4.965,
      "computeUnits": 0.005516666666666666,
      "imageSizeBytes": 336334336
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Goodreads Scraper Input\",\n  \"description\": \"Scrape books, reviews, editions, quotes, authors, series, Listopia lists, shelves, genres, similar books, and release charts from Goodreads.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to scrape. Auto runs every non-empty input you provide.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"auto\",\n        \"books\",\n        \"search\",\n        \"isbns\",\n        \"authors\",\n        \"series\",\n        \"lists\",\n        \"shelves\",\n        \"genres\",\n        \"reviews\",\n        \"editions\",\n        \"quotes\",\n        \"similar\",\n        \"bookLists\",\n        \"newReleases\"\n      ],\n      \"enumTitles\": [\n        \"Auto (run every non-empty input)\",\n        \"Books by URL or ID\",\n        \"Search by keyword\",\n        \"Books by ISBN\",\n        \"Books by author\",\n        \"Books in a series\",\n        \"Listopia lists\",\n        \"Popular shelves\",\n        \"Genres\",\n        \"Reviews of books\",\n        \"Editions of books\",\n        \"Quotes\",\n        \"Similar books\",\n        \"Lists containing books\",\n        \"New releases by date\"\n      ],\n      \"default\": \"auto\",\n      \"prefill\": \"isbns\"\n    },\n    \"bookUrls\": {\n      \"title\": \"Book URLs or IDs\",\n      \"type\": \"array\",\n      \"description\": \"Goodreads book URLs, bare book IDs, or ISBNs. Used by books, reviews, editions, similar, and bookLists. (mode=books, reviews, editions, similar, bookLists, auto)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"https://www.goodreads.com/book/show/4671.The_Great_Gatsby\"\n      ],\n      \"default\": []\n    },\n    \"searchQueries\": {\n      \"title\": \"Search queries\",\n      \"type\": \"array\",\n      \"description\": \"Titles, authors, or keywords to search for. (mode=search, auto)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [],\n      \"default\": []\n    },\n    \"isbns\": {\n      \"title\": \"ISBNs\",\n      \"type\": \"array\",\n      \"description\": \"ISBN-10 or ISBN-13 values. Hyphens and spaces are accepted. (mode=isbns, auto)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"9780743273565\"\n      ],\n      \"default\": []\n    },\n    \"authorUrls\": {\n      \"title\": \"Author URLs or IDs\",\n      \"type\": \"array\",\n      \"description\": \"Goodreads author URLs or bare author IDs. (mode=authors, auto)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [],\n      \"default\": []\n    },\n    \"seriesUrls\": {\n      \"title\": \"Series URLs or IDs\",\n      \"type\": \"array\",\n      \"description\": \"Goodreads series URLs or bare series IDs. (mode=series, auto)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [],\n      \"default\": []\n    },\n    \"listUrls\": {\n      \"title\": \"Listopia URLs or IDs\",\n      \"type\": \"array\",\n      \"description\": \"Listopia /list/show/ URLs or bare list IDs. (mode=lists, auto)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [],\n      \"default\": []\n    },\n    \"shelfNames\": {\n      \"title\": \"Shelf names\",\n      \"type\": \"array\",\n      \"description\": \"Popular shelf names such as mystery, fantasy, or historical-fiction. (mode=shelves, auto)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [],\n      \"default\": []\n    },\n    \"genreNames\": {\n      \"title\": \"Genre names\",\n      \"type\": \"array\",\n      \"description\": \"Genre slugs such as fantasy, romance, or science-fiction. (mode=genres, auto)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [],\n      \"default\": []\n    },\n    \"maxItems\": {\n      \"title\": \"Max items\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on every record emitted in the run, including review, edition, quote, list, and summary records.\",\n      \"minimum\": 1,\n      \"maximum\": 1000000,\n      \"default\": 50,\n      \"prefill\": 1\n    },\n    \"detailLevel\": {\n      \"title\": \"Detail level\",\n      \"type\": \"string\",\n      \"description\": \"Full returns complete book records. Listing returns lighter row records for search, author, series, list, shelf, and genre results.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"full\",\n        \"listing\"\n      ],\n      \"enumTitles\": [\n        \"Full book records\",\n        \"Listing rows only\"\n      ],\n      \"default\": \"full\",\n      \"prefill\": \"full\"\n    },\n    \"includeMetadata\": {\n      \"title\": \"Include summary records\",\n      \"type\": \"boolean\",\n      \"description\": \"Also emit one author, series, or Listopia summary record alongside the books.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeRelated\": {\n      \"title\": \"Include related book data\",\n      \"type\": \"boolean\",\n      \"description\": \"In auto mode, also collect reviews, editions, similar books, and lists for each book URL.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"minRating\": {\n      \"title\": \"Minimum average rating\",\n      \"type\": \"number\",\n      \"description\": \"Drop books rated below this value. Decimals such as 4.5 are supported.\",\n      \"minimum\": 0,\n      \"maximum\": 5\n    },\n    \"minRatingsCount\": {\n      \"title\": \"Minimum ratings count\",\n      \"type\": \"integer\",\n      \"description\": \"Drop books with fewer ratings than this.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"publishYearMin\": {\n      \"title\": \"Published year from\",\n      \"type\": \"integer\",\n      \"description\": \"Drop books first published before this year.\",\n      \"minimum\": 0,\n      \"maximum\": 3000\n    },\n    \"publishYearMax\": {\n      \"title\": \"Published year to\",\n      \"type\": \"integer\",\n      \"description\": \"Drop books first published after this year.\",\n      \"minimum\": 0,\n      \"maximum\": 3000\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Keep books whose language starts with this text, for example en, English, or fre.\",\n      \"editor\": \"textfield\"\n    },\n    \"containsGenre\": {\n      \"title\": \"Contains genre\",\n      \"type\": \"string\",\n      \"description\": \"Keep books with a genre containing this text.\",\n      \"editor\": \"textfield\"\n    },\n    \"containsAuthor\": {\n      \"title\": \"Contains author\",\n      \"type\": \"string\",\n      \"description\": \"Keep books with an author name containing this text.\",\n      \"editor\": \"textfield\"\n    },\n    \"maxReviewsPerBook\": {\n      \"title\": \"Max reviews per book\",\n      \"type\": \"integer\",\n      \"description\": \"Reviews to collect for each book. (mode=reviews)\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 30,\n      \"prefill\": 3\n    },\n    \"reviewSort\": {\n      \"title\": \"Review sort order\",\n      \"type\": \"string\",\n      \"description\": \"Order reviews by Goodreads default, newest first, or oldest first. (mode=reviews)\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"DEFAULT\",\n        \"NEWEST\",\n        \"OLDEST\"\n      ],\n      \"enumTitles\": [\n        \"Goodreads default\",\n        \"Newest first\",\n        \"Oldest first\"\n      ],\n      \"default\": \"DEFAULT\",\n      \"prefill\": \"DEFAULT\"\n    },\n    \"reviewLanguage\": {\n      \"title\": \"Review language\",\n      \"type\": \"string\",\n      \"description\": \"Only collect reviews written in this language. (mode=reviews)\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"en\",\n        \"es\",\n        \"fr\",\n        \"de\",\n        \"it\",\n        \"pt\",\n        \"nl\",\n        \"pl\",\n        \"tr\",\n        \"ar\",\n        \"ru\",\n        \"uk\",\n        \"zh\",\n        \"zh-TW\",\n        \"ja\",\n        \"ko\",\n        \"hi\",\n        \"bn\",\n        \"id\",\n        \"vi\",\n        \"th\",\n        \"sv\",\n        \"no\",\n        \"da\",\n        \"fi\",\n        \"cs\",\n        \"sk\",\n        \"hu\",\n        \"ro\",\n        \"bg\",\n        \"el\",\n        \"he\",\n        \"sr\",\n        \"hr\",\n        \"sl\",\n        \"lt\",\n        \"lv\",\n        \"et\",\n        \"ca\",\n        \"gl\",\n        \"eu\",\n        \"fa\",\n        \"ur\",\n        \"ms\",\n        \"tl\",\n        \"af\",\n        \"sw\",\n        \"ka\",\n        \"hy\",\n        \"az\",\n        \"uz\",\n        \"mn\",\n        \"is\",\n        \"ga\",\n        \"cy\",\n        \"sq\",\n        \"bs\",\n        \"mk\",\n        \"be\",\n        \"la\"\n      ],\n      \"enumTitles\": [\n        \"All languages\",\n        \"English\",\n        \"Spanish\",\n        \"French\",\n        \"German\",\n        \"Italian\",\n        \"Portuguese\",\n        \"Dutch\",\n        \"Polish\",\n        \"Turkish\",\n        \"Arabic\",\n        \"Russian\",\n        \"Ukrainian\",\n        \"Chinese\",\n        \"Chinese (Traditional)\",\n        \"Japanese\",\n        \"Korean\",\n        \"Hindi\",\n        \"Bengali\",\n        \"Indonesian\",\n        \"Vietnamese\",\n        \"Thai\",\n        \"Swedish\",\n        \"Norwegian\",\n        \"Danish\",\n        \"Finnish\",\n        \"Czech\",\n        \"Slovak\",\n        \"Hungarian\",\n        \"Romanian\",\n        \"Bulgarian\",\n        \"Greek\",\n        \"Hebrew\",\n        \"Serbian\",\n        \"Croatian\",\n        \"Slovenian\",\n        \"Lithuanian\",\n        \"Latvian\",\n        \"Estonian\",\n        \"Catalan\",\n        \"Galician\",\n        \"Basque\",\n        \"Persian\",\n        \"Urdu\",\n        \"Malay\",\n        \"Tagalog\",\n        \"Afrikaans\",\n        \"Swahili\",\n        \"Georgian\",\n        \"Armenian\",\n        \"Azerbaijani\",\n        \"Uzbek\",\n        \"Mongolian\",\n        \"Icelandic\",\n        \"Irish\",\n        \"Welsh\",\n        \"Albanian\",\n        \"Bosnian\",\n        \"Macedonian\",\n        \"Belarusian\",\n        \"Latin\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\"\n    },\n    \"reviewRatingMin\": {\n      \"title\": \"Minimum review rating\",\n      \"type\": \"integer\",\n      \"description\": \"Only collect reviews with at least this star rating. (mode=reviews)\",\n      \"minimum\": 1,\n      \"maximum\": 5\n    },\n    \"reviewRatingMax\": {\n      \"title\": \"Maximum review rating\",\n      \"type\": \"integer\",\n      \"description\": \"Only collect reviews with at most this star rating. (mode=reviews)\",\n      \"minimum\": 1,\n      \"maximum\": 5\n    },\n    \"excludeSpoilers\": {\n      \"title\": \"Exclude spoilers\",\n      \"type\": \"boolean\",\n      \"description\": \"Skip reviews Goodreads marks as containing spoilers. (mode=reviews)\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxEditionsPerBook\": {\n      \"title\": \"Max editions per book\",\n      \"type\": \"integer\",\n      \"description\": \"Editions to collect for each book. (mode=editions)\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 20,\n      \"prefill\": 3\n    },\n    \"quoteTags\": {\n      \"title\": \"Quote tags\",\n      \"type\": \"array\",\n      \"description\": \"Quote tag pages to scrape, such as love, life, or wisdom. (mode=quotes)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"love\"\n      ],\n      \"default\": []\n    },\n    \"quoteAuthorUrls\": {\n      \"title\": \"Quote author URLs or IDs\",\n      \"type\": \"array\",\n      \"description\": \"Author quote pages as Goodreads URLs or bare author IDs. (mode=quotes)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [],\n      \"default\": []\n    },\n    \"quoteWorkUrls\": {\n      \"title\": \"Quote work URLs or IDs\",\n      \"type\": \"array\",\n      \"description\": \"Work quote pages as Goodreads URLs or bare work IDs. (mode=quotes)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [],\n      \"default\": []\n    },\n    \"maxQuotesPerSource\": {\n      \"title\": \"Max quotes per source\",\n      \"type\": \"integer\",\n      \"description\": \"Quotes to collect from each tag, author, or work. (mode=quotes)\",\n      \"minimum\": 1,\n      \"maximum\": 3000,\n      \"default\": 30,\n      \"prefill\": 3\n    },\n    \"maxSimilarPerBook\": {\n      \"title\": \"Max similar books per book\",\n      \"type\": \"integer\",\n      \"description\": \"Similar books to collect for each input book. (mode=similar)\",\n      \"minimum\": 1,\n      \"maximum\": 100,\n      \"default\": 20,\n      \"prefill\": 5\n    },\n    \"maxListsPerBook\": {\n      \"title\": \"Max lists per book\",\n      \"type\": \"integer\",\n      \"description\": \"Listopia lists to collect for each input book. (mode=bookLists)\",\n      \"minimum\": 1,\n      \"maximum\": 100,\n      \"default\": 20,\n      \"prefill\": 5\n    },\n    \"releaseYear\": {\n      \"title\": \"Release chart year\",\n      \"type\": \"integer\",\n      \"description\": \"Year of the new-releases chart. (mode=newReleases)\",\n      \"minimum\": 1900,\n      \"maximum\": 2100,\n      \"default\": 2026,\n      \"prefill\": 2026\n    },\n    \"releaseMonth\": {\n      \"title\": \"Release chart month\",\n      \"type\": \"string\",\n      \"description\": \"Month of the new-releases chart, or all for the yearly chart. (mode=newReleases)\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"1\",\n        \"2\",\n        \"3\",\n        \"4\",\n        \"5\",\n        \"6\",\n        \"7\",\n        \"8\",\n        \"9\",\n        \"10\",\n        \"11\",\n        \"12\"\n      ],\n      \"enumTitles\": [\n        \"Whole year\",\n        \"January\",\n        \"February\",\n        \"March\",\n        \"April\",\n        \"May\",\n        \"June\",\n        \"July\",\n        \"August\",\n        \"September\",\n        \"October\",\n        \"November\",\n        \"December\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\"\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Goodreads Book, Author & Listopia List Scraper\n\nPull **Goodreads** book data, reader reviews, editions, quotes, author profiles, series, Listopia rankings, shelf and genre charts, similar books, and new-release charts into one dataset. Look up books by URL, ID, ISBN, or keyword, or walk an entire author, series, or Listopia list. Every run is cookieless: no Goodreads login, account, or API key is needed.\n\n## What this actor does\n\n- **Fifteen modes:** `books`, `search`, `isbns`, `authors`, `series`, `lists`, `shelves`, `genres`, `reviews`, `editions`, `quotes`, `similar`, `bookLists`, `newReleases`, and `auto`.\n- **Books by URL, ID, or ISBN** with ratings, reviews, editions, awards, characters, places, series, social counters, and buy links.\n- **Reader reviews** with full text, rating, date, reviewer profile, likes, comments, shelves, language, and sort filters.\n- **Discovery rows** for search results, author bibliographies, series reading order, Listopia ranks, shelves, genres, similar books, and monthly or yearly release charts.\n- **Filters** for minimum rating, ratings count, first-published year range, language, genre, and author, plus per-book review, edition, quote, similar-book, and list caps.\n- **Clean records:** empty fields are omitted at every depth, never returned as `null`, `\"\"`, `[]`, or `{}`.\n\n## Output\n\nEvery record has a `recordType` and a `scrapedAt` ISO 8601 UTC timestamp. Empty fields are omitted.\n\n### Book (`recordType: \"book\"`)\n\n- Identity: `bookId`, `kcaId`, `title`, `titleComplete`, `originalTitle`, `url`, `workId`, `workKcaId`, `workUrl`, `coverImage`\n- Description: `description` (plain text), `descriptionHtml`\n- Contributors: `authors[]`, `primaryAuthor`, `authorUrls[]`, `contributors[]` (`name`, `authorId`, `url`, `role`, `isGoodreadsAuthor`)\n- Series: `series` (`name`, `position`, `url`, `id`, `kcaId`), `allSeries[]`\n- Edition: `isbn`, `isbn10`, `isbn13`, `asin`, `pagesCount`, `format`, `publisher`, `language`, `languageCode`, `publishedYear`, `publishedAt`, `firstPublishedYear`, `firstPublishedAt`\n- Ratings: `averageRating`, `ratingsCount`, `reviewsCount`, `ratingsDistribution` (1–5 stars), `reviewsByLanguage`\n- Discovery: `genres[]`, `awards[]`, `characters[]`, `places[]`, `editionsCount`, `editionsUrl`, `quotesCount`, `questionsCount`, `topicsCount`, `currentlyReadingCount`, `wantToReadCount`\n- Commerce: `kindleUrl`, `buyLinks[]`\n\n### Review (`recordType: \"review\"`)\n\n`reviewId`, `bookId`, `workId`, `rating`, `preciseRating`, `reviewText`, `reviewTextHtml`, `spoiler`, `likesCount`, `commentsCount`, `createdAt`, `updatedAt`, `reviewer` (`id`, `name`, `url`, `imageUrl`, `isAuthor`, `followersCount`, `textReviewsCount`), `shelves[]`\n\n### Edition (`recordType: \"edition\"`)\n\n`editionId`, `bookId`, `sourceBookId`, `workId`, `title`, `format`, `publishedYear`, `publishedAt`, `publisher`, `pagesCount`, `authors[]`, `primaryAuthor`, `isbn10`, `isbn13`, `asin`, `language`, `languageCode`, `averageRating`, `ratingsCount`, `coverImage`, `url`. For editions, `bookId` is the edition's own Goodreads id; `sourceBookId` is the book supplied in the input.\n\n### Quote (`recordType: \"quote\"`)\n\n`quoteId`, `quoteText`, `authorName`, `bookTitle`, `workId`, `workUrl`, `tags[]`, `likesCount`, `quoteUrl`, `imageUrl`, `sourceType`, `sourceValue`\n\n### Author (`recordType: \"author\"`, with `includeMetadata`)\n\n`authorId`, `name`, `authorUrl`, `photoUrl`, `description`, `born`, `died`, `website`, `twitter`, `genres[]`, `influences[]`, `series[]` (`seriesId`, `name`, `url`, `bookCount`, `authors`, `averageRating`, `ratingsCount`)\n\n### Series (`recordType: \"series\"`, with `includeMetadata`)\n\n`seriesId`, `name`, `seriesUrl`, `description`, `primaryWorksCount`, `totalWorksCount`\n\n### Listopia list (`recordType: \"list\"`)\n\n`listId`, `name`, `listUrl`, `description`, `bookCount`, `voterCount`, `createdDate`, `creator` (`name`, `url`), `sourceBookId`. Records emitted by `bookLists` carry the list id, name, URL, book count, voter count, and `sourceBookId`; the full description, creation date, and creator come from the `lists` mode with `includeMetadata`.\n\n### Listing rows\n\n- `searchResult` (`query`) and `authorWork` (`authorId`): `bookId`, `title`, `url`, `coverImage`, `authors[]`, `primaryAuthor`, `series`, `averageRating`, `ratingsCount`, `reviewsCount`, `publishedYear`, `editionsCount`\n- `seriesBook` (`seriesId`, `position`) and `listEntry` (`listId`, `rank`, `score`, `voterCount`)\n- `shelfBook` (`shelfName`, `shelfCount`), `genreBook` (`genre`, `group`)\n- `similarBook` (`sourceBookId`)\n- `newRelease` (`year`, `month`, `rank`, `count`)\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `auto` | `auto`, `books`, `search`, `isbns`, `authors`, `series`, `lists`, `shelves`, `genres`, `reviews`, `editions`, `quotes`, `similar`, `bookLists`, `newReleases` |\n| `bookUrls` | array | – | Book URLs, IDs, or ISBNs (books, reviews, editions, similar, bookLists) |\n| `searchQueries` | array | – | Titles, authors, or keywords (search) |\n| `isbns` | array | – | ISBN-10 or ISBN-13 values (isbns) |\n| `authorUrls` | array | – | Author URLs or IDs (authors) |\n| `seriesUrls` | array | – | Series URLs or IDs (series) |\n| `listUrls` | array | – | Listopia URLs or IDs (lists) |\n| `shelfNames` | array | – | Shelf names such as `mystery` (shelves) |\n| `genreNames` | array | – | Genre slugs such as `fantasy` (genres) |\n| `maxItems` | integer | `50` | Hard cap on every emitted record |\n| `detailLevel` | string | `full` | `full` book records or `listing` rows |\n| `includeMetadata` | boolean | `false` | Add author, series, or Listopia summary records |\n| `includeRelated` | boolean | `false` | In `auto` mode, also collect reviews, editions, similar books, and lists for each book URL |\n| `minRating` | number | – | Drop books rated below this value (decimals allowed) |\n| `minRatingsCount` | integer | – | Drop books with fewer ratings |\n| `publishYearMin` | integer | – | Drop books first published before this year |\n| `publishYearMax` | integer | – | Drop books first published after this year |\n| `language` | string | – | Keep books whose language starts with this text |\n| `containsGenre` | string | – | Keep books with a genre containing this text |\n| `containsAuthor` | string | – | Keep books with an author containing this text |\n| `maxReviewsPerBook` | integer | `30` | Reviews per book (reviews) |\n| `reviewSort` | string | `DEFAULT` | `DEFAULT`, `NEWEST`, `OLDEST` (reviews) |\n| `reviewLanguage` | string | `all` | Review language code (reviews) |\n| `reviewRatingMin` | integer | – | Minimum review star rating (reviews) |\n| `reviewRatingMax` | integer | – | Maximum review star rating (reviews) |\n| `excludeSpoilers` | boolean | `false` | Skip reviews marked as spoilers (reviews) |\n| `maxEditionsPerBook` | integer | `20` | Editions per book (editions) |\n| `quoteTags` | array | – | Quote tag pages such as `love` (quotes) |\n| `quoteAuthorUrls` | array | – | Author quote pages (quotes) |\n| `quoteWorkUrls` | array | – | Work quote pages (quotes) |\n| `maxQuotesPerSource` | integer | `30` | Quotes per tag, author, or work (quotes) |\n| `maxSimilarPerBook` | integer | `20` | Similar books per input book (similar) |\n| `maxListsPerBook` | integer | `20` | Lists per input book (bookLists) |\n| `releaseYear` | integer | `2026` | Release chart year (newReleases) |\n| `releaseMonth` | string | `all` | `all` or `1`–`12` (newReleases) |\n\n### Example: book detail by URL\n\n```json\n{\n  \"mode\": \"books\",\n  \"bookUrls\": [\"https://www.goodreads.com/book/show/4671.The_Great_Gatsby\"],\n  \"maxItems\": 5\n}\n```\n\n### Example: newest English reviews for two books\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"bookUrls\": [\"4671\", \"9780743273565\"],\n  \"maxReviewsPerBook\": 100,\n  \"reviewSort\": \"NEWEST\",\n  \"reviewLanguage\": \"en\",\n  \"reviewRatingMin\": 4,\n  \"excludeSpoilers\": true\n}\n```\n\n### Example: Listopia rows plus a list summary\n\n```json\n{\n  \"mode\": \"lists\",\n  \"listUrls\": [\"https://www.goodreads.com/list/show/1.Best_Books_Ever\"],\n  \"detailLevel\": \"listing\",\n  \"includeMetadata\": true,\n  \"maxItems\": 500\n}\n```\n\n### Example: monthly release chart\n\n```json\n{\n  \"mode\": \"newReleases\",\n  \"releaseYear\": 2026,\n  \"releaseMonth\": \"10\",\n  \"maxItems\": 30\n}\n```\n\n### Example: full author bibliography\n\n```json\n{\n  \"mode\": \"authors\",\n  \"authorUrls\": [\"https://www.goodreads.com/author/show/1077326.J_K_Rowling\"],\n  \"minRating\": 4,\n  \"maxItems\": 60\n}\n```\n\n## How it works\n\nFill in one or more input arrays and pick a mode, or leave `mode` on `auto` to run every non-empty input in one pass. The actor reads Goodreads' public book pages, listing pages, and the same public data service the signed-out website uses, then streams records to the dataset as they are ready. Use `detailLevel: \"listing\"` when you only need ranks and row metadata; use `full` when you need complete book records. `maxItems` is a hard cap across the whole run, so a large request stops exactly at your limit rather than over-delivering. Set `includeRelated` when an auto run should also collect reviews, editions, similar books, and lists for its book URLs.\n\n## Usage cost\n\nYou pay only for Apify compute time on the selected memory setting; there is no per-record charge from this actor. Listing modes are the cheapest because they skip per-book detail calls. Review and full-detail runs cost more because each book requires additional requests.\n\n## FAQ\n\n**Do I need a Goodreads account, cookies, or an API key?**\nNo. The actor reads public data only and works without any credentials.\n\n**Do I need to configure a proxy?**\nNo. Requests go direct first. If Goodreads challenges an HTML request, the actor retries and then tries a fresh Apify AUTO datacenter session when your account has that proxy access; book pages also have a `.xml` fallback. GraphQL and autocomplete run without a user proxy.\n\n**What is the difference between `full` and `listing`?**\n`full` returns complete book records with description, ratings, awards, and edition data. `listing` returns one lightweight row per result with the rank, title, author, rating, and URL, which is faster for large lists.\n\n**Why are reviews missing some likes, comments, or shelves?**\nGoodreads itself omits those counters on some deleted or restricted reviews. The actor keeps the review text and rating and leaves the missing fields out.\n\n**Why is a book missing its ISBN or publisher?**\nNot every Goodreads edition records those fields. The actor never invents values; it omits the field when the source does not publish it.\n\n**How far can search, Listopia, quotes, and shelves go?**\nGoodreads caps search at about 2,000 results, Listopia at 10,000 entries per list, quote pages at 3,000 quotes per source, and popular shelf pages at 50 books. Genre pages expose the three curated groups shown on the page. The actor reports these limits in the run status instead of silently under-delivering.\n\n**Does `maxItems` include summary records?**\nYes. Every record counts, including review, edition, quote, author, series, and list records.\n\n**Which memory setting does the actor use?**\nThe actor requests 1,024 MB and streams records instead of buffering a run. Account-level defaults can raise the effective run memory (often 4,096 MB on Apify accounts), so compute cost follows the memory Apify actually assigns.\n\n**Are the links and covers usable elsewhere?**\nBook, cover, author, and buy links are the public URLs Goodreads publishes. A very old or rare cover may no longer be served by Goodreads itself.\n\n**Is this affiliated with Goodreads or Amazon?**\nNo. This is an independent third-party actor that reads Goodreads' public data.\n\n## Notes and limitations\n\n- Search is capped by Goodreads at roughly 2,000 results per query. Split broad topics into narrower queries for deeper coverage.\n- Listopia lists stop at 10,000 entries and quote pages at 3,000 quotes per source; both are site limits.\n- Popular shelves return the 50 books Goodreads shows; there is no deeper shelf pagination. Use Listopia or genre pages for larger discovery sets.\n- Genre pages expose the new-release, most-read, and popular groups shown on the page, not an unbounded catalog.\n- Deleted reviews and incomplete editions can lack optional counters or identifiers; those fields are omitted.\n- If Goodreads challenges HTML with its AWS WAF page, the actor retries, then attempts an Apify AUTO proxy session; if the challenge persists, it uses book `.xml` and search autocomplete fallbacks where available and reports the challenge in the run status. GraphQL book, review, edition, similar, and list data is not WAF-gated.\n- The `.xml` book fallback can resolve to the work's primary edition, so its `bookId` may differ from the edition you requested and it carries fewer social/related fields. The actor uses GraphQL whenever that endpoint answers.\n- Data is live at run time; ratings, review counts, and chart positions change continuously.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "goodreads-book-author-and-listopia-list-scraper",
      "title": "Goodreads Book, Author & Listopia List Scraper",
      "description": "Scrape Goodreads books, reviews, editions, quotes, authors, series, Listopia lists, shelves, genres, similar books, and release charts. Filter by rating, year, language, genre, or author. No login needed.",
      "version": "1.1",
      "buildTag": "latest",
      "input": {
        "title": "Goodreads Scraper Input",
        "description": "Scrape books, reviews, editions, quotes, authors, series, Listopia lists, shelves, genres, similar books, and release charts from Goodreads.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to scrape. Auto runs every non-empty input you provide.",
            "editor": "select",
            "enum": [
              "auto",
              "books",
              "search",
              "isbns",
              "authors",
              "series",
              "lists",
              "shelves",
              "genres",
              "reviews",
              "editions",
              "quotes",
              "similar",
              "bookLists",
              "newReleases"
            ],
            "enumTitles": [
              "Auto (run every non-empty input)",
              "Books by URL or ID",
              "Search by keyword",
              "Books by ISBN",
              "Books by author",
              "Books in a series",
              "Listopia lists",
              "Popular shelves",
              "Genres",
              "Reviews of books",
              "Editions of books",
              "Quotes",
              "Similar books",
              "Lists containing books",
              "New releases by date"
            ],
            "default": "auto",
            "prefill": "isbns"
          },
          "bookUrls": {
            "title": "Book URLs or IDs",
            "type": "array",
            "description": "Goodreads book URLs, bare book IDs, or ISBNs. Used by books, reviews, editions, similar, and bookLists. (mode=books, reviews, editions, similar, bookLists, auto)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [
              "https://www.goodreads.com/book/show/4671.The_Great_Gatsby"
            ],
            "default": []
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Titles, authors, or keywords to search for. (mode=search, auto)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [],
            "default": []
          },
          "isbns": {
            "title": "ISBNs",
            "type": "array",
            "description": "ISBN-10 or ISBN-13 values. Hyphens and spaces are accepted. (mode=isbns, auto)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [
              "9780743273565"
            ],
            "default": []
          },
          "authorUrls": {
            "title": "Author URLs or IDs",
            "type": "array",
            "description": "Goodreads author URLs or bare author IDs. (mode=authors, auto)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [],
            "default": []
          },
          "seriesUrls": {
            "title": "Series URLs or IDs",
            "type": "array",
            "description": "Goodreads series URLs or bare series IDs. (mode=series, auto)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [],
            "default": []
          },
          "listUrls": {
            "title": "Listopia URLs or IDs",
            "type": "array",
            "description": "Listopia /list/show/ URLs or bare list IDs. (mode=lists, auto)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [],
            "default": []
          },
          "shelfNames": {
            "title": "Shelf names",
            "type": "array",
            "description": "Popular shelf names such as mystery, fantasy, or historical-fiction. (mode=shelves, auto)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [],
            "default": []
          },
          "genreNames": {
            "title": "Genre names",
            "type": "array",
            "description": "Genre slugs such as fantasy, romance, or science-fiction. (mode=genres, auto)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [],
            "default": []
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Hard cap on every record emitted in the run, including review, edition, quote, list, and summary records.",
            "minimum": 1,
            "maximum": 1000000,
            "default": 50,
            "prefill": 1
          },
          "detailLevel": {
            "title": "Detail level",
            "type": "string",
            "description": "Full returns complete book records. Listing returns lighter row records for search, author, series, list, shelf, and genre results.",
            "editor": "select",
            "enum": [
              "full",
              "listing"
            ],
            "enumTitles": [
              "Full book records",
              "Listing rows only"
            ],
            "default": "full",
            "prefill": "full"
          },
          "includeMetadata": {
            "title": "Include summary records",
            "type": "boolean",
            "description": "Also emit one author, series, or Listopia summary record alongside the books.",
            "default": false,
            "prefill": false
          },
          "includeRelated": {
            "title": "Include related book data",
            "type": "boolean",
            "description": "In auto mode, also collect reviews, editions, similar books, and lists for each book URL.",
            "default": false,
            "prefill": false
          },
          "minRating": {
            "title": "Minimum average rating",
            "type": "number",
            "description": "Drop books rated below this value. Decimals such as 4.5 are supported.",
            "minimum": 0,
            "maximum": 5
          },
          "minRatingsCount": {
            "title": "Minimum ratings count",
            "type": "integer",
            "description": "Drop books with fewer ratings than this.",
            "minimum": 0,
            "maximum": 10000000
          },
          "publishYearMin": {
            "title": "Published year from",
            "type": "integer",
            "description": "Drop books first published before this year.",
            "minimum": 0,
            "maximum": 3000
          },
          "publishYearMax": {
            "title": "Published year to",
            "type": "integer",
            "description": "Drop books first published after this year.",
            "minimum": 0,
            "maximum": 3000
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Keep books whose language starts with this text, for example en, English, or fre.",
            "editor": "textfield"
          },
          "containsGenre": {
            "title": "Contains genre",
            "type": "string",
            "description": "Keep books with a genre containing this text.",
            "editor": "textfield"
          },
          "containsAuthor": {
            "title": "Contains author",
            "type": "string",
            "description": "Keep books with an author name containing this text.",
            "editor": "textfield"
          },
          "maxReviewsPerBook": {
            "title": "Max reviews per book",
            "type": "integer",
            "description": "Reviews to collect for each book. (mode=reviews)",
            "minimum": 1,
            "maximum": 10000,
            "default": 30,
            "prefill": 3
          },
          "reviewSort": {
            "title": "Review sort order",
            "type": "string",
            "description": "Order reviews by Goodreads default, newest first, or oldest first. (mode=reviews)",
            "editor": "select",
            "enum": [
              "DEFAULT",
              "NEWEST",
              "OLDEST"
            ],
            "enumTitles": [
              "Goodreads default",
              "Newest first",
              "Oldest first"
            ],
            "default": "DEFAULT",
            "prefill": "DEFAULT"
          },
          "reviewLanguage": {
            "title": "Review language",
            "type": "string",
            "description": "Only collect reviews written in this language. (mode=reviews)",
            "editor": "select",
            "enum": [
              "all",
              "en",
              "es",
              "fr",
              "de",
              "it",
              "pt",
              "nl",
              "pl",
              "tr",
              "ar",
              "ru",
              "uk",
              "zh",
              "zh-TW",
              "ja",
              "ko",
              "hi",
              "bn",
              "id",
              "vi",
              "th",
              "sv",
              "no",
              "da",
              "fi",
              "cs",
              "sk",
              "hu",
              "ro",
              "bg",
              "el",
              "he",
              "sr",
              "hr",
              "sl",
              "lt",
              "lv",
              "et",
              "ca",
              "gl",
              "eu",
              "fa",
              "ur",
              "ms",
              "tl",
              "af",
              "sw",
              "ka",
              "hy",
              "az",
              "uz",
              "mn",
              "is",
              "ga",
              "cy",
              "sq",
              "bs",
              "mk",
              "be",
              "la"
            ],
            "enumTitles": [
              "All languages",
              "English",
              "Spanish",
              "French",
              "German",
              "Italian",
              "Portuguese",
              "Dutch",
              "Polish",
              "Turkish",
              "Arabic",
              "Russian",
              "Ukrainian",
              "Chinese",
              "Chinese (Traditional)",
              "Japanese",
              "Korean",
              "Hindi",
              "Bengali",
              "Indonesian",
              "Vietnamese",
              "Thai",
              "Swedish",
              "Norwegian",
              "Danish",
              "Finnish",
              "Czech",
              "Slovak",
              "Hungarian",
              "Romanian",
              "Bulgarian",
              "Greek",
              "Hebrew",
              "Serbian",
              "Croatian",
              "Slovenian",
              "Lithuanian",
              "Latvian",
              "Estonian",
              "Catalan",
              "Galician",
              "Basque",
              "Persian",
              "Urdu",
              "Malay",
              "Tagalog",
              "Afrikaans",
              "Swahili",
              "Georgian",
              "Armenian",
              "Azerbaijani",
              "Uzbek",
              "Mongolian",
              "Icelandic",
              "Irish",
              "Welsh",
              "Albanian",
              "Bosnian",
              "Macedonian",
              "Belarusian",
              "Latin"
            ],
            "default": "all",
            "prefill": "all"
          },
          "reviewRatingMin": {
            "title": "Minimum review rating",
            "type": "integer",
            "description": "Only collect reviews with at least this star rating. (mode=reviews)",
            "minimum": 1,
            "maximum": 5
          },
          "reviewRatingMax": {
            "title": "Maximum review rating",
            "type": "integer",
            "description": "Only collect reviews with at most this star rating. (mode=reviews)",
            "minimum": 1,
            "maximum": 5
          },
          "excludeSpoilers": {
            "title": "Exclude spoilers",
            "type": "boolean",
            "description": "Skip reviews Goodreads marks as containing spoilers. (mode=reviews)",
            "default": false,
            "prefill": false
          },
          "maxEditionsPerBook": {
            "title": "Max editions per book",
            "type": "integer",
            "description": "Editions to collect for each book. (mode=editions)",
            "minimum": 1,
            "maximum": 1000,
            "default": 20,
            "prefill": 3
          },
          "quoteTags": {
            "title": "Quote tags",
            "type": "array",
            "description": "Quote tag pages to scrape, such as love, life, or wisdom. (mode=quotes)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [
              "love"
            ],
            "default": []
          },
          "quoteAuthorUrls": {
            "title": "Quote author URLs or IDs",
            "type": "array",
            "description": "Author quote pages as Goodreads URLs or bare author IDs. (mode=quotes)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [],
            "default": []
          },
          "quoteWorkUrls": {
            "title": "Quote work URLs or IDs",
            "type": "array",
            "description": "Work quote pages as Goodreads URLs or bare work IDs. (mode=quotes)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [],
            "default": []
          },
          "maxQuotesPerSource": {
            "title": "Max quotes per source",
            "type": "integer",
            "description": "Quotes to collect from each tag, author, or work. (mode=quotes)",
            "minimum": 1,
            "maximum": 3000,
            "default": 30,
            "prefill": 3
          },
          "maxSimilarPerBook": {
            "title": "Max similar books per book",
            "type": "integer",
            "description": "Similar books to collect for each input book. (mode=similar)",
            "minimum": 1,
            "maximum": 100,
            "default": 20,
            "prefill": 5
          },
          "maxListsPerBook": {
            "title": "Max lists per book",
            "type": "integer",
            "description": "Listopia lists to collect for each input book. (mode=bookLists)",
            "minimum": 1,
            "maximum": 100,
            "default": 20,
            "prefill": 5
          },
          "releaseYear": {
            "title": "Release chart year",
            "type": "integer",
            "description": "Year of the new-releases chart. (mode=newReleases)",
            "minimum": 1900,
            "maximum": 2100,
            "default": 2026,
            "prefill": 2026
          },
          "releaseMonth": {
            "title": "Release chart month",
            "type": "string",
            "description": "Month of the new-releases chart, or all for the yearly chart. (mode=newReleases)",
            "editor": "select",
            "enum": [
              "all",
              "1",
              "2",
              "3",
              "4",
              "5",
              "6",
              "7",
              "8",
              "9",
              "10",
              "11",
              "12"
            ],
            "enumTitles": [
              "Whole year",
              "January",
              "February",
              "March",
              "April",
              "May",
              "June",
              "July",
              "August",
              "September",
              "October",
              "November",
              "December"
            ],
            "default": "all",
            "prefill": "all"
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Goodreads Book, Author & Listopia List Scraper Output",
        "description": "One dataset of Goodreads records identified by recordType: books, reviews, editions, quotes, authors, series, Listopia lists, listing rows, and release-chart entries.",
        "properties": {
          "records": {
            "type": "string",
            "title": "Goodreads records",
            "description": "Dataset containing every scraped record for the selected mode, discriminated by recordType.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "readme": "# Goodreads Book, Author & Listopia List Scraper\n\nPull **Goodreads** book data, reader reviews, editions, quotes, author profiles, series, Listopia rankings, shelf and genre charts, similar books, and new-release charts into one dataset. Look up books by URL, ID, ISBN, or keyword, or walk an entire author, series, or Listopia list. Every run is cookieless: no Goodreads login, account, or API key is needed.\n\n## What this actor does\n\n- **Fifteen modes:** `books`, `search`, `isbns`, `authors`, `series`, `lists`, `shelves`, `genres`, `reviews`, `editions`, `quotes`, `similar`, `bookLists`, `newReleases`, and `auto`.\n- **Books by URL, ID, or ISBN** with ratings, reviews, editions, awards, characters, places, series, social counters, and buy links.\n- **Reader reviews** with full text, rating, date, reviewer profile, likes, comments, shelves, language, and sort filters.\n- **Discovery rows** for search results, author bibliographies, series reading order, Listopia ranks, shelves, genres, similar books, and monthly or yearly release charts.\n- **Filters** for minimum rating, ratings count, first-published year range, language, genre, and author, plus per-book review, edition, quote, similar-book, and list caps.\n- **Clean records:** empty fields are omitted at every depth, never returned as `null`, `\"\"`, `[]`, or `{}`.\n\n## Output\n\nEvery record has a `recordType` and a `scrapedAt` ISO 8601 UTC timestamp. Empty fields are omitted.\n\n### Book (`recordType: \"book\"`)\n\n- Identity: `bookId`, `kcaId`, `title`, `titleComplete`, `originalTitle`, `url`, `workId`, `workKcaId`, `workUrl`, `coverImage`\n- Description: `description` (plain text), `descriptionHtml`\n- Contributors: `authors[]`, `primaryAuthor`, `authorUrls[]`, `contributors[]` (`name`, `authorId`, `url`, `role`, `isGoodreadsAuthor`)\n- Series: `series` (`name`, `position`, `url`, `id`, `kcaId`), `allSeries[]`\n- Edition: `isbn`, `isbn10`, `isbn13`, `asin`, `pagesCount`, `format`, `publisher`, `language`, `languageCode`, `publishedYear`, `publishedAt`, `firstPublishedYear`, `firstPublishedAt`\n- Ratings: `averageRating`, `ratingsCount`, `reviewsCount`, `ratingsDistribution` (1–5 stars), `reviewsByLanguage`\n- Discovery: `genres[]`, `awards[]`, `characters[]`, `places[]`, `editionsCount`, `editionsUrl`, `quotesCount`, `questionsCount`, `topicsCount`, `currentlyReadingCount`, `wantToReadCount`\n- Commerce: `kindleUrl`, `buyLinks[]`\n\n### Review (`recordType: \"review\"`)\n\n`reviewId`, `bookId`, `workId`, `rating`, `preciseRating`, `reviewText`, `reviewTextHtml`, `spoiler`, `likesCount`, `commentsCount`, `createdAt`, `updatedAt`, `reviewer` (`id`, `name`, `url`, `imageUrl`, `isAuthor`, `followersCount`, `textReviewsCount`), `shelves[]`\n\n### Edition (`recordType: \"edition\"`)\n\n`editionId`, `bookId`, `sourceBookId`, `workId`, `title`, `format`, `publishedYear`, `publishedAt`, `publisher`, `pagesCount`, `authors[]`, `primaryAuthor`, `isbn10`, `isbn13`, `asin`, `language`, `languageCode`, `averageRating`, `ratingsCount`, `coverImage`, `url`. For editions, `bookId` is the edition's own Goodreads id; `sourceBookId` is the book supplied in the input.\n\n### Quote (`recordType: \"quote\"`)\n\n`quoteId`, `quoteText`, `authorName`, `bookTitle`, `workId`, `workUrl`, `tags[]`, `likesCount`, `quoteUrl`, `imageUrl`, `sourceType`, `sourceValue`\n\n### Author (`recordType: \"author\"`, with `includeMetadata`)\n\n`authorId`, `name`, `authorUrl`, `photoUrl`, `description`, `born`, `died`, `website`, `twitter`, `genres[]`, `influences[]`, `series[]` (`seriesId`, `name`, `url`, `bookCount`, `authors`, `averageRating`, `ratingsCount`)\n\n### Series (`recordType: \"series\"`, with `includeMetadata`)\n\n`seriesId`, `name`, `seriesUrl`, `description`, `primaryWorksCount`, `totalWorksCount`\n\n### Listopia list (`recordType: \"list\"`)\n\n`listId`, `name`, `listUrl`, `description`, `bookCount`, `voterCount`, `createdDate`, `creator` (`name`, `url`), `sourceBookId`. Records emitted by `bookLists` carry the list id, name, URL, book count, voter count, and `sourceBookId`; the full description, creation date, and creator come from the `lists` mode with `includeMetadata`.\n\n### Listing rows\n\n- `searchResult` (`query`) and `authorWork` (`authorId`): `bookId`, `title`, `url`, `coverImage`, `authors[]`, `primaryAuthor`, `series`, `averageRating`, `ratingsCount`, `reviewsCount`, `publishedYear`, `editionsCount`\n- `seriesBook` (`seriesId`, `position`) and `listEntry` (`listId`, `rank`, `score`, `voterCount`)\n- `shelfBook` (`shelfName`, `shelfCount`), `genreBook` (`genre`, `group`)\n- `similarBook` (`sourceBookId`)\n- `newRelease` (`year`, `month`, `rank`, `count`)\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `auto` | `auto`, `books`, `search`, `isbns`, `authors`, `series`, `lists`, `shelves`, `genres`, `reviews`, `editions`, `quotes`, `similar`, `bookLists`, `newReleases` |\n| `bookUrls` | array | – | Book URLs, IDs, or ISBNs (books, reviews, editions, similar, bookLists) |\n| `searchQueries` | array | – | Titles, authors, or keywords (search) |\n| `isbns` | array | – | ISBN-10 or ISBN-13 values (isbns) |\n| `authorUrls` | array | – | Author URLs or IDs (authors) |\n| `seriesUrls` | array | – | Series URLs or IDs (series) |\n| `listUrls` | array | – | Listopia URLs or IDs (lists) |\n| `shelfNames` | array | – | Shelf names such as `mystery` (shelves) |\n| `genreNames` | array | – | Genre slugs such as `fantasy` (genres) |\n| `maxItems` | integer | `50` | Hard cap on every emitted record |\n| `detailLevel` | string | `full` | `full` book records or `listing` rows |\n| `includeMetadata` | boolean | `false` | Add author, series, or Listopia summary records |\n| `includeRelated` | boolean | `false` | In `auto` mode, also collect reviews, editions, similar books, and lists for each book URL |\n| `minRating` | number | – | Drop books rated below this value (decimals allowed) |\n| `minRatingsCount` | integer | – | Drop books with fewer ratings |\n| `publishYearMin` | integer | – | Drop books first published before this year |\n| `publishYearMax` | integer | – | Drop books first published after this year |\n| `language` | string | – | Keep books whose language starts with this text |\n| `containsGenre` | string | – | Keep books with a genre containing this text |\n| `containsAuthor` | string | – | Keep books with an author containing this text |\n| `maxReviewsPerBook` | integer | `30` | Reviews per book (reviews) |\n| `reviewSort` | string | `DEFAULT` | `DEFAULT`, `NEWEST`, `OLDEST` (reviews) |\n| `reviewLanguage` | string | `all` | Review language code (reviews) |\n| `reviewRatingMin` | integer | – | Minimum review star rating (reviews) |\n| `reviewRatingMax` | integer | – | Maximum review star rating (reviews) |\n| `excludeSpoilers` | boolean | `false` | Skip reviews marked as spoilers (reviews) |\n| `maxEditionsPerBook` | integer | `20` | Editions per book (editions) |\n| `quoteTags` | array | – | Quote tag pages such as `love` (quotes) |\n| `quoteAuthorUrls` | array | – | Author quote pages (quotes) |\n| `quoteWorkUrls` | array | – | Work quote pages (quotes) |\n| `maxQuotesPerSource` | integer | `30` | Quotes per tag, author, or work (quotes) |\n| `maxSimilarPerBook` | integer | `20` | Similar books per input book (similar) |\n| `maxListsPerBook` | integer | `20` | Lists per input book (bookLists) |\n| `releaseYear` | integer | `2026` | Release chart year (newReleases) |\n| `releaseMonth` | string | `all` | `all` or `1`–`12` (newReleases) |\n\n### Example: book detail by URL\n\n```json\n{\n  \"mode\": \"books\",\n  \"bookUrls\": [\"https://www.goodreads.com/book/show/4671.The_Great_Gatsby\"],\n  \"maxItems\": 5\n}\n```\n\n### Example: newest English reviews for two books\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"bookUrls\": [\"4671\", \"9780743273565\"],\n  \"maxReviewsPerBook\": 100,\n  \"reviewSort\": \"NEWEST\",\n  \"reviewLanguage\": \"en\",\n  \"reviewRatingMin\": 4,\n  \"excludeSpoilers\": true\n}\n```\n\n### Example: Listopia rows plus a list summary\n\n```json\n{\n  \"mode\": \"lists\",\n  \"listUrls\": [\"https://www.goodreads.com/list/show/1.Best_Books_Ever\"],\n  \"detailLevel\": \"listing\",\n  \"includeMetadata\": true,\n  \"maxItems\": 500\n}\n```\n\n### Example: monthly release chart\n\n```json\n{\n  \"mode\": \"newReleases\",\n  \"releaseYear\": 2026,\n  \"releaseMonth\": \"10\",\n  \"maxItems\": 30\n}\n```\n\n### Example: full author bibliography\n\n```json\n{\n  \"mode\": \"authors\",\n  \"authorUrls\": [\"https://www.goodreads.com/author/show/1077326.J_K_Rowling\"],\n  \"minRating\": 4,\n  \"maxItems\": 60\n}\n```\n\n## How it works\n\nFill in one or more input arrays and pick a mode, or leave `mode` on `auto` to run every non-empty input in one pass. The actor reads Goodreads' public book pages, listing pages, and the same public data service the signed-out website uses, then streams records to the dataset as they are ready. Use `detailLevel: \"listing\"` when you only need ranks and row metadata; use `full` when you need complete book records. `maxItems` is a hard cap across the whole run, so a large request stops exactly at your limit rather than over-delivering. Set `includeRelated` when an auto run should also collect reviews, editions, similar books, and lists for its book URLs.\n\n## Usage cost\n\nYou pay only for Apify compute time on the selected memory setting; there is no per-record charge from this actor. Listing modes are the cheapest because they skip per-book detail calls. Review and full-detail runs cost more because each book requires additional requests.\n\n## FAQ\n\n**Do I need a Goodreads account, cookies, or an API key?**\nNo. The actor reads public data only and works without any credentials.\n\n**Do I need to configure a proxy?**\nNo. Requests go direct first. If Goodreads challenges an HTML request, the actor retries and then tries a fresh Apify AUTO datacenter session when your account has that proxy access; book pages also have a `.xml` fallback. GraphQL and autocomplete run without a user proxy.\n\n**What is the difference between `full` and `listing`?**\n`full` returns complete book records with description, ratings, awards, and edition data. `listing` returns one lightweight row per result with the rank, title, author, rating, and URL, which is faster for large lists.\n\n**Why are reviews missing some likes, comments, or shelves?**\nGoodreads itself omits those counters on some deleted or restricted reviews. The actor keeps the review text and rating and leaves the missing fields out.\n\n**Why is a book missing its ISBN or publisher?**\nNot every Goodreads edition records those fields. The actor never invents values; it omits the field when the source does not publish it.\n\n**How far can search, Listopia, quotes, and shelves go?**\nGoodreads caps search at about 2,000 results, Listopia at 10,000 entries per list, quote pages at 3,000 quotes per source, and popular shelf pages at 50 books. Genre pages expose the three curated groups shown on the page. The actor reports these limits in the run status instead of silently under-delivering.\n\n**Does `maxItems` include summary records?**\nYes. Every record counts, including review, edition, quote, author, series, and list records.\n\n**Which memory setting does the actor use?**\nThe actor requests 1,024 MB and streams records instead of buffering a run. Account-level defaults can raise the effective run memory (often 4,096 MB on Apify accounts), so compute cost follows the memory Apify actually assigns.\n\n**Are the links and covers usable elsewhere?**\nBook, cover, author, and buy links are the public URLs Goodreads publishes. A very old or rare cover may no longer be served by Goodreads itself.\n\n**Is this affiliated with Goodreads or Amazon?**\nNo. This is an independent third-party actor that reads Goodreads' public data.\n\n## Notes and limitations\n\n- Search is capped by Goodreads at roughly 2,000 results per query. Split broad topics into narrower queries for deeper coverage.\n- Listopia lists stop at 10,000 entries and quote pages at 3,000 quotes per source; both are site limits.\n- Popular shelves return the 50 books Goodreads shows; there is no deeper shelf pagination. Use Listopia or genre pages for larger discovery sets.\n- Genre pages expose the new-release, most-read, and popular groups shown on the page, not an unbounded catalog.\n- Deleted reviews and incomplete editions can lack optional counters or identifiers; those fields are omitted.\n- If Goodreads challenges HTML with its AWS WAF page, the actor retries, then attempts an Apify AUTO proxy session; if the challenge persists, it uses book `.xml` and search autocomplete fallbacks where available and reports the challenge in the run status. GraphQL book, review, edition, similar, and list data is not WAF-gated.\n- The `.xml` book fallback can resolve to the work's primary edition, so its `bookId` may differ from the edition you requested and it carries fewer social/related fields. The actor uses GraphQL whenever that endpoint answers.\n- Data is live at run time; ratings, review counts, and chart positions change continuously.\n",
      "dockerfile": "../Dockerfile",
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 1024
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Records",
              "transformation": {
                "fields": [
                  "recordType",
                  "title",
                  "primaryAuthor",
                  "averageRating",
                  "ratingsCount",
                  "publishedYear",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type"
                  },
                  "title": {
                    "label": "Title"
                  },
                  "primaryAuthor": {
                    "label": "Author"
                  },
                  "averageRating": {
                    "label": "Rating"
                  },
                  "ratingsCount": {
                    "label": "# Ratings"
                  },
                  "publishedYear": {
                    "label": "Year"
                  },
                  "url": {
                    "label": "URL",
                    "format": "link"
                  }
                }
              }
            },
            "reviews": {
              "title": "Reviews",
              "transformation": {
                "fields": [
                  "recordType",
                  "bookId",
                  "rating",
                  "reviewer.name",
                  "createdAt",
                  "likesCount",
                  "reviewText"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type"
                  },
                  "bookId": {
                    "label": "Book ID"
                  },
                  "rating": {
                    "label": "Rating"
                  },
                  "reviewer.name": {
                    "label": "Reviewer"
                  },
                  "createdAt": {
                    "label": "Created"
                  },
                  "likesCount": {
                    "label": "Likes"
                  },
                  "reviewText": {
                    "label": "Review"
                  }
                }
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.1.1",
    "imageDigest": "8858fe32bf90563371c688e2ce6e20d2b835398970d1a1818becbdd1e08259d5",
    "actVersion": {
      "sourceType": "TARBALL",
      "buildTag": "latest",
      "versionNumber": "1.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.005516666666666666
    }
  }
}