{"id":"da6d20af-63a5-4003-9496-42aa47648e06","entityType":"agent","slug":"clawhub-crawlora-org-book-research","name":"book-research","canonicalUrl":"https://www.xpersona.co/agent/clawhub-crawlora-org-book-research","canonicalPath":"/agent/clawhub-crawlora-org-book-research","generatedAt":"2026-10-11T20:57:52.307Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:03:36.881Z","emptyReason":null},"description":"Researches books, authors, and audiobooks via the Crawlora API — Goodreads (books, authors, reviews, lists, quotes), Apple Books (books, audiobooks, series, reviews, charts), and Audible (audiobook catalog search, product detail, narrators/series, reviews, charts, editorial lists) — returning clean JSON. Use when the user wants a book's ratings/reviews, an author's bibliography, curated reading lists, or audiobook details and charts.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:book-research","sourceUrl":"https://clawhub.ai/crawlora-org/book-research","homepage":"https://clawhub.ai/crawlora-org/skills/book-research","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/crawlora-org/book-research","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/crawlora-org/skills/book-research","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"book-research technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:03:36.881Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:03:36.881Z","emptyReason":null},"stars":null,"forks":null,"downloads":1022,"packageName":null,"latestVersion":"1.0.19","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:03:36.866Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T17:03:36.881Z","lastCrawledAt":"2026-10-11T17:03:36.866Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T17:03:36.866Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.19","createdAt":"2026-09-21T01:29:04.775Z","changelog":"Sync skill instructions, references, and helper from GitHub 0cfbceba40b050ba434a0a3f4945ca97b668c805","fileCount":5,"zipByteSize":9901},{"version":"1.0.18","createdAt":"2026-09-17T10:22:45.419Z","changelog":"Security hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.","fileCount":5,"zipByteSize":9816},{"version":"1.0.17","createdAt":"2026-09-14T01:33:45.073Z","changelog":"Sync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d","fileCount":5,"zipByteSize":10317},{"version":"1.0.16","createdAt":"2026-09-10T12:30:10.114Z","changelog":"Validate API keys before curl config","fileCount":5,"zipByteSize":9973},{"version":"1.0.15","createdAt":"2026-09-10T12:13:53.390Z","changelog":"Keep API keys out of process arguments","fileCount":5,"zipByteSize":9859},{"version":"1.0.14","createdAt":"2026-09-10T12:05:14.207Z","changelog":"Reject curl local-file query syntax","fileCount":5,"zipByteSize":9708},{"version":"1.0.13","createdAt":"2026-09-10T11:59:07.470Z","changelog":"Stream helper request bodies through curl stdin","fileCount":5,"zipByteSize":9665},{"version":"1.0.12","createdAt":"2026-09-10T11:58:00.451Z","changelog":"Stream helper request bodies through curl stdin","fileCount":5,"zipByteSize":9631}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:book-research","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:book-research` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/crawlora-org/book-research before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-book-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-book-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-book-research/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-book-research/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-book-research/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-book-research/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T20:57:52.300Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-book-research/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-book-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-book-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-book-research/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:03:36.881Z","emptyReason":null},"readme":"Skill: book-research\n\nOwner: crawlora-org\n\nSummary: Researches books, authors, and audiobooks via the Crawlora API — Goodreads (books, authors, reviews, lists, quotes), Apple Books (books, audiobooks, series, reviews, charts), and Audible (audiobook catalog search, product detail, narrators/series, reviews, charts, editorial lists) — returning clean JSON. Use when the user wants a book's ratings/reviews, an author's bibliography, curated reading lists, or audiobook details and charts.\n\nTags: latest:1.0.19\n\nVersion history:\n\nv1.0.19 | 2026-09-21T01:29:04.775Z | user\n\nSync skill instructions, references, and helper from GitHub 0cfbceba40b050ba434a0a3f4945ca97b668c805\n\nv1.0.18 | 2026-09-17T10:22:45.419Z | user\n\nSecurity hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.\n\nv1.0.17 | 2026-09-14T01:33:45.073Z | user\n\nSync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d\n\nv1.0.16 | 2026-09-10T12:30:10.114Z | user\n\nValidate API keys before curl config\n\nv1.0.15 | 2026-09-10T12:13:53.390Z | user\n\nKeep API keys out of process arguments\n\nv1.0.14 | 2026-09-10T12:05:14.207Z | user\n\nReject curl local-file query syntax\n\nv1.0.13 | 2026-09-10T11:59:07.470Z | user\n\nStream helper request bodies through curl stdin\n\nv1.0.12 | 2026-09-10T11:58:00.451Z | user\n\nStream helper request bodies through curl stdin\n\nv1.0.11 | 2026-09-10T11:34:03.657Z | user\n\nScope helper routes and remove secret-shaped key examples\n\nv1.0.10 | 2026-09-10T06:22:51.457Z | user\n\nMigrate publisher from tonywangcn to crawlora-org for brand consistency with the plugins\n\nv1.0.9 | 2026-09-08T04:28:28.579Z | user\n\nRefresh stale REST examples, endpoint references, and Bash helper from crawlora-skills 1.17.1.\n\nv1.0.8 | 2026-09-07T13:19:19.882Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.7 | 2026-09-07T08:07:15.501Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.6 | 2026-09-07T06:29:53.930Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.5 | 2026-08-24T07:05:40.869Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.4 | 2026-08-24T06:20:25.554Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.3 | 2026-08-24T05:03:22.628Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.2 | 2026-08-14T18:21:28.356Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.1 | 2026-08-10T18:24:33.340Z | user\n\nSet categories\n\nv1.0.0 | 2026-08-10T17:59:28.115Z | auto\n\nbook-research 1.0.0 – Initial release\n\n- Search and retrieve detailed book, author, and audiobook information from Goodreads and Apple Books using the Crawlora API.\n- Get ratings, reviews, bibliographies, curated reading lists, and audiobook details in normalized JSON format.\n- Supports browsing Goodreads genres, lists, and quotes, and Apple Books charts by country or genre.\n- Designed for quick lookups of book/audiobook availability, author backlists, and curated recommendation lists.\n- Requires a free Crawlora API key for access; all endpoints and usage instructions included in the documentation.\n\nArchive index:\n\nArchive v1.0.19: 5 files, 9901 bytes\n\nFiles: reference/endpoints.md (18104b), scripts/crawlora.sh (4508b), skill-card.md (2242b), SKILL.md (4512b), _meta.json (133b)\n\nFile v1.0.19:SKILL.md\n\n---\nname: book-research\ndescription: Researches books, authors, and audiobooks via the Crawlora API — Goodreads (books, authors, reviews, lists, quotes), Apple Books (books, audiobooks, series, reviews, charts), and Audible (audiobook catalog search, product detail, narrators/series, reviews, charts, editorial lists) — returning clean JSON. Use when the user wants a book's ratings/reviews, an author's bibliography, curated reading lists, or audiobook details and charts.\n---\n\n# Book & audiobook research\n\nLook up books, authors, reviews, and audiobooks across Goodreads, Apple\nBooks, and Audible as normalized JSON from the Crawlora API — no scraping\nbook-catalog pages.\n\n## When to use this skill\n\n- \"What's the rating / reviews for this book?\"\n- \"What has this author written?\" (bibliography, quotes)\n- \"Give me a curated list\" (Goodreads genre/lists pages).\n- \"Find this on Apple Books / is there an audiobook?\"\n- \"What's charting on Apple Books / Audible right now?\"\n- \"Who narrates this audiobook, and what else is in the series?\" (Audible)\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Goodreads** — `/goodreads/search` (`q`) to find a book/author id, then\n   `/goodreads/book/{id}` (+ `/reviews`, `/editions`) or\n   `/goodreads/author/{id}` (+ `/books`, `/quotes`). `/goodreads/genre/{name}`\n   and `/goodreads/list/{id}` (browse via `/goodreads/lists`) cover curated\n   browsing.\n2. **Apple Books** — `/apple-books/search` (`term`) to find a book id, then\n   `/apple-books/book/{id}` (+ `/reviews`, `/similar`) or\n   `/apple-books/author/{id}`. Audiobooks mirror this:\n   `/apple-books/audiobook/search` → `/apple-books/audiobook/{id}` (+\n   `/reviews`, `/similar`), with `/apple-books/audiobook-series/{id}` and\n   `/apple-books/series/{id}` for series. `/apple-books/charts` shows what's\n   popular by country/genre.\n3. **Audible** — `/audible/search` (`keywords`) to find a title's `asin`,\n   then `/audible/product/{asin}` for detail (narrators, runtime, series)\n   plus `/audible/product/{asin}/reviews` and `/audible/product/{asin}/related`.\n   `/audible/series/{asin}` walks a series; `/audible/categories` and\n   `/audible/category/{id}` browse by genre; `/audible/charts` and\n   `/audible/list/{list}` cover bestseller/editorial lists.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Goodreads,\nApple Books, and Audible endpoint this skill uses.\n\n## Examples\n\n- **Author bibliography:** `/goodreads/author/{id}/books` (or\n  `/apple-books/author/{id}`) for a full backlist, cross-checked against\n  `/goodreads/book/{id}/reviews` for reception.\n- **\"What should I read next?\"** — `/apple-books/book/{id}/similar` or a\n  Goodreads genre/list page for recommendations in a category.\n- **Audiobook vs. print check:** `/apple-books/book/{id}` alongside\n  `/apple-books/audiobook/search` or `/audible/search` for the same title\n  to see if a narrated edition exists and who narrates it.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public catalog/review pages.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Detail endpoints need the platform's own id — resolve via `.../search`\n  first if you only have a title/author name.\n- Reviews and lists are paginated (`page`/`limit`) — walk pages for full coverage.\n\nFile v1.0.19:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"book-research\",\n  \"version\": \"1.0.19\",\n  \"publishedAt\": 1789954144775\n}\n\nFile v1.0.19:reference/endpoints.md\n\n# book-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**33 endpoints across 3 platform group(s).**\n\n## Goodreads (10)\n\n### `goodreads_author`\n\n- **HTTP:** `GET /goodreads/author/{id}`\n- **What:** Get a Goodreads author. Returns a normalized Goodreads author profile: bio, birth/death dates, website, genres, photo, and aggregate rating stats. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id\n\n### `goodreads_author_books`\n\n- **HTTP:** `GET /goodreads/author/{id}/books`\n- **What:** List a Goodreads author's books. Returns an author's paginated works list (title, author, average rating, ratings count). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_author_quotes`\n\n- **HTTP:** `GET /goodreads/author/{id}/quotes`\n- **What:** List a Goodreads author's attributed quotes. Returns an author's paginated attributed-quotes list (quote text, tags, like count, and — when the quote is credited to a specific book — that book's title, id, and work id). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book`\n\n- **HTTP:** `GET /goodreads/book/{id}`\n- **What:** Get a Goodreads book. Returns a normalized Goodreads book: description, authors, series, genres, format, pages, publisher, publication date, ISBNs, and aggregate rating with the full 1-5 star distribution. Credential-free public Goodreads data (goodreads.com), parsed from the book page's embedded GraphQL cache.\n- **Params:** `id` (string, **required**) — Goodreads book id\n\n### `goodreads_book_editions`\n\n- **HTTP:** `GET /goodreads/book/{id}/editions`\n- **What:** List a Goodreads book's editions. Returns a work's paginated edition list (per-edition book id, format, page count, publication date, publisher, ISBN/ISBN13/ASIN, language, and rating) — every other translation, printing, and format of the requested book id. Goodreads keys editions by a separate \"work id\", not the book id in the path, so this makes one extra internal request to resolve it; requests against a book with no editions data return an upstream error.\n- **Params:** `id` (string, **required**) — Goodreads book id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book_reviews`\n\n- **HTTP:** `GET /goodreads/book/{id}/reviews`\n- **What:** Get a Goodreads book's featured reviews. Returns a book's featured reviews (reviewer, rating, text, date, like/comment counts, spoiler flag), sorted by like count. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads book id; `limit` (integer, optional) — Max reviews, default 10, max 50\n\n### `goodreads_genre`\n\n- **HTTP:** `GET /goodreads/genre/{name}`\n- **What:** Get a Goodreads genre shelf. Returns up to 50 books on a Goodreads genre/shelf tag page (e.g. fantasy, romance, science-fiction), Goodreads' credential-free per-tag \"top books\" view: title, author, average rating, ratings count, publication year, and how many times the book was shelved under this specific tag. Goodreads' genre/shelf taxonomy is an open, user-generated folksonomy of thousands of tags, not a small fixed list, so there is no directory endpoint — pass any known tag slug, e.g. from a book's genres[] field or a value seen on goodreads.com. There is no pagination beyond the first 50.\n- **Params:** `name` (string, **required**) — Goodreads genre/shelf tag\n\n### `goodreads_list`\n\n- **HTTP:** `GET /goodreads/list/{id}`\n- **What:** Get a Goodreads Listopia list. Returns a Goodreads Listopia list (ranked book list) by id, paginated. Credential-free public Goodreads data; page 1 of well-known lists may be served from a faster live source, with the public list page itself as fallback for every other case.\n- **Params:** `id` (string, **required**) — Goodreads list id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_lists`\n\n- **HTTP:** `GET /goodreads/lists`\n- **What:** List curated Goodreads Listopia lists. Returns a catalog of well-known Goodreads Listopia lists (id, name, category). Goodreads has no directory or search endpoint for the tens of thousands of user-created lists, so this is served from a live popular-lists source when available, falling back to a curated, hand-picked catalog otherwise. Pass a returned id to GET /goodreads/list/{id} for that list's ranked book contents. Category enum: `general`, `genre`, `era`, `young_adult`, `children`, `holiday`.\n- **Params:** _none_\n\n### `goodreads_search`\n\n- **HTTP:** `GET /goodreads/search`\n- **What:** Search Goodreads books. Searches Goodreads books by title/author. Credential-free public Goodreads data via the autocomplete endpoint (book results only).\n- **Params:** `limit` (integer, optional) — Max results, default 10, max 50; `q` (string, **required**) — Search query\n\n## AppleBooks (12)\n\n### `apple_books_audiobook`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}`\n- **What:** Retrieve Apple Books audiobook details. Returns normalized audiobook metadata from Apple Books' public catalog page, including narrator, duration, audio preview, and a cross-link to the ebook edition (when one exists).\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_reviews`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/reviews`\n- **What:** Retrieve Apple Books audiobook customer reviews. Returns a page of an audiobook's customer reviews. The default first page is served from the audiobook's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_audiobook_search`\n\n- **HTTP:** `GET /apple-books/audiobook/search`\n- **What:** Search Apple Books audiobooks. Returns normalized Apple Books audiobooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of audiobooks per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_audiobook_series`\n\n- **HTTP:** `GET /apple-books/audiobook-series/{id}`\n- **What:** Retrieve an Apple Books audiobook series and its full audiobook list. Returns series metadata and the full ordered list of audiobooks in the series from Apple Books' public catalog page. An audio-book-series is a catalog resource distinct from a book-series, even for the same conceptual series.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook series ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_similar`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" audiobooks. Returns the related audiobooks shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_author`\n\n- **HTTP:** `GET /apple-books/author/{id}`\n- **What:** Retrieve an Apple Books author's bibliography. Returns author metadata and their full ebook (and audiobook, where available) bibliography from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric author ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book`\n\n- **HTTP:** `GET /apple-books/book/{id}`\n- **What:** Retrieve Apple Books book details. Returns normalized book metadata from Apple Books' public catalog page, including ISBN, page count, publisher, audience, rating histogram, and series linkage.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book_reviews`\n\n- **HTTP:** `GET /apple-books/book/{id}/reviews`\n- **What:** Retrieve Apple Books customer reviews. Returns a page of a book's customer reviews. The default first page is served from the book's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_book_similar`\n\n- **HTTP:** `GET /apple-books/book/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" books. Returns the related books shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_charts`\n\n- **HTTP:** `GET /apple-books/charts`\n- **What:** Retrieve Apple Books chart rankings. Returns Apple Books chart rankings from Apple's public marketing-tools RSS JSON feed. Supported collections are `top-free` and `top-paid`.\n- **Params:** `collection` (string, optional) — Chart collection. Allowed values: top-free, top-paid; `country` (string, optional) — Two-letter storefront country code; `genre` (integer, optional) — Optional Apple Books genre ID to filter the chart; `limit` (integer, optional) — Number of chart items to return\n\n### `apple_books_search`\n\n- **HTTP:** `GET /apple-books/search`\n- **What:** Search Apple Books titles. Returns normalized Apple Books ebooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of books per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_series`\n\n- **HTTP:** `GET /apple-books/series/{id}`\n- **What:** Retrieve an Apple Books series and its full book list. Returns series metadata and the full ordered list of books in the series from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric series ID; `lang` (string, optional) — Result language tag\n\n## Audible (11)\n\n### `audible_author_charts`\n\n- **HTTP:** `GET /audible/charts/authors`\n- **What:** Get Audible's top-author chart. Returns one page of Audible's public ranked author chart. This is a people-shaped HTML surface and exposes only rank, author identity, image metadata when available, and a canonical author URI; author detail remains outside the credential-free public surface.\n- **Params:** `page` (integer, optional) — 1-based result page, default 1\n\n### `audible_categories`\n\n- **HTTP:** `GET /audible/categories`\n- **What:** Get Audible's genre/category tree. Returns Audible's full genre/category tree (root genres with their subgenres), including the category ids accepted by GET /audible/search's category_id filter. Credential-free public catalog data from api.audible.com.\n- **Params:** _none_\n\n### `audible_category`\n\n- **HTTP:** `GET /audible/category/{id}`\n- **What:** Get one Audible category node. Returns one Audible category node and its immediate children by id — cheaper than fetching the full tree from GET /audible/categories when only one node is needed. Credential-free public catalog data from api.audible.com.\n- **Params:** `id` (string, **required**) — Audible category id from GET /audible/categories\n\n### `audible_charts`\n\n- **HTTP:** `GET /audible/charts`\n- **What:** Get an Audible chart (audible.com/charts). Returns one page of an Audible chart — a ranked list with real chart position, price, and rating that has no equivalent on api.audible.com's public JSON API. This is an HTML scrape of audible.com/charts, a different, less stable source class than the rest of this family, though its own filters (category, access level, language, duration, Audible-Originals-only) were individually verified to actually change results. category_id, access_level, and content_type=podcasts are mutually exclusive.\n- **Params:** `access_level` (string, optional) — Membership access level, default all; `category_id` (string, optional) — Restrict to a category id from GET /audible/categories; `chart` (string, optional) — Chart type, default most_listened; `content_type` (string, optional) — Content type, default audiobooks; `duration` (string, optional) — Runtime-length filter, default all; `language` (string, optional) — Language filter, default all; `originals_only` (boolean, optional) — Restrict to Audible Originals only; `page` (integer, optional) — 1-based result page, default 1, 20 results per page\n\n### `audible_editorial_list`\n\n- **HTTP:** `GET /audible/list/{list}`\n- **What:** Get an Audible curated editorial list. Returns one of Audible's hand-curated \"Popular Lists\" pages, normalized into its themed shelves (heading + ordered ASINs). This is an HTML scrape of a marketing/editorial page (audible.com), not api.audible.com's JSON API — pair an ASIN from any shelf with GET /audible/products (batch) or GET /audible/product/{asin} for full title/author/price/rating detail. \"Best of the Year\" is not covered — its layout has no consistent structure to parse.\n- **Params:** `list` (string, **required**) — Editorial list slug\n\n### `audible_product`\n\n- **HTTP:** `GET /audible/product/{asin}`\n- **What:** Get an Audible audiobook. Returns a normalized Audible audiobook: description, authors, narrators, series, category ladders, publisher, release date, runtime, language, sample audio URL, rating (overall/performance/story), and public list price. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN\n\n### `audible_product_related`\n\n- **HTTP:** `GET /audible/product/{asin}/related`\n- **What:** Get Audible titles related to an audiobook. Returns Audible titles related to a given ASIN by a required relation type: same series, same narrator, same author, next in series, or raw upstream similarity. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN; `limit` (integer, optional) — Max results, default 10, max 50; `similarity_type` (string, **required**) — How to relate titles to the given ASIN\n\n### `audible_product_reviews`\n\n- **HTTP:** `GET /audible/product/{asin}/reviews`\n- **What:** Get an Audible audiobook's customer reviews. Returns a page of an Audible audiobook's customer reviews (author, title, body, overall/performance/story ratings, helpful votes, submission date). Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN; `limit` (integer, optional) — Max reviews, default 10, max 50; `page` (integer, optional) — Zero-based result page, default 0\n\n### `audible_products`\n\n- **HTTP:** `GET /audible/products`\n- **What:** Get multiple Audible audiobooks in one call. Returns normalized Audible audiobooks for up to 50 ASINs in a single request — the same fields as GET /audible/product/{asin}. Unrecognized ASINs are silently omitted rather than failing the whole batch. Credential-free public catalog data from api.audible.com.\n- **Params:** `asins` (string, **required**) — Comma-separated Audible ASINs, up to 50\n\n### `audible_search`\n\n- **HTTP:** `GET /audible/search`\n- **What:** Search Audible's catalog. Searches Audible's audiobook catalog by keyword, title, author, narrator, or category id. At least one filter is required. Credential-free public catalog data from api.audible.com.\n- **Params:** `author` (string, optional) — Match by author name; `category_id` (string, optional) — Restrict to a category id from GET /audible/categories; `limit` (integer, optional) — Max results, default 10, max 50; `narrator` (string, optional) — Match by narrator name; `page` (integer, optional) — Zero-based result page, default 0; `q` (string, optional) — Free-text query matched across title, subtitle, and author; `title` (string, optional) — Match by title\n\n### `audible_series`\n\n- **HTTP:** `GET /audible/series/{asin}`\n- **What:** Get an Audible series' ordered book list. Returns an Audible series and every book in it, in series order. A series has its own ASIN distinct from any book in it — find one via a book's series[].asin field from GET /audible/product/{asin}. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible series ASIN, from a product's series[].asin field\n\nFile v1.0.19:skill-card.md\n\n## Description:\n\nResearches books, authors, and audiobooks via the Crawlora API across Goodreads, Apple Books, and Audible, returning clean JSON for ratings, reviews, bibliographies, curated lists, audiobook details, and charts.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to research public book, author, review, list, chart, and audiobook data from Goodreads, Apple Books, and Audible through Crawlora. It is suited for answering questions about ratings, reviews, bibliographies, reading lists, audiobook availability, narrators, series, and popularity charts.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Book, author, audiobook, review, list, chart, and related query parameters are sent to Crawlora along with the user's Crawlora API key.\n\nMitigation: Use this skill only when that third-party transmission is acceptable, and avoid sensitive private reading data.\n\nRisk: The helper requires a Crawlora API key to access the service.\n\nMitigation: Keep CRAWLORA_API_KEY in the environment, do not hardcode or commit it, and rely on the helper's documented key-handling path.\n\n## Reference(s):\n\n- [book-research endpoint reference](reference/endpoints.md)\n- [Crawlora skill page](https://clawhub.ai/crawlora-org/skills/book-research)\n- [Crawlora](https://crawlora.net)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, JSON, Guidance]\n\n**Output Format:** [Markdown guidance with shell commands that call the Crawlora helper and return JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and sends GET requests to documented Crawlora book, author, review, list, chart, and audiobook endpoints.]\n\n## Skill Version(s):\n\n1.0.19 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.18: 5 files, 9816 bytes\n\nFiles: reference/endpoints.md (17652b), scripts/crawlora.sh (4459b), skill-card.md (2299b), SKILL.md (4512b), _meta.json (133b)\n\nFile v1.0.18:SKILL.md\n\n---\nname: book-research\ndescription: Researches books, authors, and audiobooks via the Crawlora API — Goodreads (books, authors, reviews, lists, quotes), Apple Books (books, audiobooks, series, reviews, charts), and Audible (audiobook catalog search, product detail, narrators/series, reviews, charts, editorial lists) — returning clean JSON. Use when the user wants a book's ratings/reviews, an author's bibliography, curated reading lists, or audiobook details and charts.\n---\n\n# Book & audiobook research\n\nLook up books, authors, reviews, and audiobooks across Goodreads, Apple\nBooks, and Audible as normalized JSON from the Crawlora API — no scraping\nbook-catalog pages.\n\n## When to use this skill\n\n- \"What's the rating / reviews for this book?\"\n- \"What has this author written?\" (bibliography, quotes)\n- \"Give me a curated list\" (Goodreads genre/lists pages).\n- \"Find this on Apple Books / is there an audiobook?\"\n- \"What's charting on Apple Books / Audible right now?\"\n- \"Who narrates this audiobook, and what else is in the series?\" (Audible)\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Goodreads** — `/goodreads/search` (`q`) to find a book/author id, then\n   `/goodreads/book/{id}` (+ `/reviews`, `/editions`) or\n   `/goodreads/author/{id}` (+ `/books`, `/quotes`). `/goodreads/genre/{name}`\n   and `/goodreads/list/{id}` (browse via `/goodreads/lists`) cover curated\n   browsing.\n2. **Apple Books** — `/apple-books/search` (`term`) to find a book id, then\n   `/apple-books/book/{id}` (+ `/reviews`, `/similar`) or\n   `/apple-books/author/{id}`. Audiobooks mirror this:\n   `/apple-books/audiobook/search` → `/apple-books/audiobook/{id}` (+\n   `/reviews`, `/similar`), with `/apple-books/audiobook-series/{id}` and\n   `/apple-books/series/{id}` for series. `/apple-books/charts` shows what's\n   popular by country/genre.\n3. **Audible** — `/audible/search` (`keywords`) to find a title's `asin`,\n   then `/audible/product/{asin}` for detail (narrators, runtime, series)\n   plus `/audible/product/{asin}/reviews` and `/audible/product/{asin}/related`.\n   `/audible/series/{asin}` walks a series; `/audible/categories` and\n   `/audible/category/{id}` browse by genre; `/audible/charts` and\n   `/audible/list/{list}` cover bestseller/editorial lists.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Goodreads,\nApple Books, and Audible endpoint this skill uses.\n\n## Examples\n\n- **Author bibliography:** `/goodreads/author/{id}/books` (or\n  `/apple-books/author/{id}`) for a full backlist, cross-checked against\n  `/goodreads/book/{id}/reviews` for reception.\n- **\"What should I read next?\"** — `/apple-books/book/{id}/similar` or a\n  Goodreads genre/list page for recommendations in a category.\n- **Audiobook vs. print check:** `/apple-books/book/{id}` alongside\n  `/apple-books/audiobook/search` or `/audible/search` for the same title\n  to see if a narrated edition exists and who narrates it.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public catalog/review pages.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Detail endpoints need the platform's own id — resolve via `.../search`\n  first if you only have a title/author name.\n- Reviews and lists are paginated (`page`/`limit`) — walk pages for full coverage.\n\nFile v1.0.18:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"book-research\",\n  \"version\": \"1.0.18\",\n  \"publishedAt\": 1789640565419\n}\n\nFile v1.0.18:reference/endpoints.md\n\n# book-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**32 endpoints across 3 platform group(s).**\n\n## Goodreads (10)\n\n### `goodreads_author`\n\n- **HTTP:** `GET /goodreads/author/{id}`\n- **What:** Get a Goodreads author. Returns a normalized Goodreads author profile: bio, birth/death dates, website, genres, photo, and aggregate rating stats. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id\n\n### `goodreads_author_books`\n\n- **HTTP:** `GET /goodreads/author/{id}/books`\n- **What:** List a Goodreads author's books. Returns an author's paginated works list (title, author, average rating, ratings count). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_author_quotes`\n\n- **HTTP:** `GET /goodreads/author/{id}/quotes`\n- **What:** List a Goodreads author's attributed quotes. Returns an author's paginated attributed-quotes list (quote text, tags, like count, and — when the quote is credited to a specific book — that book's title, id, and work id). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book`\n\n- **HTTP:** `GET /goodreads/book/{id}`\n- **What:** Get a Goodreads book. Returns a normalized Goodreads book: description, authors, series, genres, format, pages, publisher, publication date, ISBNs, and aggregate rating with the full 1-5 star distribution. Credential-free public Goodreads data (goodreads.com), parsed from the book page's embedded GraphQL cache.\n- **Params:** `id` (string, **required**) — Goodreads book id\n\n### `goodreads_book_editions`\n\n- **HTTP:** `GET /goodreads/book/{id}/editions`\n- **What:** List a Goodreads book's editions. Returns a work's paginated edition list (per-edition book id, format, page count, publication date, publisher, ISBN/ISBN13/ASIN, language, and rating) — every other translation, printing, and format of the requested book id. Goodreads keys editions by a separate \"work id\", not the book id in the path, so this makes one extra internal request to resolve it; requests against a book with no editions data return an upstream error.\n- **Params:** `id` (string, **required**) — Goodreads book id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book_reviews`\n\n- **HTTP:** `GET /goodreads/book/{id}/reviews`\n- **What:** Get a Goodreads book's featured reviews. Returns a book's featured reviews (reviewer, rating, text, date, like/comment counts, spoiler flag), sorted by like count. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads book id; `limit` (integer, optional) — Max reviews, default 10, max 50\n\n### `goodreads_genre`\n\n- **HTTP:** `GET /goodreads/genre/{name}`\n- **What:** Get a Goodreads genre shelf. Returns up to 50 books on a Goodreads genre/shelf tag page (e.g. fantasy, romance, science-fiction), Goodreads' credential-free per-tag \"top books\" view: title, author, average rating, ratings count, publication year, and how many times the book was shelved under this specific tag. Goodreads' genre/shelf taxonomy is an open, user-generated folksonomy of thousands of tags, not a small fixed list, so there is no directory endpoint — pass any known tag slug, e.g. from a book's genres[] field or a value seen on goodreads.com. There is no pagination beyond the first 50.\n- **Params:** `name` (string, **required**) — Goodreads genre/shelf tag\n\n### `goodreads_list`\n\n- **HTTP:** `GET /goodreads/list/{id}`\n- **What:** Get a Goodreads Listopia list. Returns a Goodreads Listopia list (ranked book list) by id, paginated. Credential-free public Goodreads data; page 1 of well-known lists may be served from a faster live source, with the public list page itself as fallback for every other case.\n- **Params:** `id` (string, **required**) — Goodreads list id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_lists`\n\n- **HTTP:** `GET /goodreads/lists`\n- **What:** List curated Goodreads Listopia lists. Returns a catalog of well-known Goodreads Listopia lists (id, name, category). Goodreads has no directory or search endpoint for the tens of thousands of user-created lists, so this is served from a live popular-lists source when available, falling back to a curated, hand-picked catalog otherwise. Pass a returned id to GET /goodreads/list/{id} for that list's ranked book contents. Category enum: `general`, `genre`, `era`, `young_adult`, `children`, `holiday`.\n- **Params:** _none_\n\n### `goodreads_search`\n\n- **HTTP:** `GET /goodreads/search`\n- **What:** Search Goodreads books. Searches Goodreads books by title/author. Credential-free public Goodreads data via the autocomplete endpoint (book results only).\n- **Params:** `limit` (integer, optional) — Max results, default 10, max 50; `q` (string, **required**) — Search query\n\n## AppleBooks (12)\n\n### `apple_books_audiobook`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}`\n- **What:** Retrieve Apple Books audiobook details. Returns normalized audiobook metadata from Apple Books' public catalog page, including narrator, duration, audio preview, and a cross-link to the ebook edition (when one exists).\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_reviews`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/reviews`\n- **What:** Retrieve Apple Books audiobook customer reviews. Returns a page of an audiobook's customer reviews. The default first page is served from the audiobook's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_audiobook_search`\n\n- **HTTP:** `GET /apple-books/audiobook/search`\n- **What:** Search Apple Books audiobooks. Returns normalized Apple Books audiobooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of audiobooks per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_audiobook_series`\n\n- **HTTP:** `GET /apple-books/audiobook-series/{id}`\n- **What:** Retrieve an Apple Books audiobook series and its full audiobook list. Returns series metadata and the full ordered list of audiobooks in the series from Apple Books' public catalog page. An audio-book-series is a catalog resource distinct from a book-series, even for the same conceptual series.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook series ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_similar`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" audiobooks. Returns the related audiobooks shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_author`\n\n- **HTTP:** `GET /apple-books/author/{id}`\n- **What:** Retrieve an Apple Books author's bibliography. Returns author metadata and their full ebook (and audiobook, where available) bibliography from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric author ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book`\n\n- **HTTP:** `GET /apple-books/book/{id}`\n- **What:** Retrieve Apple Books book details. Returns normalized book metadata from Apple Books' public catalog page, including ISBN, page count, publisher, audience, rating histogram, and series linkage.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book_reviews`\n\n- **HTTP:** `GET /apple-books/book/{id}/reviews`\n- **What:** Retrieve Apple Books customer reviews. Returns a page of a book's customer reviews. The default first page is served from the book's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_book_similar`\n\n- **HTTP:** `GET /apple-books/book/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" books. Returns the related books shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_charts`\n\n- **HTTP:** `GET /apple-books/charts`\n- **What:** Retrieve Apple Books chart rankings. Returns Apple Books chart rankings from Apple's public marketing-tools RSS JSON feed. Supported collections are `top-free` and `top-paid`.\n- **Params:** `collection` (string, optional) — Chart collection. Allowed values: top-free, top-paid; `country` (string, optional) — Two-letter storefront country code; `genre` (integer, optional) — Optional Apple Books genre ID to filter the chart; `limit` (integer, optional) — Number of chart items to return\n\n### `apple_books_search`\n\n- **HTTP:** `GET /apple-books/search`\n- **What:** Search Apple Books titles. Returns normalized Apple Books ebooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of books per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_series`\n\n- **HTTP:** `GET /apple-books/series/{id}`\n- **What:** Retrieve an Apple Books series and its full book list. Returns series metadata and the full ordered list of books in the series from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric series ID; `lang` (string, optional) — Result language tag\n\n## Audible (10)\n\n### `audible_categories`\n\n- **HTTP:** `GET /audible/categories`\n- **What:** Get Audible's genre/category tree. Returns Audible's full genre/category tree (root genres with their subgenres), including the category ids accepted by GET /audible/search's category_id filter. Credential-free public catalog data from api.audible.com.\n- **Params:** _none_\n\n### `audible_category`\n\n- **HTTP:** `GET /audible/category/{id}`\n- **What:** Get one Audible category node. Returns one Audible category node and its immediate children by id — cheaper than fetching the full tree from GET /audible/categories when only one node is needed. Credential-free public catalog data from api.audible.com.\n- **Params:** `id` (string, **required**) — Audible category id from GET /audible/categories\n\n### `audible_charts`\n\n- **HTTP:** `GET /audible/charts`\n- **What:** Get an Audible chart (audible.com/charts). Returns one page of an Audible chart — a ranked list with real chart position, price, and rating that has no equivalent on api.audible.com's public JSON API. This is an HTML scrape of audible.com/charts, a different, less stable source class than the rest of this family, though its own filters (category, access level, language, duration, Audible-Originals-only) were individually verified to actually change results. category_id, access_level, and content_type=podcasts are mutually exclusive.\n- **Params:** `access_level` (string, optional) — Membership access level, default all; `category_id` (string, optional) — Restrict to a category id from GET /audible/categories; `chart` (string, optional) — Chart type, default most_listened; `content_type` (string, optional) — Content type, default audiobooks; `duration` (string, optional) — Runtime-length filter, default all; `language` (string, optional) — Language filter, default all; `originals_only` (boolean, optional) — Restrict to Audible Originals only; `page` (integer, optional) — 1-based result page, default 1, 20 results per page\n\n### `audible_editorial_list`\n\n- **HTTP:** `GET /audible/list/{list}`\n- **What:** Get an Audible curated editorial list. Returns one of Audible's hand-curated \"Popular Lists\" pages, normalized into its themed shelves (heading + ordered ASINs). This is an HTML scrape of a marketing/editorial page (audible.com), not api.audible.com's JSON API — pair an ASIN from any shelf with GET /audible/products (batch) or GET /audible/product/{asin} for full title/author/price/rating detail. \"Best of the Year\" is not covered — its layout has no consistent structure to parse.\n- **Params:** `list` (string, **required**) — Editorial list slug\n\n### `audible_product`\n\n- **HTTP:** `GET /audible/product/{asin}`\n- **What:** Get an Audible audiobook. Returns a normalized Audible audiobook: description, authors, narrators, series, category ladders, publisher, release date, runtime, language, sample audio URL, rating (overall/performance/story), and public list price. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN\n\n### `audible_product_related`\n\n- **HTTP:** `GET /audible/product/{asin}/related`\n- **What:** Get Audible titles related to an audiobook. Returns Audible titles related to a given ASIN by a required relation type: same series, same narrator, same author, next in series, or raw upstream similarity. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN; `limit` (integer, optional) — Max results, default 10, max 50; `similarity_type` (string, **required**) — How to relate titles to the given ASIN\n\n### `audible_product_reviews`\n\n- **HTTP:** `GET /audible/product/{asin}/reviews`\n- **What:** Get an Audible audiobook's customer reviews. Returns a page of an Audible audiobook's customer reviews (author, title, body, overall/performance/story ratings, helpful votes, submission date). Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN; `limit` (integer, optional) — Max reviews, default 10, max 50; `page` (integer, optional) — Zero-based result page, default 0\n\n### `audible_products`\n\n- **HTTP:** `GET /audible/products`\n- **What:** Get multiple Audible audiobooks in one call. Returns normalized Audible audiobooks for up to 50 ASINs in a single request — the same fields as GET /audible/product/{asin}. Unrecognized ASINs are silently omitted rather than failing the whole batch. Credential-free public catalog data from api.audible.com.\n- **Params:** `asins` (string, **required**) — Comma-separated Audible ASINs, up to 50\n\n### `audible_search`\n\n- **HTTP:** `GET /audible/search`\n- **What:** Search Audible's catalog. Searches Audible's audiobook catalog by keyword, title, author, narrator, or category id. At least one filter is required. Credential-free public catalog data from api.audible.com.\n- **Params:** `author` (string, optional) — Match by author name; `category_id` (string, optional) — Restrict to a category id from GET /audible/categories; `limit` (integer, optional) — Max results, default 10, max 50; `narrator` (string, optional) — Match by narrator name; `page` (integer, optional) — Zero-based result page, default 0; `q` (string, optional) — Free-text query matched across title, subtitle, and author; `title` (string, optional) — Match by title\n\n### `audible_series`\n\n- **HTTP:** `GET /audible/series/{asin}`\n- **What:** Get an Audible series' ordered book list. Returns an Audible series and every book in it, in series order. A series has its own ASIN distinct from any book in it — find one via a book's series[].asin field from GET /audible/product/{asin}. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible series ASIN, from a product's series[].asin field\n\nFile v1.0.18:skill-card.md\n\n## Description:\n\nResearches books, authors, and audiobooks via the Crawlora API across Goodreads, Apple Books, and Audible, returning normalized JSON for ratings, reviews, bibliographies, lists, audiobook details, and charts.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to look up public book, author, review, list, chart, and audiobook catalog data through Crawlora. It is useful for answering reading research questions, comparing print and audiobook availability, and retrieving normalized metadata from Goodreads, Apple Books, and Audible.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Book and audiobook search terms and the Crawlora API key are sent to Crawlora.\n\nMitigation: Use the skill only when that provider relationship is acceptable, avoid private or sensitive search terms, and keep the key in CRAWLORA_API_KEY rather than hardcoding it.\n\nRisk: API calls may consume Crawlora credits and return only public catalog or review data available through the supported sources.\n\nMitigation: Review planned queries before execution, monitor account usage, and rely on the documented endpoint reference for supported routes and pagination.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/book-research)\n- [ClawHub publisher profile](https://clawhub.ai/user/crawlora-org)\n\n## Skill Output:\n\n**Output Type(s):** [json, shell commands, configuration, guidance]\n\n**Output Format:** [JSON from Crawlora API responses, usually accompanied by concise Markdown guidance and shell command examples.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and uses a documented GET-only route catalog.]\n\n## Skill Version(s):\n\n1.0.18 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.17: 5 files, 10317 bytes\n\nFiles: reference/endpoints.md (17652b), scripts/crawlora.sh (5381b), skill-card.md (2399b), SKILL.md (4512b), _meta.json (133b)\n\nFile v1.0.17:SKILL.md\n\n---\nname: book-research\ndescription: Researches books, authors, and audiobooks via the Crawlora API — Goodreads (books, authors, reviews, lists, quotes), Apple Books (books, audiobooks, series, reviews, charts), and Audible (audiobook catalog search, product detail, narrators/series, reviews, charts, editorial lists) — returning clean JSON. Use when the user wants a book's ratings/reviews, an author's bibliography, curated reading lists, or audiobook details and charts.\n---\n\n# Book & audiobook research\n\nLook up books, authors, reviews, and audiobooks across Goodreads, Apple\nBooks, and Audible as normalized JSON from the Crawlora API — no scraping\nbook-catalog pages.\n\n## When to use this skill\n\n- \"What's the rating / reviews for this book?\"\n- \"What has this author written?\" (bibliography, quotes)\n- \"Give me a curated list\" (Goodreads genre/lists pages).\n- \"Find this on Apple Books / is there an audiobook?\"\n- \"What's charting on Apple Books / Audible right now?\"\n- \"Who narrates this audiobook, and what else is in the series?\" (Audible)\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Goodreads** — `/goodreads/search` (`q`) to find a book/author id, then\n   `/goodreads/book/{id}` (+ `/reviews`, `/editions`) or\n   `/goodreads/author/{id}` (+ `/books`, `/quotes`). `/goodreads/genre/{name}`\n   and `/goodreads/list/{id}` (browse via `/goodreads/lists`) cover curated\n   browsing.\n2. **Apple Books** — `/apple-books/search` (`term`) to find a book id, then\n   `/apple-books/book/{id}` (+ `/reviews`, `/similar`) or\n   `/apple-books/author/{id}`. Audiobooks mirror this:\n   `/apple-books/audiobook/search` → `/apple-books/audiobook/{id}` (+\n   `/reviews`, `/similar`), with `/apple-books/audiobook-series/{id}` and\n   `/apple-books/series/{id}` for series. `/apple-books/charts` shows what's\n   popular by country/genre.\n3. **Audible** — `/audible/search` (`keywords`) to find a title's `asin`,\n   then `/audible/product/{asin}` for detail (narrators, runtime, series)\n   plus `/audible/product/{asin}/reviews` and `/audible/product/{asin}/related`.\n   `/audible/series/{asin}` walks a series; `/audible/categories` and\n   `/audible/category/{id}` browse by genre; `/audible/charts` and\n   `/audible/list/{list}` cover bestseller/editorial lists.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Goodreads,\nApple Books, and Audible endpoint this skill uses.\n\n## Examples\n\n- **Author bibliography:** `/goodreads/author/{id}/books` (or\n  `/apple-books/author/{id}`) for a full backlist, cross-checked against\n  `/goodreads/book/{id}/reviews` for reception.\n- **\"What should I read next?\"** — `/apple-books/book/{id}/similar` or a\n  Goodreads genre/list page for recommendations in a category.\n- **Audiobook vs. print check:** `/apple-books/book/{id}` alongside\n  `/apple-books/audiobook/search` or `/audible/search` for the same title\n  to see if a narrated edition exists and who narrates it.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public catalog/review pages.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Detail endpoints need the platform's own id — resolve via `.../search`\n  first if you only have a title/author name.\n- Reviews and lists are paginated (`page`/`limit`) — walk pages for full coverage.\n\nFile v1.0.17:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"book-research\",\n  \"version\": \"1.0.17\",\n  \"publishedAt\": 1789349625073\n}\n\nFile v1.0.17:reference/endpoints.md\n\n# book-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**32 endpoints across 3 platform group(s).**\n\n## Goodreads (10)\n\n### `goodreads_author`\n\n- **HTTP:** `GET /goodreads/author/{id}`\n- **What:** Get a Goodreads author. Returns a normalized Goodreads author profile: bio, birth/death dates, website, genres, photo, and aggregate rating stats. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id\n\n### `goodreads_author_books`\n\n- **HTTP:** `GET /goodreads/author/{id}/books`\n- **What:** List a Goodreads author's books. Returns an author's paginated works list (title, author, average rating, ratings count). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_author_quotes`\n\n- **HTTP:** `GET /goodreads/author/{id}/quotes`\n- **What:** List a Goodreads author's attributed quotes. Returns an author's paginated attributed-quotes list (quote text, tags, like count, and — when the quote is credited to a specific book — that book's title, id, and work id). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book`\n\n- **HTTP:** `GET /goodreads/book/{id}`\n- **What:** Get a Goodreads book. Returns a normalized Goodreads book: description, authors, series, genres, format, pages, publisher, publication date, ISBNs, and aggregate rating with the full 1-5 star distribution. Credential-free public Goodreads data (goodreads.com), parsed from the book page's embedded GraphQL cache.\n- **Params:** `id` (string, **required**) — Goodreads book id\n\n### `goodreads_book_editions`\n\n- **HTTP:** `GET /goodreads/book/{id}/editions`\n- **What:** List a Goodreads book's editions. Returns a work's paginated edition list (per-edition book id, format, page count, publication date, publisher, ISBN/ISBN13/ASIN, language, and rating) — every other translation, printing, and format of the requested book id. Goodreads keys editions by a separate \"work id\", not the book id in the path, so this makes one extra internal request to resolve it; requests against a book with no editions data return an upstream error.\n- **Params:** `id` (string, **required**) — Goodreads book id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book_reviews`\n\n- **HTTP:** `GET /goodreads/book/{id}/reviews`\n- **What:** Get a Goodreads book's featured reviews. Returns a book's featured reviews (reviewer, rating, text, date, like/comment counts, spoiler flag), sorted by like count. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads book id; `limit` (integer, optional) — Max reviews, default 10, max 50\n\n### `goodreads_genre`\n\n- **HTTP:** `GET /goodreads/genre/{name}`\n- **What:** Get a Goodreads genre shelf. Returns up to 50 books on a Goodreads genre/shelf tag page (e.g. fantasy, romance, science-fiction), Goodreads' credential-free per-tag \"top books\" view: title, author, average rating, ratings count, publication year, and how many times the book was shelved under this specific tag. Goodreads' genre/shelf taxonomy is an open, user-generated folksonomy of thousands of tags, not a small fixed list, so there is no directory endpoint — pass any known tag slug, e.g. from a book's genres[] field or a value seen on goodreads.com. There is no pagination beyond the first 50.\n- **Params:** `name` (string, **required**) — Goodreads genre/shelf tag\n\n### `goodreads_list`\n\n- **HTTP:** `GET /goodreads/list/{id}`\n- **What:** Get a Goodreads Listopia list. Returns a Goodreads Listopia list (ranked book list) by id, paginated. Credential-free public Goodreads data; page 1 of well-known lists may be served from a faster live source, with the public list page itself as fallback for every other case.\n- **Params:** `id` (string, **required**) — Goodreads list id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_lists`\n\n- **HTTP:** `GET /goodreads/lists`\n- **What:** List curated Goodreads Listopia lists. Returns a catalog of well-known Goodreads Listopia lists (id, name, category). Goodreads has no directory or search endpoint for the tens of thousands of user-created lists, so this is served from a live popular-lists source when available, falling back to a curated, hand-picked catalog otherwise. Pass a returned id to GET /goodreads/list/{id} for that list's ranked book contents. Category enum: `general`, `genre`, `era`, `young_adult`, `children`, `holiday`.\n- **Params:** _none_\n\n### `goodreads_search`\n\n- **HTTP:** `GET /goodreads/search`\n- **What:** Search Goodreads books. Searches Goodreads books by title/author. Credential-free public Goodreads data via the autocomplete endpoint (book results only).\n- **Params:** `limit` (integer, optional) — Max results, default 10, max 50; `q` (string, **required**) — Search query\n\n## AppleBooks (12)\n\n### `apple_books_audiobook`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}`\n- **What:** Retrieve Apple Books audiobook details. Returns normalized audiobook metadata from Apple Books' public catalog page, including narrator, duration, audio preview, and a cross-link to the ebook edition (when one exists).\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_reviews`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/reviews`\n- **What:** Retrieve Apple Books audiobook customer reviews. Returns a page of an audiobook's customer reviews. The default first page is served from the audiobook's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_audiobook_search`\n\n- **HTTP:** `GET /apple-books/audiobook/search`\n- **What:** Search Apple Books audiobooks. Returns normalized Apple Books audiobooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of audiobooks per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_audiobook_series`\n\n- **HTTP:** `GET /apple-books/audiobook-series/{id}`\n- **What:** Retrieve an Apple Books audiobook series and its full audiobook list. Returns series metadata and the full ordered list of audiobooks in the series from Apple Books' public catalog page. An audio-book-series is a catalog resource distinct from a book-series, even for the same conceptual series.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook series ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_similar`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" audiobooks. Returns the related audiobooks shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_author`\n\n- **HTTP:** `GET /apple-books/author/{id}`\n- **What:** Retrieve an Apple Books author's bibliography. Returns author metadata and their full ebook (and audiobook, where available) bibliography from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric author ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book`\n\n- **HTTP:** `GET /apple-books/book/{id}`\n- **What:** Retrieve Apple Books book details. Returns normalized book metadata from Apple Books' public catalog page, including ISBN, page count, publisher, audience, rating histogram, and series linkage.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book_reviews`\n\n- **HTTP:** `GET /apple-books/book/{id}/reviews`\n- **What:** Retrieve Apple Books customer reviews. Returns a page of a book's customer reviews. The default first page is served from the book's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_book_similar`\n\n- **HTTP:** `GET /apple-books/book/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" books. Returns the related books shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_charts`\n\n- **HTTP:** `GET /apple-books/charts`\n- **What:** Retrieve Apple Books chart rankings. Returns Apple Books chart rankings from Apple's public marketing-tools RSS JSON feed. Supported collections are `top-free` and `top-paid`.\n- **Params:** `collection` (string, optional) — Chart collection. Allowed values: top-free, top-paid; `country` (string, optional) — Two-letter storefront country code; `genre` (integer, optional) — Optional Apple Books genre ID to filter the chart; `limit` (integer, optional) — Number of chart items to return\n\n### `apple_books_search`\n\n- **HTTP:** `GET /apple-books/search`\n- **What:** Search Apple Books titles. Returns normalized Apple Books ebooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of books per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_series`\n\n- **HTTP:** `GET /apple-books/series/{id}`\n- **What:** Retrieve an Apple Books series and its full book list. Returns series metadata and the full ordered list of books in the series from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric series ID; `lang` (string, optional) — Result language tag\n\n## Audible (10)\n\n### `audible_categories`\n\n- **HTTP:** `GET /audible/categories`\n- **What:** Get Audible's genre/category tree. Returns Audible's full genre/category tree (root genres with their subgenres), including the category ids accepted by GET /audible/search's category_id filter. Credential-free public catalog data from api.audible.com.\n- **Params:** _none_\n\n### `audible_category`\n\n- **HTTP:** `GET /audible/category/{id}`\n- **What:** Get one Audible category node. Returns one Audible category node and its immediate children by id — cheaper than fetching the full tree from GET /audible/categories when only one node is needed. Credential-free public catalog data from api.audible.com.\n- **Params:** `id` (string, **required**) — Audible category id from GET /audible/categories\n\n### `audible_charts`\n\n- **HTTP:** `GET /audible/charts`\n- **What:** Get an Audible chart (audible.com/charts). Returns one page of an Audible chart — a ranked list with real chart position, price, and rating that has no equivalent on api.audible.com's public JSON API. This is an HTML scrape of audible.com/charts, a different, less stable source class than the rest of this family, though its own filters (category, access level, language, duration, Audible-Originals-only) were individually verified to actually change results. category_id, access_level, and content_type=podcasts are mutually exclusive.\n- **Params:** `access_level` (string, optional) — Membership access level, default all; `category_id` (string, optional) — Restrict to a category id from GET /audible/categories; `chart` (string, optional) — Chart type, default most_listened; `content_type` (string, optional) — Content type, default audiobooks; `duration` (string, optional) — Runtime-length filter, default all; `language` (string, optional) — Language filter, default all; `originals_only` (boolean, optional) — Restrict to Audible Originals only; `page` (integer, optional) — 1-based result page, default 1, 20 results per page\n\n### `audible_editorial_list`\n\n- **HTTP:** `GET /audible/list/{list}`\n- **What:** Get an Audible curated editorial list. Returns one of Audible's hand-curated \"Popular Lists\" pages, normalized into its themed shelves (heading + ordered ASINs). This is an HTML scrape of a marketing/editorial page (audible.com), not api.audible.com's JSON API — pair an ASIN from any shelf with GET /audible/products (batch) or GET /audible/product/{asin} for full title/author/price/rating detail. \"Best of the Year\" is not covered — its layout has no consistent structure to parse.\n- **Params:** `list` (string, **required**) — Editorial list slug\n\n### `audible_product`\n\n- **HTTP:** `GET /audible/product/{asin}`\n- **What:** Get an Audible audiobook. Returns a normalized Audible audiobook: description, authors, narrators, series, category ladders, publisher, release date, runtime, language, sample audio URL, rating (overall/performance/story), and public list price. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN\n\n### `audible_product_related`\n\n- **HTTP:** `GET /audible/product/{asin}/related`\n- **What:** Get Audible titles related to an audiobook. Returns Audible titles related to a given ASIN by a required relation type: same series, same narrator, same author, next in series, or raw upstream similarity. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN; `limit` (integer, optional) — Max results, default 10, max 50; `similarity_type` (string, **required**) — How to relate titles to the given ASIN\n\n### `audible_product_reviews`\n\n- **HTTP:** `GET /audible/product/{asin}/reviews`\n- **What:** Get an Audible audiobook's customer reviews. Returns a page of an Audible audiobook's customer reviews (author, title, body, overall/performance/story ratings, helpful votes, submission date). Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN; `limit` (integer, optional) — Max reviews, default 10, max 50; `page` (integer, optional) — Zero-based result page, default 0\n\n### `audible_products`\n\n- **HTTP:** `GET /audible/products`\n- **What:** Get multiple Audible audiobooks in one call. Returns normalized Audible audiobooks for up to 50 ASINs in a single request — the same fields as GET /audible/product/{asin}. Unrecognized ASINs are silently omitted rather than failing the whole batch. Credential-free public catalog data from api.audible.com.\n- **Params:** `asins` (string, **required**) — Comma-separated Audible ASINs, up to 50\n\n### `audible_search`\n\n- **HTTP:** `GET /audible/search`\n- **What:** Search Audible's catalog. Searches Audible's audiobook catalog by keyword, title, author, narrator, or category id. At least one filter is required. Credential-free public catalog data from api.audible.com.\n- **Params:** `author` (string, optional) — Match by author name; `category_id` (string, optional) — Restrict to a category id from GET /audible/categories; `limit` (integer, optional) — Max results, default 10, max 50; `narrator` (string, optional) — Match by narrator name; `page` (integer, optional) — Zero-based result page, default 0; `q` (string, optional) — Free-text query matched across title, subtitle, and author; `title` (string, optional) — Match by title\n\n### `audible_series`\n\n- **HTTP:** `GET /audible/series/{asin}`\n- **What:** Get an Audible series' ordered book list. Returns an Audible series and every book in it, in series order. A series has its own ASIN distinct from any book in it — find one via a book's series[].asin field from GET /audible/product/{asin}. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible series ASIN, from a product's series[].asin field\n\nFile v1.0.17:skill-card.md\n\n## Description:\n\nResearches books, authors, and audiobooks through the Crawlora API for Goodreads, Apple Books, and Audible, returning normalized JSON for ratings, reviews, bibliographies, curated lists, audiobook details, and charts.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to answer book and audiobook research questions by querying Crawlora for public catalog, review, chart, bibliography, and recommendation data across Goodreads, Apple Books, and Audible.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Book titles, author names, IDs, and related search parameters are sent to Crawlora with the user's API key.\n\nMitigation: Avoid sending secrets, private notes, personal data, or sensitive reading-related context in lookup queries.\n\nRisk: The helper depends on a Crawlora API key for authenticated requests.\n\nMitigation: Provide the key only through CRAWLORA_API_KEY, do not hardcode it, and avoid placing it in command-line arguments or committed files.\n\nRisk: Results come from public catalog, review, chart, and list data and may be incomplete, paginated, or dependent on platform-specific identifiers.\n\nMitigation: Resolve titles or authors through search endpoints first, follow pagination where available, and verify important recommendations or bibliographic details before relying on them.\n\n## Reference(s):\n\n- [Book Research Endpoint Reference](reference/endpoints.md)\n- [Crawlora Skill Page](https://clawhub.ai/crawlora-org/skills/book-research)\n- [Crawlora API](https://api.crawlora.net/api/v1)\n\n## Skill Output:\n\n**Output Type(s):** [JSON, Shell commands, Guidance]\n\n**Output Format:** [JSON responses with Markdown guidance and inline shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and sends user-directed book, author, ID, and search parameters to Crawlora.]\n\n## Skill Version(s):\n\n1.0.17 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.16: 5 files, 9973 bytes\n\nFiles: reference/endpoints.md (17652b), scripts/crawlora.sh (4627b), skill-card.md (2192b), SKILL.md (4512b), _meta.json (133b)\n\nFile v1.0.16:SKILL.md\n\n---\nname: book-research\ndescription: Researches books, authors, and audiobooks via the Crawlora API — Goodreads (books, authors, reviews, lists, quotes), Apple Books (books, audiobooks, series, reviews, charts), and Audible (audiobook catalog search, product detail, narrators/series, reviews, charts, editorial lists) — returning clean JSON. Use when the user wants a book's ratings/reviews, an author's bibliography, curated reading lists, or audiobook details and charts.\n---\n\n# Book & audiobook research\n\nLook up books, authors, reviews, and audiobooks across Goodreads, Apple\nBooks, and Audible as normalized JSON from the Crawlora API — no scraping\nbook-catalog pages.\n\n## When to use this skill\n\n- \"What's the rating / reviews for this book?\"\n- \"What has this author written?\" (bibliography, quotes)\n- \"Give me a curated list\" (Goodreads genre/lists pages).\n- \"Find this on Apple Books / is there an audiobook?\"\n- \"What's charting on Apple Books / Audible right now?\"\n- \"Who narrates this audiobook, and what else is in the series?\" (Audible)\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Goodreads** — `/goodreads/search` (`q`) to find a book/author id, then\n   `/goodreads/book/{id}` (+ `/reviews`, `/editions`) or\n   `/goodreads/author/{id}` (+ `/books`, `/quotes`). `/goodreads/genre/{name}`\n   and `/goodreads/list/{id}` (browse via `/goodreads/lists`) cover curated\n   browsing.\n2. **Apple Books** — `/apple-books/search` (`term`) to find a book id, then\n   `/apple-books/book/{id}` (+ `/reviews`, `/similar`) or\n   `/apple-books/author/{id}`. Audiobooks mirror this:\n   `/apple-books/audiobook/search` → `/apple-books/audiobook/{id}` (+\n   `/reviews`, `/similar`), with `/apple-books/audiobook-series/{id}` and\n   `/apple-books/series/{id}` for series. `/apple-books/charts` shows what's\n   popular by country/genre.\n3. **Audible** — `/audible/search` (`keywords`) to find a title's `asin`,\n   then `/audible/product/{asin}` for detail (narrators, runtime, series)\n   plus `/audible/product/{asin}/reviews` and `/audible/product/{asin}/related`.\n   `/audible/series/{asin}` walks a series; `/audible/categories` and\n   `/audible/category/{id}` browse by genre; `/audible/charts` and\n   `/audible/list/{list}` cover bestseller/editorial lists.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Goodreads,\nApple Books, and Audible endpoint this skill uses.\n\n## Examples\n\n- **Author bibliography:** `/goodreads/author/{id}/books` (or\n  `/apple-books/author/{id}`) for a full backlist, cross-checked against\n  `/goodreads/book/{id}/reviews` for reception.\n- **\"What should I read next?\"** — `/apple-books/book/{id}/similar` or a\n  Goodreads genre/list page for recommendations in a category.\n- **Audiobook vs. print check:** `/apple-books/book/{id}` alongside\n  `/apple-books/audiobook/search` or `/audible/search` for the same title\n  to see if a narrated edition exists and who narrates it.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public catalog/review pages.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Detail endpoints need the platform's own id — resolve via `.../search`\n  first if you only have a title/author name.\n- Reviews and lists are paginated (`page`/`limit`) — walk pages for full coverage.\n\nFile v1.0.16:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"book-research\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1789043410114\n}\n\nFile v1.0.16:reference/endpoints.md\n\n# book-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**32 endpoints across 3 platform group(s).**\n\n## Goodreads (10)\n\n### `goodreads_author`\n\n- **HTTP:** `GET /goodreads/author/{id}`\n- **What:** Get a Goodreads author. Returns a normalized Goodreads author profile: bio, birth/death dates, website, genres, photo, and aggregate rating stats. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id\n\n### `goodreads_author_books`\n\n- **HTTP:** `GET /goodreads/author/{id}/books`\n- **What:** List a Goodreads author's books. Returns an author's paginated works list (title, author, average rating, ratings count). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_author_quotes`\n\n- **HTTP:** `GET /goodreads/author/{id}/quotes`\n- **What:** List a Goodreads author's attributed quotes. Returns an author's paginated attributed-quotes list (quote text, tags, like count, and — when the quote is credited to a specific book — that book's title, id, and work id). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book`\n\n- **HTTP:** `GET /goodreads/book/{id}`\n- **What:** Get a Goodreads book. Returns a normalized Goodreads book: description, authors, series, genres, format, pages, publisher, publication date, ISBNs, and aggregate rating with the full 1-5 star distribution. Credential-free public Goodreads data (goodreads.com), parsed from the book page's embedded GraphQL cache.\n- **Params:** `id` (string, **required**) — Goodreads book id\n\n### `goodreads_book_editions`\n\n- **HTTP:** `GET /goodreads/book/{id}/editions`\n- **What:** List a Goodreads book's editions. Returns a work's paginated edition list (per-edition book id, format, page count, publication date, publisher, ISBN/ISBN13/ASIN, language, and rating) — every other translation, printing, and format of the requested book id. Goodreads keys editions by a separate \"work id\", not the book id in the path, so this makes one extra internal request to resolve it; requests against a book with no editions data return an upstream error.\n- **Params:** `id` (string, **required**) — Goodreads book id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book_reviews`\n\n- **HTTP:** `GET /goodreads/book/{id}/reviews`\n- **What:** Get a Goodreads book's featured reviews. Returns a book's featured reviews (reviewer, rating, text, date, like/comment counts, spoiler flag), sorted by like count. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads book id; `limit` (integer, optional) — Max reviews, default 10, max 50\n\n### `goodreads_genre`\n\n- **HTTP:** `GET /goodreads/genre/{name}`\n- **What:** Get a Goodreads genre shelf. Returns up to 50 books on a Goodreads genre/shelf tag page (e.g. fantasy, romance, science-fiction), Goodreads' credential-free per-tag \"top books\" view: title, author, average rating, ratings count, publication year, and how many times the book was shelved under this specific tag. Goodreads' genre/shelf taxonomy is an open, user-generated folksonomy of thousands of tags, not a small fixed list, so there is no directory endpoint — pass any known tag slug, e.g. from a book's genres[] field or a value seen on goodreads.com. There is no pagination beyond the first 50.\n- **Params:** `name` (string, **required**) — Goodreads genre/shelf tag\n\n### `goodreads_list`\n\n- **HTTP:** `GET /goodreads/list/{id}`\n- **What:** Get a Goodreads Listopia list. Returns a Goodreads Listopia list (ranked book list) by id, paginated. Credential-free public Goodreads data; page 1 of well-known lists may be served from a faster live source, with the public list page itself as fallback for every other case.\n- **Params:** `id` (string, **required**) — Goodreads list id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_lists`\n\n- **HTTP:** `GET /goodreads/lists`\n- **What:** List curated Goodreads Listopia lists. Returns a catalog of well-known Goodreads Listopia lists (id, name, category). Goodreads has no directory or search endpoint for the tens of thousands of user-created lists, so this is served from a live popular-lists source when available, falling back to a curated, hand-picked catalog otherwise. Pass a returned id to GET /goodreads/list/{id} for that list's ranked book contents. Category enum: `general`, `genre`, `era`, `young_adult`, `children`, `holiday`.\n- **Params:** _none_\n\n### `goodreads_search`\n\n- **HTTP:** `GET /goodreads/search`\n- **What:** Search Goodreads books. Searches Goodreads books by title/author. Credential-free public Goodreads data via the autocomplete endpoint (book results only).\n- **Params:** `limit` (integer, optional) — Max results, default 10, max 50; `q` (string, **required**) — Search query\n\n## AppleBooks (12)\n\n### `apple_books_audiobook`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}`\n- **What:** Retrieve Apple Books audiobook details. Returns normalized audiobook metadata from Apple Books' public catalog page, including narrator, duration, audio preview, and a cross-link to the ebook edition (when one exists).\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_reviews`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/reviews`\n- **What:** Retrieve Apple Books audiobook customer reviews. Returns a page of an audiobook's customer reviews. The default first page is served from the audiobook's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_audiobook_search`\n\n- **HTTP:** `GET /apple-books/audiobook/search`\n- **What:** Search Apple Books audiobooks. Returns normalized Apple Books audiobooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of audiobooks per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_audiobook_series`\n\n- **HTTP:** `GET /apple-books/audiobook-series/{id}`\n- **What:** Retrieve an Apple Books audiobook series and its full audiobook list. Returns series metadata and the full ordered list of audiobooks in the series from Apple Books' public catalog page. An audio-book-series is a catalog resource distinct from a book-series, even for the same conceptual series.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook series ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_similar`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" audiobooks. Returns the related audiobooks shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_author`\n\n- **HTTP:** `GET /apple-books/author/{id}`\n- **What:** Retrieve an Apple Books author's bibliography. Returns author metadata and their full ebook (and audiobook, where available) bibliography from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric author ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book`\n\n- **HTTP:** `GET /apple-books/book/{id}`\n- **What:** Retrieve Apple Books book details. Returns normalized book metadata from Apple Books' public catalog page, including ISBN, page count, publisher, audience, rating histogram, and series linkage.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book_reviews`\n\n- **HTTP:** `GET /apple-books/book/{id}/reviews`\n- **What:** Retrieve Apple Books customer reviews. Returns a page of a book's customer reviews. The default first page is served from the book's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_book_similar`\n\n- **HTTP:** `GET /apple-books/book/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" books. Returns the related books shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_charts`\n\n- **HTTP:** `GET /apple-books/charts`\n- **What:** Retrieve Apple Books chart rankings. Returns Apple Books chart rankings from Apple's public marketing-tools RSS JSON feed. Supported collections are `top-free` and `top-paid`.\n- **Params:** `collection` (string, optional) — Chart collection. Allowed values: top-free, top-paid; `country` (string, optional) — Two-letter storefront country code; `genre` (integer, optional) — Optional Apple Books genre ID to filter the chart; `limit` (integer, optional) — Number of chart items to return\n\n### `apple_books_search`\n\n- **HTTP:** `GET /apple-books/search`\n- **What:** Search Apple Books titles. Returns normalized Apple Books ebooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of books per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_series`\n\n- **HTTP:** `GET /apple-books/series/{id}`\n- **What:** Retrieve an Apple Books series and its full book list. Returns series metadata and the full ordered list of books in the series from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric series ID; `lang` (string, optional) — Result language tag\n\n## Audible (10)\n\n### `audible_categories`\n\n- **HTTP:** `GET /audible/categories`\n- **What:** Get Audible's genre/category tree. Returns Audible's full genre/category tree (root genres with their subgenres), including the category ids accepted by GET /audible/search's category_id filter. Credential-free public catalog data from api.audible.com.\n- **Params:** _none_\n\n### `audible_category`\n\n- **HTTP:** `GET /audible/category/{id}`\n- **What:** Get one Audible category node. Returns one Audible category node and its immediate children by id — cheaper than fetching the full tree from GET /audible/categories when only one node is needed. Credential-free public catalog data from api.audible.com.\n- **Params:** `id` (string, **required**) — Audible category id from GET /audible/categories\n\n### `audible_charts`\n\n- **HTTP:** `GET /audible/charts`\n- **What:** Get an Audible chart (audible.com/charts). Returns one page of an Audible chart — a ranked list with real chart position, price, and rating that has no equivalent on api.audible.com's public JSON API. This is an HTML scrape of audible.com/charts, a different, less stable source class than the rest of this family, though its own filters (category, access level, language, duration, Audible-Originals-only) were individually verified to actually change results. category_id, access_level, and content_type=podcasts are mutually exclusive.\n- **Params:** `access_level` (string, optional) — Membership access level, default all; `category_id` (string, optional) — Restrict to a category id from GET /audible/categories; `chart` (string, optional) — Chart type, default most_listened; `content_type` (string, optional) — Content type, default audiobooks; `duration` (string, optional) — Runtime-length filter, default all; `language` (string, optional) — Language filter, default all; `originals_only` (boolean, optional) — Restrict to Audible Originals only; `page` (integer, optional) — 1-based result page, default 1, 20 results per page\n\n### `audible_editorial_list`\n\n- **HTTP:** `GET /audible/list/{list}`\n- **What:** Get an Audible curated editorial list. Returns one of Audible's hand-curated \"Popular Lists\" pages, normalized into its themed shelves (heading + ordered ASINs). This is an HTML scrape of a marketing/editorial page (audible.com), not api.audible.com's JSON API — pair an ASIN from any shelf with GET /audible/products (batch) or GET /audible/product/{asin} for full title/author/price/rating detail. \"Best of the Year\" is not covered — its layout has no consistent structure to parse.\n- **Params:** `list` (string, **required**) — Editorial list slug\n\n### `audible_product`\n\n- **HTTP:** `GET /audible/product/{asin}`\n- **What:** Get an Audible audiobook. Returns a normalized Audible audiobook: description, authors, narrators, series, category ladders, publisher, release date, runtime, language, sample audio URL, rating (overall/performance/story), and public list price. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN\n\n### `audible_product_related`\n\n- **HTTP:** `GET /audible/product/{asin}/related`\n- **What:** Get Audible titles related to an audiobook. Returns Audible titles related to a given ASIN by a required relation type: same series, same narrator, same author, next in series, or raw upstream similarity. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN; `limit` (integer, optional) — Max results, default 10, max 50; `similarity_type` (string, **required**) — How to relate titles to the given ASIN\n\n### `audible_product_reviews`\n\n- **HTTP:** `GET /audible/product/{asin}/reviews`\n- **What:** Get an Audible audiobook's customer reviews. Returns a page of an Audible audiobook's customer reviews (author, title, body, overall/performance/story ratings, helpful votes, submission date). Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN; `limit` (integer, optional) — Max reviews, default 10, max 50; `page` (integer, optional) — Zero-based result page, default 0\n\n### `audible_products`\n\n- **HTTP:** `GET /audible/products`\n- **What:** Get multiple Audible audiobooks in one call. Returns normalized Audible audiobooks for up to 50 ASINs in a single request — the same fields as GET /audible/product/{asin}. Unrecognized ASINs are silently omitted rather than failing the whole batch. Credential-free public catalog data from api.audible.com.\n- **Params:** `asins` (string, **required**) — Comma-separated Audible ASINs, up to 50\n\n### `audible_search`\n\n- **HTTP:** `GET /audible/search`\n- **What:** Search Audible's catalog. Searches Audible's audiobook catalog by keyword, title, author, narrator, or category id. At least one filter is required. Credential-free public catalog data from api.audible.com.\n- **Params:** `author` (string, optional) — Match by author name; `category_id` (string, optional) — Restrict to a category id from GET /audible/categories; `limit` (integer, optional) — Max results, default 10, max 50; `narrator` (string, optional) — Match by narrator name; `page` (integer, optional) — Zero-based result page, default 0; `q` (string, optional) — Free-text query matched across title, subtitle, and author; `title` (string, optional) — Match by title\n\n### `audible_series`\n\n- **HTTP:** `GET /audible/series/{asin}`\n- **What:** Get an Audible series' ordered book list. Returns an Audible series and every book in it, in series order. A series has its own ASIN distinct from any book in it — find one via a book's series[].asin field from GET /audible/product/{asin}. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible series ASIN, from a product's series[].asin field\n\nFile v1.0.16:skill-card.md\n\n## Description:\n\nResearches books, authors, and audiobooks via the Crawlora API -- Goodreads (books, authors, reviews, lists, quotes), Apple Books (books, audiobooks, series, reviews, charts), and Audible (audiobook catalog search, product detail, narrators/series, reviews, charts, editorial lists) -- returning clean JSON.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, researchers, and reading-focused agents use this skill to look up public book, author, review, list, chart, and audiobook metadata across Goodreads, Apple Books, and Audible through the Crawlora API.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Book and audiobook lookup terms are sent to Crawlora with the configured API key.\n\nMitigation: Only send intended public lookup terms, and avoid secrets or private personal text in query parameters or JSON bodies unless that disclosure is intended.\n\nRisk: The helper makes outbound requests to a third-party API and may consume Crawlora account credits.\n\nMitigation: Review commands before execution, set CRAWLORA_API_KEY only in the intended environment, and monitor Crawlora usage for unexpected calls.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/book-research)\n- [Crawlora API key and service information](https://crawlora.net)\n\n## Skill Output:\n\n**Output Type(s):** [json, shell commands, configuration, guidance]\n\n**Output Format:** [JSON API responses with concise Markdown guidance and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and sends user-requested lookup terms to the Crawlora API.]\n\n## Skill Version(s):\n\n1.0.16 (source: server-resolved release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.15: 5 files, 9859 bytes\n\nFiles: reference/endpoints.md (17652b), scripts/crawlora.sh (4370b), skill-card.md (2190b), SKILL.md (4512b), _meta.json (133b)\n\nFile v1.0.15:SKILL.md\n\n---\nname: book-research\ndescription: Researches books, authors, and audiobooks via the Crawlora API — Goodreads (books, authors, reviews, lists, quotes), Apple Books (books, audiobooks, series, reviews, charts), and Audible (audiobook catalog search, product detail, narrators/series, reviews, charts, editorial lists) — returning clean JSON. Use when the user wants a book's ratings/reviews, an author's bibliography, curated reading lists, or audiobook details and charts.\n---\n\n# Book & audiobook research\n\nLook up books, authors, reviews, and audiobooks across Goodreads, Apple\nBooks, and Audible as normalized JSON from the Crawlora API — no scraping\nbook-catalog pages.\n\n## When to use this skill\n\n- \"What's the rating / reviews for this book?\"\n- \"What has this author written?\" (bibliography, quotes)\n- \"Give me a curated list\" (Goodreads genre/lists pages).\n- \"Find this on Apple Books / is there an audiobook?\"\n- \"What's charting on Apple Books / Audible right now?\"\n- \"Who narrates this audiobook, and what else is in the series?\" (Audible)\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Goodreads** — `/goodreads/search` (`q`) to find a book/author id, then\n   `/goodreads/book/{id}` (+ `/reviews`, `/editions`) or\n   `/goodreads/author/{id}` (+ `/books`, `/quotes`). `/goodreads/genre/{name}`\n   and `/goodreads/list/{id}` (browse via `/goodreads/lists`) cover curated\n   browsing.\n2. **Apple Books** — `/apple-books/search` (`term`) to find a book id, then\n   `/apple-books/book/{id}` (+ `/reviews`, `/similar`) or\n   `/apple-books/author/{id}`. Audiobooks mirror this:\n   `/apple-books/audiobook/search` → `/apple-books/audiobook/{id}` (+\n   `/reviews`, `/similar`), with `/apple-books/audiobook-series/{id}` and\n   `/apple-books/series/{id}` for series. `/apple-books/charts` shows what's\n   popular by country/genre.\n3. **Audible** — `/audible/search` (`keywords`) to find a title's `asin`,\n   then `/audible/product/{asin}` for detail (narrators, runtime, series)\n   plus `/audible/product/{asin}/reviews` and `/audible/product/{asin}/related`.\n   `/audible/series/{asin}` walks a series; `/audible/categories` and\n   `/audible/category/{id}` browse by genre; `/audible/charts` and\n   `/audible/list/{list}` cover bestseller/editorial lists.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Goodreads,\nApple Books, and Audible endpoint this skill uses.\n\n## Examples\n\n- **Author bibliography:** `/goodreads/author/{id}/books` (or\n  `/apple-books/author/{id}`) for a full backlist, cross-checked against\n  `/goodreads/book/{id}/reviews` for reception.\n- **\"What should I read next?\"** — `/apple-books/book/{id}/similar` or a\n  Goodreads genre/list page for recommendations in a category.\n- **Audiobook vs. print check:** `/apple-books/book/{id}` alongside\n  `/apple-books/audiobook/search` or `/audible/search` for the same title\n  to see if a narrated edition exists and who narrates it.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public catalog/review pages.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Detail endpoints need the platform's own id — resolve via `.../search`\n  first if you only have a title/author name.\n- Reviews and lists are paginated (`page`/`limit`) — walk pages for full coverage.\n\nFile v1.0.15:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"book-research\",\n  \"version\": \"1.0.15\",\n  \"publishedAt\": 1789042433390\n}\n\nFile v1.0.15:reference/endpoints.md\n\n# book-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**32 endpoints across 3 platform group(s).**\n\n## Goodreads (10)\n\n### `goodreads_author`\n\n- **HTTP:** `GET /goodreads/author/{id}`\n- **What:** Get a Goodreads author. Returns a normalized Goodreads author profile: bio, birth/death dates, website, genres, photo, and aggregate rating stats. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id\n\n### `goodreads_author_books`\n\n- **HTTP:** `GET /goodreads/author/{id}/books`\n- **What:** List a Goodreads author's books. Returns an author's paginated works list (title, author, average rating, ratings count). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_author_quotes`\n\n- **HTTP:** `GET /goodreads/author/{id}/quotes`\n- **What:** List a Goodreads author's attributed quotes. Returns an author's paginated attributed-quotes list (quote text, tags, like count, and — when the quote is credited to a specific book — that book's title, id, and work id). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book`\n\n- **HTTP:** `GET /goodreads/book/{id}`\n- **What:** Get a Goodreads book. Returns a normalized Goodreads book: description, authors, series, genres, format, pages, publisher, publication date, ISBNs, and aggregate rating with the full 1-5 star distribution. Credential-free public Goodreads data (goodreads.com), parsed from the book page's embedded GraphQL cache.\n- **Params:** `id` (string, **required**) — Goodreads book id\n\n### `goodreads_book_editions`\n\n- **HTTP:** `GET /goodreads/book/{id}/editions`\n- **What:** List a Goodreads book's editions. Returns a work's paginated edition list (per-edition book id, format, page count, publication date, publisher, ISBN/ISBN13/ASIN, language, and rating) — every other translation, printing, and format of the requested book id. Goodreads keys editions by a separate \"work id\", not the book id in the path, so this makes one extra internal request to resolve it; requests against a book with no editions data return an upstream error.\n- **Params:** `id` (string, **required**) — Goodreads book id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book_reviews`\n\n- **HTTP:** `GET /goodreads/book/{id}/reviews`\n- **What:** Get a Goodreads book's featured reviews. Returns a book's featured reviews (reviewer, rating, text, date, like/comment counts, spoiler flag), sorted by like count. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads book id; `limit` (integer, optional) — Max reviews, default 10, max 50\n\n### `goodreads_genre`\n\n- **HTTP:** `GET /goodreads/genre/{name}`\n- **What:** Get a Goodreads genre shelf. Returns up to 50 books on a Goodreads genre/shelf tag page (e.g. fantasy, romance, science-fiction), Goodreads' credential-free per-tag \"top books\" view: title, author, average rating, ratings count, publication year, and how many times the book was shelved under this specific tag. Goodreads' genre/shelf taxonomy is an open, user-generated folksonomy of thousands of tags, not a small fixed list, so there is no directory endpoint — pass any known tag slug, e.g. from a book's genres[] field or a value seen on goodreads.com. There is no pagination beyond the first 50.\n- **Params:** `name` (string, **required**) — Goodreads genre/shelf tag\n\n### `goodreads_list`\n\n- **HTTP:** `GET /goodreads/list/{id}`\n- **What:** Get a Goodreads Listopia list. Returns a Goodreads Listopia list (ranked book list) by id, paginated. Credential-free public Goodreads data; page 1 of well-known lists may be served from a faster live source, with the public list page itself as fallback for every other case.\n- **Params:** `id` (string, **required**) — Goodreads list id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_lists`\n\n- **HTTP:** `GET /goodreads/lists`\n- **What:** List curated Goodreads Listopia lists. Returns a catalog of well-known Goodreads Listopia lists (id, name, category). Goodreads has no directory or search endpoint for the tens of thousands of user-created lists, so this is served from a live popular-lists source when available, falling back to a curated, hand-picked catalog otherwise. Pass a returned id to GET /goodreads/list/{id} for that list's ranked book contents. Category enum: `general`, `genre`, `era`, `young_adult`, `children`, `holiday`.\n- **Params:** _none_\n\n### `goodreads_search`\n\n- **HTTP:** `GET /goodreads/search`\n- **What:** Search Goodreads books. Searches Goodreads books by title/author. Credential-free public Goodreads data via the autocomplete endpoint (book results only).\n- **Params:** `limit` (integer, optional) — Max results, default 10, max 50; `q` (string, **required**) — Search query\n\n## AppleBooks (12)\n\n### `apple_books_audiobook`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}`\n- **What:** Retrieve Apple Books audiobook details. Returns normalized audiobook metadata from Apple Books' public catalog page, including narrator, duration, audio preview, and a cross-link to the ebook edition (when one exists).\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_reviews`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/reviews`\n- **What:** Retrieve Apple Books audiobook customer reviews. Returns a page of an audiobook's customer reviews. The default first page is served from the audiobook's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_audiobook_search`\n\n- **HTTP:** `GET /apple-books/audiobook/search`\n- **What:** Search Apple Books audiobooks. Returns normalized Apple Books audiobooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of audiobooks per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_audiobook_series`\n\n- **HTTP:** `GET /apple-books/audiobook-series/{id}`\n- **What:** Retrieve an Apple Books audiobook series and its full audiobook list. Returns series metadata and the full ordered list of audiobooks in the series from Apple Books' public catalog page. An audio-book-series is a catalog resource distinct from a book-series, even for the same conceptual series.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook series ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_similar`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" audiobooks. Returns the related audiobooks shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_author`\n\n- **HTTP:** `GET /apple-books/author/{id}`\n- **What:** Retrieve an Apple Books author's bibliography. Returns author metadata and their full ebook (and audiobook, where available) bibliography from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric author ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book`\n\n- **HTTP:** `GET /apple-books/book/{id}`\n- **What:** Retrieve Apple Books book details. Returns normalized book metadata from Apple Books' public catalog page, including ISBN, page count, publisher, audience, rating histogram, and series linkage.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book_reviews`\n\n- **HTTP:** `GET /apple-books/book/{id}/reviews`\n- **What:** Retrieve Apple Books customer reviews. Returns a page of a book's customer reviews. The default first page is served from the book's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_book_similar`\n\n- **HTTP:** `GET /apple-books/book/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" books. Returns the related books shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_charts`\n\n- **HTTP:** `GET /apple-books/charts`\n- **What:** Retrieve Apple Books chart rankings. Returns Apple Books chart rankings from Apple's public marketing-tools RSS JSON feed. Supported collections are `top-free` and `top-paid`.\n- **Params:** `collection` (string, optional) — Chart collection. Allowed values: top-free, top-paid; `country` (string, optional) — Two-letter storefront country code; `genre` (integer, optional) — Optional Apple Books genre ID to filter the chart; `limit` (integer, optional) — Number of chart items to return\n\n### `apple_books_search`\n\n- **HTTP:** `GET /apple-books/search`\n- **What:** Search Apple Books titles. Returns normalized Apple Books ebooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of books per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_series`\n\n- **HTTP:** `GET /apple-books/series/{id}`\n- **What:** Retrieve an Apple Books series and its full book list. Returns series metadata and the full ordered list of books in the series from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric series ID; `lang` (string, optional) — Result language tag\n\n## Audible (10)\n\n### `audible_categories`\n\n- **HTTP:** `GET /audible/categories`\n- **What:** Get Audible's genre/category tree. Returns Audible's full genre/category tree (root genres with their subgenres), including the category ids accepted by GET /audible/search's category_id filter. Credential-free public catalog data from api.audible.com.\n- **Params:** _none_\n\n### `audible_category`\n\n- **HTTP:** `GET /audible/category/{id}`\n- **What:** Get one Audible category node. Returns one Audible category node and its immediate children by id — cheaper than fetching the full tree from GET /audible/categories when only one node is needed. Credential-free public catalog data from api.audible.com.\n- **Params:** `id` (string, **required**) — Audible category id from GET /audible/categories\n\n### `audible_charts`\n\n- **HTTP:** `GET /audible/charts`\n- **What:** Get an Audible chart (audible.com/charts). Returns one page of an Audible chart — a ranked list with real chart position, price, and rating that has no equivalent on api.audible.com's public JSON API. This is an HTML scrape of audible.com/charts, a different, less stable source class than the rest of this family, though its own filters (category, access level, language, duration, Audible-Originals-only) were individually verified to actually change results. category_id, access_level, and content_type=podcasts are mutually exclusive.\n- **Params:** `access_level` (string, optional) — Membership access level, default all; `category_id` (string, optional) — Restrict to a category id from GET /audible/categories; `chart` (string, optional) — Chart type, default most_listened; `content_type` (string, optional) — Content type, default audiobooks; `duration` (string, optional) — Runtime-length filter, default all; `language` (string, optional) — Language filter, default all; `originals_only` (boolean, optional) — Restrict to Audible Originals only; `page` (integer, optional) — 1-based result page, default 1, 20 results per page\n\n### `audible_editorial_list`\n\n- **HTTP:** `GET /audible/list/{list}`\n- **What:** Get an Audible curated editorial list. Returns one of Audible's hand-curated \"Popular Lists\" pages, normalized into its themed shelves (heading + ordered ASINs). This is an HTML scrape of a marketing/editorial page (audible.com), not api.audible.com's JSON API — pair an ASIN from any shelf with GET /audible/products (batch) or GET /audible/product/{asin} for full title/author/price/rating detail. \"Best of the Year\" is not covered — its layout has no consistent structure to parse.\n- **Params:** `list` (string, **required**) — Editorial list slug\n\n### `audible_product`\n\n- **HTTP:** `GET /audible/product/{asin}`\n- **What:** Get an Audible audiobook. Returns a normalized Audible audiobook: description, authors, narrators, series, category ladders, publisher, release date, runtime, language, sample audio URL, rating (overall/performance/story), and public list price. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN\n\n### `audible_product_related`\n\n- **HTTP:** `GET /audible/product/{asin}/related`\n- **What:** Get Audible titles related to an audiobook. Returns Audible titles related to a given ASIN by a required relation type: same series, same narrator, same author, next in series, or raw upstream similarity. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN; `limit` (integer, optional) — Max results, default 10, max 50; `similarity_type` (string, **required**) — How to relate titles to the given ASIN\n\n### `audible_product_reviews`\n\n- **HTTP:** `GET /audible/product/{asin}/reviews`\n- **What:** Get an Audible audiobook's customer reviews. Returns a page of an Audible audiobook's customer reviews (author, title, body, overall/performance/story ratings, helpful votes, submission date). Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible ASIN; `limit` (integer, optional) — Max reviews, default 10, max 50; `page` (integer, optional) — Zero-based result page, default 0\n\n### `audible_products`\n\n- **HTTP:** `GET /audible/products`\n- **What:** Get multiple Audible audiobooks in one call. Returns normalized Audible audiobooks for up to 50 ASINs in a single request — the same fields as GET /audible/product/{asin}. Unrecognized ASINs are silently omitted rather than failing the whole batch. Credential-free public catalog data from api.audible.com.\n- **Params:** `asins` (string, **required**) — Comma-separated Audible ASINs, up to 50\n\n### `audible_search`\n\n- **HTTP:** `GET /audible/search`\n- **What:** Search Audible's catalog. Searches Audible's audiobook catalog by keyword, title, author, narrator, or category id. At least one filter is required. Credential-free public catalog data from api.audible.com.\n- **Params:** `author` (string, optional) — Match by author name; `category_id` (string, optional) — Restrict to a category id from GET /audible/categories; `limit` (integer, optional) — Max results, default 10, max 50; `narrator` (string, optional) — Match by narrator name; `page` (integer, optional) — Zero-based result page, default 0; `q` (string, optional) — Free-text query matched across title, subtitle, and author; `title` (string, optional) — Match by title\n\n### `audible_series`\n\n- **HTTP:** `GET /audible/series/{asin}`\n- **What:** Get an Audible series' ordered book list. Returns an Audible series and every book in it, in series order. A series has its own ASIN distinct from any book in it — find one via a book's series[].asin field from GET /audible/product/{asin}. Credential-free public catalog data from api.audible.com.\n- **Params:** `asin` (string, **required**) — Audible series ASIN, from a product's series[].asin field\n\nFile v1.0.15:skill-card.md\n\n## Description:\n\nResearches books, authors, and audiobooks via the Crawlora API across Goodreads, Apple Books, and Audible, returning clean JSON for ratings, reviews, bibliographies, reading lists, audiobook details, and charts.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users, developers, and research agents use this skill to look up book, author, review, reading-list, and audiobook catalog data across Goodreads, Apple Books, and Audible. It is suited for answering reader-research questions, comparing print and audiobook availability, checking reception, and exploring charts or curated lists.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Book lookup queries and the Crawlora API key are sent to Crawlora.\n\nMitigation: Install only when use of Crawlora for these queries and credentials is acceptable; keep the key in CRAWLORA_API_KEY and rotate it if exposed.\n\nRisk: Security review flagged helper scoping and credential-handling concerns before installation.\n\nMitigation: Review the helper before deployment; require API-key validation before writing curl config and enforce exact documented GET-only route patterns.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/book-research)\n\n## Skill Output:\n\n**Output Type(s):** [text, shell commands, configuration, guidance, JSON]\n\n**Output Format:** [Markdown guidance with shell command examples and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and sends requests to the Crawlora API.]\n\n## Skill Version(s):\n\n1.0.15 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.14: 5 files, 9708 bytes\n\nFiles: reference/endpoints.md (17652b), scripts/crawlora.sh (4045b), skill-card.md (2164b), SKILL.md (4549b), _meta.json (133b)\n\nFile v1.0.14:SKILL.md\n\n---\nname: book-research\ndescription: Researches books, authors, and audiobooks via the Crawlora API — Goodreads (books, authors, reviews, lists, quotes), Apple Books (books, audiobooks, series, reviews, charts), and Audible (audiobook catalog search, product detail, narrators/series, reviews, charts, editorial lists) — returning clean JSON. Use when the user wants a book's ratings/reviews, an author's bibliography, curated reading lists, or audiobook details and charts.\n---\n\n# Book & audiobook research\n\nLook up books, authors, reviews, and audiobooks across Goodreads, Apple\nBooks, and Audible as normalized JSON from the Crawlora API — no scraping\nbook-catalog pages.\n\n## When to use this skill\n\n- \"What's the rating / reviews for this book?\"\n- \"What has this author written?\" (bibliography, quotes)\n- \"Give me a curated list\" (Goodreads genre/lists pages).\n- \"Find this on Apple Books / is there an audiobook?\"\n- \"What's charting on Apple Books / Audible right now?\"\n- \"Who narrates this audiobook, and what else is in the series?\" (Audible)\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- All requests: `x-api-key: $CRAWLORA_API_KEY` against\n  `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Goodreads** — `/goodreads/search` (`q`) to find a book/author id, then\n   `/goodreads/book/{id}` (+ `/reviews`, `/editions`) or\n   `/goodreads/author/{id}` (+ `/books`, `/quotes`). `/goodreads/genre/{name}`\n   and `/goodreads/list/{id}` (browse via `/goodreads/lists`) cover curated\n   browsing.\n2. **Apple Books** — `/apple-books/search` (`term`) to find a book id, then\n   `/apple-books/book/{id}` (+ `/reviews`, `/similar`) or\n   `/apple-books/author/{id}`. Audiobooks mirror this:\n   `/apple-books/audiobook/search` → `/apple-books/audiobook/{id}` (+\n   `/reviews`, `/similar`), with `/apple-books/audiobook-series/{id}` and\n   `/apple-books/series/{id}` for series. `/apple-books/charts` shows what's\n   popular by country/genre.\n3. **Audible** — `/audible/search` (`keywords`) to find a title's `asin`,\n   then `/audible/product/{asin}` for detail (narrators, runtime, series)\n   plus `/audible/product/{asin}/reviews` and `/audible/product/{asin}/related`.\n   `/audible/series/{asin}` walks a series; `/audible/categories` and\n   `/audible/category/{id}` browse by genre; `/audible/charts` and\n   `/audible/list/{list}` cover bestseller/editorial lists.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'\n```\n\nRaw `curl` fallback:\n\n```sh\ncurl -fsS -H \"x-api-key: $CRAWLORA_API_KEY\" \\\n  \"https://api.crawlora.net/api/v1/goodreads/author/1221698.Andy_Weir\" | jq '.'\n```\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Goodreads,\nApple Books, and Audible endpoint this skill uses.\n\n## Examples\n\n- **Author bibliography:** `/goodreads/author/{id}/books` (or\n  `/apple-books/author/{id}`) for a full backlist, cross-checked against\n  `/goodreads/book/{id}/reviews` for reception.\n- **\"What should I read next?\"** — `/apple-books/book/{id}/similar` or a\n  Goodreads genre/list page for recommendations in a category.\n- **Audiobook vs. print check:** `/apple-books/book/{id}` alongside\n  `/apple-books/audiobook/search` or `/audible/search` for the same title\n  to see if a narrated edition exists and who narrates it.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public catalog/review pages.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Detail endpoints need the platform's own id — resolve via `.../search`\n  first if you only have a title/author name.\n- Reviews and lists are paginated (`page`/`limit`) — walk pages for full coverage.\n\nFile v1.0.14:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"book-research\",\n  \"version\": \"1.0.14\",\n  \"publishedAt\": 1789041914207\n}\n\nFile v1.0.14:reference/endpoints.md\n\n# book-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**32 endpoints across 3 platform group(s).**\n\n## Goodreads (10)\n\n### `goodreads_author`\n\n- **HTTP:** `GET /goodreads/author/{id}`\n- **What:** Get a Goodreads author. Returns a normalized Goodreads author profile: bio, birth/death dates, website, genres, photo, and aggregate rating stats. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id\n\n### `goodreads_author_books`\n\n- **HTTP:** `GET /goodreads/author/{id}/books`\n- **What:** List a Goodreads author's books. Returns an author's paginated works list (title, author, average rating, ratings count). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_author_quotes`\n\n- **HTTP:** `GET /goodreads/author/{id}/quotes`\n- **What:** List a Goodreads author's attributed quotes. Returns an author's paginated attributed-quotes list (quote text, tags, like count, and — when the quote is credited to a specific book — that book's title, id, and work id). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book`\n\n- **HTTP:** `GET /goodreads/book/{id}`\n- **What:** Get a Goodreads book. Returns a normalized Goodreads book: description, authors, series, genres, format, pages, publisher, publication date, ISBNs, and aggregate rating with the full 1-5 star distribution. Credential-free public Goodreads data (goodreads.com), parsed from the book page's embedded GraphQL cache.\n- **Params:** `id` (string, **required**) — Goodreads book id\n\n### `goodreads_book_editions`\n\n- **HTTP:** `GET /goodreads/book/{id}/editions`\n- **What:** List a Goodreads book's editions. Returns a work's paginated edition list (per-edition book id, format, page count, publication date, publisher, ISBN/ISBN13/ASIN, language, and rating) — every other translation, printing, and format of the requested book id. Goodreads keys editions by a separate \"work id\", not the book id in the path, so this makes one extra internal request to resolve it; requests against a book with no editions data return an upstream error.\n- **Params:** `id` (string, **required**) — Goodreads book id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book_reviews`\n\n- **HTTP:** `GET /goodreads/book/{id}/reviews`\n- **What:** Get a Goodreads book's featured reviews. Returns a book's featured reviews (reviewer, rating, text, date, like/comment counts, spoiler flag), sorted by like count. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads book id; `limit` (integer, optional) — Max reviews, default 10, max 50\n\n### `goodreads_genre`\n\n- **HTTP:** `GET /goodreads/genre/{name}`\n- **What:** Get a Goodreads genre shelf. Returns up to 50 books on a Goodreads genre/shelf tag page (e.g. fantasy, romance, science-fiction), Goodreads' credential-free per-tag \"top books\" view: title, author, average rating, ratings count, publication year, and how many times the book was shelved under this specific tag. Goodreads' genre/shelf taxonomy is an open, user-generated folksonomy of thousands of tags, not a small fixed list, so there is no directory endpoint — pass any known tag slug, e.g. from a book's genres[] field or a value seen on goodreads.com. There is no pagination beyond the first 50.\n- **Params:** `name` (string, **required**) — Goodreads genre/shelf tag\n\n### `goodreads_list`\n\n- **HTTP:** `GET /goodreads/list/{id}`\n- **What:** Get a Goodreads Listopia list. Returns a Goodreads Listopia list (ranked book list) by id, paginated. Credential-free public Goodreads data; page 1 of well-known lists may be served from a faster live source, with the public list page itself as fallback for every other case.\n- **Params:** `id` (string, **required**) — Goodreads list id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_lists`\n\n- **HTTP:** `GET /goodreads/lists`\n- **What:** List curated Goodreads Listopia lists. Returns a catalog of well-known Goodreads Listopia lists (id, name, category). Goodreads has no directory or search endpoint for the tens of thousands of user-created lists, so this is served from a live popular-lists source when available, falling back to a curated, hand-picked catalog otherwise. Pass a returned id to GET /goodreads/list/{id} for that list's ranked book contents. Category enum: `general`, `genre`, `era`, `young_adult`, `children`, `holiday`.\n- **Params:** _none_\n\n### `goodreads_search`\n\n- **HTTP:** `GET /goodreads/search`\n- **What:** Search Goodreads books. Searches Goodreads books by title/author. Credential-free public Goodreads data via the autocomplete endpoint (book results only).\n- **Params:** `limit` (integer, optional) — Max results, default 10, max 50; `q` (string, **required**) — Search query\n\n## AppleBooks (12)\n\n### `apple_books_audiobook`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}`\n- **What:** Retrieve Apple Books audiobook details. Returns normalized audiobook metadata from Apple Books' public catalog page, including narrator, duration, audio preview, and a cross-link to the ebook edition (when one exists).\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_reviews`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/reviews`\n- **What:** Retrieve Apple Books audiobook customer reviews. Returns a page of an audiobook's customer reviews. The default first page is served from the audiobook's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_audiobook_search`\n\n- **HTTP:** `GET /apple-books/audiobook/search`\n- **What:** Search Apple Books audiobooks. Returns normalized Apple Books audiobooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of audiobooks per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_audiobook_series`\n\n- **HTTP:** `GET /apple-books/audiobook-series/{id}`\n- **What:** Retrieve an Apple Books audiobook series and its full audiobook list. Returns series metadata and the full ordered list of audiobooks in the series from Apple Books' public catalog page. An audio-book-series is a catalog resource distinct from a book-series, even for the same conceptual series.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook series ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_audiobook_similar`\n\n- **HTTP:** `GET /apple-books/audiobook/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" audiobooks. Returns the related audiobooks shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric audiobook ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_author`\n\n- **HTTP:** `GET /apple-books/author/{id}`\n- **What:** Retrieve an Apple Books author's bibliography. Returns author metadata and their full ebook (and audiobook, where available) bibliography from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric author ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book`\n\n- **HTTP:** `GET /apple-books/book/{id}`\n- **What:** Retrieve Apple Books book details. Returns normalized book metadata from Apple Books' public catalog page, including ISBN, page count, publisher, audience, rating histogram, and series linkage.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_book_reviews`\n\n- **HTTP:** `GET /apple-books/book/{id}/reviews`\n- **What:** Retrieve Apple Books customer reviews. Returns a page of a book's customer reviews. The default first page is served from the book's own catalog page; deeper pages (page>1 or a larger limit) page through Apple's review API directly, up to 20 per page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Reviews per page, default 10, max 20; `page` (integer, optional) — Review page number, default 1\n\n### `apple_books_book_similar`\n\n- **HTTP:** `GET /apple-books/book/{id}/similar`\n- **What:** Retrieve \"Customers Also Bought\" books. Returns the related books shown on the Apple Books catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric book ID; `lang` (string, optional) — Result language tag\n\n### `apple_books_charts`\n\n- **HTTP:** `GET /apple-books/charts`\n- **What:** Retrieve Apple Books chart rankings. Returns Apple Books chart rankings from Apple's public marketing-tools RSS JSON feed. Supported collections are `top-free` and `top-paid`.\n- **Params:** `collection` (string, optional) — Chart collection. Allowed values: top-free, top-paid; `country` (string, optional) — Two-letter storefront country code; `genre` (integer, optional) — Optional Apple Books genre ID to filter the chart; `limit` (integer, optional) — Number of chart items to return\n\n### `apple_books_search`\n\n- **HTTP:** `GET /apple-books/search`\n- **What:** Search Apple Books titles. Returns normalized Apple Books ebooks from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of books per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_books_series`\n\n- **HTTP:** `GET /apple-books/series/{id}`\n- **What:** Retrieve an Apple Books series and its full book list. Returns series metadata and the full ordered list of books in the series from Apple Books' public catalog page.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Books numeric series ID; `lang` (string, optional) — Result language tag\n\n## Audible (10)\n\n### `audible_categories`\n\n- **HTTP:** `GET /audible/categories`\n- **What:** Get Audible's genre/category tree. Returns Audible's full genre/category tree (root genres with their subgenres), including the category ids accepted by GET /audible/search's category_id filter. Credential-free public catalog data from api.audible.com.\n- **Params:** _none_\n\n### `audible_category`\n\n- **HTTP:** `GET /audible/category/{id}`\n- **What:** Get one Audible category node. Returns one Audible category node and its immediate children by id — cheaper than fetching the full tree from GET /audible/categories when only one node is needed. Credential-free public catalog data from api.audible.com.\n- **Params:** `id` (string, **required**) — Audible category id from GET /audible/categories\n\n### `audible_charts`\n\n- **HTTP:** `GET /audible/charts`\n- **What:** Get an Audible chart (audible.com/charts). Returns one page of an Audible chart — a ranked list with real chart position, price, and rating that has no equivalent on api.audible.com's public JSON API. This is an HTML scrape of audible.com/charts, a different, less stable source class than the rest of this family, though its own filters (category, access level, language, duration, Audible-Originals-only) were individually verified to actually change results. category_id, access_level, and content_type=podcasts are mutually exclusive.\n- **Params:** `access_level` (string, optional) — Membership access level, default all; `category_id` (string, optional) — Restrict to a category id from GET /audible/categories; `chart` (string, optional) — Chart\n\nArchive v1.0.13: 5 files, 9665 bytes\n\nFiles: reference/endpoints.md (17652b), scripts/crawlora.sh (3745b), skill-card.md (2391b), SKILL.md (4549b), _meta.json (133b)\n\nArchive v1.0.12: 5 files, 9631 bytes\n\nFiles: reference/endpoints.md (17652b), scripts/crawlora.sh (3745b), skill-card.md (2304b), SKILL.md (4549b), _meta.json (133b)\n\nArchive v1.0.11: 5 files, 9564 bytes\n\nFiles: reference/endpoints.md (17652b), scripts/crawlora.sh (3697b), skill-card.md (2200b), SKILL.md (4549b), _meta.json (133b)\n\nArchive v1.0.10: 5 files, 8959 bytes\n\nFiles: reference/endpoints.md (17652b), scripts/crawlora.sh (2005b), skill-card.md (2135b), SKILL.md (4523b), _meta.json (133b)","readmeExcerpt":"Skill: book-research Owner: crawlora-org Summary: Researches books, authors, and audiobooks via the Crawlora API — Goodreads (books, authors, reviews, lists, quotes), Apple Books (books, audiobooks, series, reviews, charts), and Audible (audiobook catalog search, product detail, narrators/series, reviews, charts, editorial lists) — returning clean JSON. Use when the user wants a book's ratings/reviews, an author's bi","codeSnippets":[],"executableExamples":[{"language":"sh","snippet":"# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'"},{"language":"sh","snippet":"# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'"},{"language":"sh","snippet":"# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'"},{"language":"sh","snippet":"# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'"},{"language":"sh","snippet":"# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'"},{"language":"sh","snippet":"# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /apple-books/charts | jq '.'\n\n# Audible:\nscripts/crawlora.sh /audible/search q=\"Project Hail Mary\" | jq '.'"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: book-research\ndescription: Researches books, authors, and audiobooks via the Crawlora API — Goodreads (books, authors, reviews, lists, quotes), Apple Books (books, audiobooks, series, reviews, charts), and Audible (audiobook catalog search, product detail, narrators/series, reviews, charts, editorial lists) — returning clean JSON. Use when the user wants a book's ratings/reviews, an author's bibliography, curated reading lists, or audiobook details and charts.\n---\n\n# Book & audiobook research\n\nLook up books, authors, reviews, and audiobooks across Goodreads, Apple\nBooks, and Audible as normalized JSON from the Crawlora API — no scraping\nbook-catalog pages.\n\n## When to use this skill\n\n- \"What's the rating / reviews for this book?\"\n- \"What has this author written?\" (bibliography, quotes)\n- \"Give me a curated list\" (Goodreads genre/lists pages).\n- \"Find this on Apple Books / is there an audiobook?\"\n- \"What's charting on Apple Books / Audible right now?\"\n- \"Who narrates this audiobook, and what else is in the series?\" (Audible)\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Goodreads** — `/goodreads/search` (`q`) to find a book/author id, then\n   `/goodreads/book/{id}` (+ `/reviews`, `/editions`) or\n   `/goodreads/author/{id}` (+ `/books`, `/quotes`). `/goodreads/genre/{name}`\n   and `/goodreads/list/{id}` (browse via `/goodreads/lists`) cover curated\n   browsing.\n2. **Apple Books** — `/apple-books/search` (`term`) to find a book id, then\n   `/apple-books/book/{id}` (+ `/reviews`, `/similar`) or\n   `/apple-books/author/{id}`. Audiobooks mirror this:\n   `/apple-books/audiobook/search` → `/apple-books/audiobook/{id}` (+\n   `/reviews`, `/similar`), with `/apple-books/audiobook-series/{id}` and\n   `/apple-books/series/{id}` for series. `/apple-books/charts` shows what's\n   popular by country/genre.\n3. **Audible** — `/audible/search` (`keywords`) to find a title's `asin`,\n   then `/audible/product/{asin}` for detail (narrators, runtime, series)\n   plus `/audible/product/{asin}/reviews` and `/audible/product/{asin}/related`.\n   `/audible/series/{asin}` walks a series; `/audible/categories` and\n   `/audible/category/{id}` browse by genre; `/audible/charts` and\n   `/audible/list/{list}` cover bestseller/editorial lists.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Goodreads:\nscripts/crawlora.sh /goodreads/search q=\"Project Hail Mary\" | jq '.'\nscripts/crawlora.sh /goodreads/book/54493401 | jq '.'\n\n# Apple Books:\nscripts/crawlora.sh /apple-books/search term=\"Project Hail Mary\" | jq '.'\nscripts"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"book-research\",\n  \"version\": \"1.0.19\",\n  \"publishedAt\": 1789954144775\n}"},{"path":"reference/endpoints.md","content":"# book-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**33 endpoints across 3 platform group(s).**\n\n## Goodreads (10)\n\n### `goodreads_author`\n\n- **HTTP:** `GET /goodreads/author/{id}`\n- **What:** Get a Goodreads author. Returns a normalized Goodreads author profile: bio, birth/death dates, website, genres, photo, and aggregate rating stats. Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id\n\n### `goodreads_author_books`\n\n- **HTTP:** `GET /goodreads/author/{id}/books`\n- **What:** List a Goodreads author's books. Returns an author's paginated works list (title, author, average rating, ratings count). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_author_quotes`\n\n- **HTTP:** `GET /goodreads/author/{id}/quotes`\n- **What:** List a Goodreads author's attributed quotes. Returns an author's paginated attributed-quotes list (quote text, tags, like count, and — when the quote is credited to a specific book — that book's title, id, and work id). Credential-free public Goodreads data.\n- **Params:** `id` (string, **required**) — Goodreads author id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book`\n\n- **HTTP:** `GET /goodreads/book/{id}`\n- **What:** Get a Goodreads book. Returns a normalized Goodreads book: description, authors, series, genres, format, pages, publisher, publication date, ISBNs, and aggregate rating with the full 1-5 star distribution. Credential-free public Goodreads data (goodreads.com), parsed from the book page's embedded GraphQL cache.\n- **Params:** `id` (string, **required**) — Goodreads book id\n\n### `goodreads_book_editions`\n\n- **HTTP:** `GET /goodreads/book/{id}/editions`\n- **What:** List a Goodreads book's editions. Returns a work's paginated edition list (per-edition book id, format, page count, publication date, publisher, ISBN/ISBN13/ASIN, language, and rating) — every other translation, printing, and format of the requested book id. Goodreads keys editions by a separate \"work id\", not the book id in the path, so this makes one extra internal request to resolve it; requests against a book with no editions data return an upstream error.\n- **Params:** `id` (string, **required**) — Goodreads book id; `page` (integer, optional) — 1-based page number, default 1\n\n### `goodreads_book_reviews`\n\n- **HTTP:** `GET /goodreads/book/{id}/reviews`\n- **What:** Get a Goodreads book's featured reviews. Returns a book's"},{"path":"skill-card.md","content":"## Description:\n\nResearches books, authors, and audiobooks via the Crawlora API across Goodreads, Apple Books, and Audible, returning clean JSON for ratings, reviews, bibliographies, curated lists, audiobook details, and charts.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to research public book, author, review, list, chart, and audiobook data from Goodreads, Apple Books, and Audible through Crawlora. It is suited for answering questions about ratings, reviews, bibliographies, reading lists, audiobook availability, narrators, series, and popularity charts.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Book, author, audiobook, review, list, chart, and related query parameters are sent to Crawlora along with the user's Crawlora API key.\n\nMitigation: Use this skill only when that third-party transmission is acceptable, and avoid sensitive private reading data.\n\nRisk: The helper requires a Crawlora API key to access the service.\n\nMitigation: Keep CRAWLORA_API_KEY in the environment, do not hardcode or commit it, and rely on the helper's documented key-handling path.\n\n## Reference(s):\n\n- [book-research endpoint reference](reference/endpoints.md)\n- [Crawlora skill page](https://clawhub.ai/crawlora-org/skills/book-research)\n- [Crawlora](https://crawlora.net)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, JSON, Guidance]\n\n**Output Format:** [Markdown guidance with shell commands that call the Crawlora helper and return JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and sends GET requests to documented Crawlora book, author, review, list, chart, and audiobook endpoints.]\n\n## Skill Version(s):\n\n1.0.19 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1572,"uniquenessScore":38,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T17:03:36.881Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T17:03:36.881Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:57:52.307Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}