Install
openclaw skills install audible-goodreads-deal-scoutEvaluate an Audible daily promotion against Goodreads public score, optional Goodreads CSV shelves, optional freeform reading notes, optional delivery rules, and manual Want-to-Read discount scans. Use for first-run setup, deal checks, scheduled sends, and on-demand Goodreads backlog audits.
openclaw skills install audible-goodreads-deal-scoutNever miss an Audible deal for a book you actually want to read.
Audible Goodreads Deal Scout is a ClawHub / OpenClaw skill that checks Audible promotions against Goodreads ratings, your Goodreads shelves, and optional reading-taste notes. It is built for people who want fewer random deal notifications and more "this is actually relevant to me" recommendations.
The goal is not to buy more audiobooks. The goal is to notice the few Audible deals that match books you already care about.
Use this skill to:
If you do not want personalization, the skill still works with public Goodreads ratings only.
This skill reports opportunities only. It does not buy, reserve, check out, redeem credits, manage subscriptions, or complete purchases.
The best setup uses:
Import and Export page.With those pieces, the skill can track today's Audible promotion, compare it against your Goodreads library, explain personal fit, and scan your Want-to-Read shelf for Audible titles that look discounted or priced below list.
The skill reads only the files and services needed for its configured workflow.
| Data or service | When used | Purpose |
|---|---|---|
| Config file | Setup, daily checks, scans, delivery | Stores marketplace, thresholds, paths, privacy mode, and optional delivery settings |
| Goodreads CSV | Only when configured | Detects read, currently-reading, and to-read shelves and uses ratings/reviews for fit |
| Taste notes | Only when configured | Adds personal reading preferences for fit explanations |
| Audible pages | Deal checks and Want-to-Read scans | Fetches daily promotions, search results, product pages, and visible pricing signals |
| Audible auth file | Optional, explicit authenticated scans only | Checks member-visible cash prices for matched Audible titles through allowlisted token-refresh and Audible product-pricing API calls |
| Goodreads public pages | Runtime lookup and optional rating enrichment | Resolves public rating evidence and fills missing Want-to-Read average ratings |
| OpenClaw CLI | Optional delivery, cron, and diagnostics | Sends configured messages, registers requested cron jobs, and checks local readiness |
The local auth file is sensitive. Do not paste its contents into chat, commit it, or publish it. The auth flow requests cookie-style Audible/Amazon credential types for compatibility because anonymous pages may hide member cash prices, but the skill persists only the bearer access/refresh token fields it uses for token refresh and Audible product-price lookup.
For a fuller trust and data-access summary, see TRUST.md in the published bundle or repository.
Audible authentication is optional and separate from the normal daily-deal workflow. The skill works without it, but anonymous Audible pages often hide cash prices behind credit or membership UI.
Use authenticated price lookup only when the user explicitly wants member-visible cash prices in Want-to-Read scans. Do not ask for the user's Audible or Amazon password. Use audible-auth-start, audible-auth-finish, and audible-auth-status instead. Never read or display the auth file contents; status commands intentionally report readiness, expiry, permissions, and allowed-use metadata without token values.
Use this skill when the user wants to:
The skill runtime must return JSON only in this shape:
{
"schemaVersion": 1,
"goodreads": {
"status": "resolved | no_match | lookup_failed",
"url": "string | null",
"title": "string | null",
"author": "string | null",
"averageRating": "number | null",
"ratingsCount": "integer | null",
"evidence": "string | null"
},
"fit": {
"status": "written | not_applicable | unavailable",
"sentence": "string | null"
}
}
Do not fetch Audible yourself in model text. Always start with the prep layer:
sh "{baseDir}/scripts/audible-goodreads-deal-scout.sh" prepare --config-path "<config-path>" --invocation-mode manual
By default, prepare uses audibleFetchBackend: auto: guard the URL against non-Audible destinations, try Python fetch first, then use browser-like curl fallback for recoverable Audible HTTP failures such as Python-client 503 rejections. Use --audible-fetch-backend python or --audible-fetch-backend curl only for explicit diagnostics.
Prep returns JSON with:
status: ready | suppress | errorreasonCodewarnings[]audiblepersonalDataartifactsmetadata, including metadata.fetch when fetch diagnostics are availableIf prep returns suppress or error, surface that result directly and stop. Do not do Goodreads lookup or fit writing after a prep-layer short-circuit.
If the skill is not configured yet, gather:
3.8positive_only, always_full, or summary_on_non_matchThen write config through:
<workspace>/.audible-goodreads-deal-scout/..audible-goodreads-deal.{baseDir} or the installed skill folder. openclaw skills install and openclaw skills update --force replace the workspace skill directory.sh "{baseDir}/scripts/audible-goodreads-deal-scout.sh" setup \
--config-path "<config-path>" \
--audible-marketplace "<marketplace>" \
--threshold "<threshold>" \
[--goodreads-csv "<csv-path>"] \
[--notes-file "<notes-file>"] \
[--notes-text "<inline notes>"] \
[--delivery-channel "telegram"] \
[--delivery-target "<target>"] \
[--delivery-policy "positive_only"] \
[--daily-automation] \
[--register-cron]
Use interactive setup only when the user explicitly wants prompt-by-prompt CLI onboarding. Otherwise prefer the non-interactive command with concrete flags.
Use this only when the user asks to scan Goodreads Want-to-Read books for Audible discounts. This is a manual audit command, not a cron or delivery workflow.
Requirements:
doctor before retrying.Run:
sh "{baseDir}/scripts/audible-goodreads-deal-scout.sh" scan-want-to-read \
--config-path "<config-path>" \
[--audible-auth-path "<auth-path>"] \
[--limit 40] \
[--offset 0] \
[--scan-order newest] \
[--progress plain] \
[--no-goodreads-rating-enrichment] \
[--goodreads-rating-limit 20] \
[--output-json "<json-path>"] \
[--output-md "<markdown-path>"]
Default behavior:
--progress json for machine-readable JSONL progress or --progress none when silence is required.--include-non-deals is requested.--offset and --limit for large Goodreads backlogs.--progress json plus --output-json and --output-md so progress logs and final reports stay separate.pricing.priceBasis and pricing.dealType to distinguish member cash prices below list from true limited-time sale or promotion signals.--no-goodreads-rating-enrichment when the user wants no Goodreads page fetches.Important caveat: Audible often hides cash prices behind credit or membership UI. Treat price_hidden, price_unknown, and needs_review as honest uncertainty, not as failures.
Optional authenticated pricing:
audible-auth-start and audible-auth-finish.<workspace>/.audible-goodreads-deal-scout/audible-auth.json.--max-requests accordingly.credit_price, as cash discounts.discounted as "member-visible cash price below list price", not proof of a limited-time sale; check pricing.dealType.audible-auth-status to check readiness, expiry, and file permissions without exposing tokens.sh "{baseDir}/scripts/audible-goodreads-deal-scout.sh" audible-auth-start \
--auth-path "<workspace>/.audible-goodreads-deal-scout/audible-auth.json" \
--audible-marketplace us
sh "{baseDir}/scripts/audible-goodreads-deal-scout.sh" audible-auth-finish \
--auth-path "<workspace>/.audible-goodreads-deal-scout/audible-auth.json" \
--redirect-url "<final-amazon-redirect-url>"
Troubleshooting:
sh "{baseDir}/scripts/audible-goodreads-deal-scout.sh" doctor \
--config-path "<config-path>"
sh "{baseDir}/scripts/audible-goodreads-deal-scout.sh" audible-auth-status \
--auth-path "<workspace>/.audible-goodreads-deal-scout/audible-auth.json"
To verify the installed bundle version:
sh "{baseDir}/scripts/audible-goodreads-deal-scout.sh" version
Use doctor --check-audible-fetch only when the user wants a live host probe of the Audible daily-deal fetch path.
For ready_* prep results:
artifacts.runtimePromptPathartifacts.runtimeInputPathartifacts.runtimeOutputSchemaPathsh "{baseDir}/scripts/audible-goodreads-deal-scout.sh" finalize \
--prepare-json "<prepare-result-path>" \
--runtime-output "<runtime-output-path>"
If the user wants the result routed to a configured channel:
sh "{baseDir}/scripts/audible-goodreads-deal-scout.sh" run-and-deliver \
--config-path "<config-path>" \
--prepare-json "<prepare-result-path>" \
--runtime-output "<runtime-output-path>"
personalData.exactShelfMatch == "to-read", recommend immediately. This overrides the Goodreads threshold.read or currently-reading, do not continue.metadata.threshold.error_goodreads_lookup_failed.suppress_no_goodreads_match.Skill-layer reason codes:
recommend_to_read_overriderecommend_public_thresholdsuppress_below_goodreads_thresholdsuppress_no_goodreads_matcherror_goodreads_lookup_failedThe model writes the fit paragraph. Python does not call a provider API directly.
Use:
artifacts.fitContextPathartifacts.reviewSourcePath when presentartifacts.notesPath when presentRules:
personalData.privacyMode == "minimal", do not use personal CSV or notes content in the fit paragraph.Fallback lines:
Fit: No personal preference data was configured, so this recommendation is based only on the public Goodreads score.Fit: Personalized fit feedback is unavailable right now, but the recommendation decision still completed.run-and-deliver must respect the configured deliveryPolicy:
positive_only: deliver only recommendalways_full: deliver the full card for every final statussummary_on_non_match: deliver full recommend, but a short summary card for suppress or errorFor scheduled runs, prep with --invocation-mode scheduled. If prep returns suppress_duplicate_scheduled_run, stop quietly. After a surfaced scheduled result, mark the deal as emitted with:
sh "{baseDir}/scripts/audible-goodreads-deal-scout.sh" mark-emitted \
--state-file "<state-file>" \
--prepare-json "<prepare-result-path>" \
--deal-key "<deal-key>"
Use the same current scheduled prepare artifact that was delivered. run-and-deliver refuses scheduled error prep results and stale scheduled artifacts whose metadata.storeLocalDate is not the current Audible marketplace date.