Skip to content

Advanced recipes

These workflows combine commands and filters for broader searches, repeatable preferences, and external automation.

Scan subcategories

Broad categories can hide books beyond the catalog page horizon. Scan every resolved subcategory separately to improve coverage:

deals find --genre sci-fi --subcategories --max-price 5

Combine this with --deep for maximum coverage at the cost of more API calls:

deals find --genre sci-fi --subcategories --deep --max-price 5

Preview an expensive scan

--dry-run reports the sort orders, pages, and API-call count without fetching catalog data:

deals find --genre sci-fi --deep --dry-run

For the defaults, a deep scan reports three sort orders, 10 pages per sort, and 30 API calls.

Find a new series by narrator

deals find \
  --narrator "R.C. Bray" \
  --first-in-series \
  --skip-owned \
  --max-price 5

Find books in a series

deals find --genre sci-fi --series "Bobiverse" --max-price 5
deals search "Brandon Sanderson" --series "Cosmere" --max-price 10

Save profiles for different moods

deals profile save long-cheap \
  --max-price 3 --min-hours 15 --sort price-per-hour --deep --skip-owned

deals profile save hidden-gems \
  --max-price 5 --min-rating 4.5 --min-ratings 50 --first-in-series

deals profile save binge-series \
  --max-price 5 --min-hours 20 --sort price-per-hour

Then reuse a profile with either catalog entry point:

deals find --profile long-cheap
deals search "fantasy epic" --profile long-cheap

Apply preferences globally

deals config set skip-owned true
deals config set max-price 5
deals config set min-rating 3.5

Every later find or search uses those defaults. A profile overrides the global configuration, and an explicit CLI option overrides both.

Search several phrasings

Use | for an OR search. Results are deduplicated automatically:

deals search "WWII | second world war" \
  --max-price 5 --on-sale --skip-owned --sort value

deals last --max-price-per-hour 0.25 --show-url

Browse adjacent genres without repeats

--exclude-seen removes ASINs returned by earlier searches:

deals find --genre sci-fi --max-price 5 --skip-owned --sort value
deals find --genre fantasy --max-price 5 --skip-owned --exclude-seen

The seen list accumulates across runs. Clear it with:

deals last --clear-seen

Rework results without another API call

deals find --genre mystery --max-price 5
deals last --max-price 8 --sort discount
deals last --min-rating 4.5 -n 5
deals last --clear-filter min-rating
deals last --reset
deals last -o mystery-deals.csv
deals detail @1
deals compare @1 @3

Hunt for historically low prices

# Keep titles in the cheapest quartile of their tracked history
deals find --genre sci-fi --hist-below 25 --require-history

# Require a 30% drop and limit results to recent releases
deals find --min-price-drop 30 --released-after 2024-01-01

Without --require-history, titles without enough data pass through so new catalog discoveries are not hidden.

Fill gaps in series you own

# Group missing books by series
deals series --gaps

# Focus on series where you own at least three books
deals series --min-books 3 --max-price 10 --sort discount

Compare marketplaces

deals detail B00R6S1RCY
deals --locale uk detail B00R6S1RCY
deals --locale de detail B00R6S1RCY

Prices can differ between Audible stores. Authentication and availability rules still apply per marketplace.

Filter JSON with jq

Use --json for criteria not built into the CLI:

deals find --genre sci-fi --max-price 5 --json | \
  jq '[.[] | select(.num_ratings > 1000 and .discount_pct > 80)] | sort_by(-.num_ratings)'

deals find --genre thriller --max-price 3 --json | jq -r '.[].asin'

Run a daily genre sweep

#!/bin/bash
for genre in sci-fi thriller mystery romance; do
  echo "=== $genre ==="
  deals find \
    --genre "$genre" --max-price 3 --skip-owned --deep \
    -n 5 -q -o "deals-${genre}.csv"
done

Send scheduled alerts with cron

The built-in track scheduler is the simplest option. If you prefer cron:

deals wishlist add B00R6S1RCY B082FKF7RC --max-price 3

Open the crontab with crontab -e, then add:

0 8 * * * deals notify --webhook https://hooks.slack.com/services/XXX/YYY/ZZZ

Without --webhook, notify prints JSON for piping into another tool.