booksearch-api

Search Amazon KDP books on the BeyondBSR public API and retrieve BSR (Best Sellers Rank) history for a single book. Use this skill whenever the user wants to discover, filter, or research self-published or traditionally published books on Amazon by BSR, category, keyword, royalty range, rating, reviews, publication date, binding type, or marketplace (US, UK, DE, FR, IT, ES, CA), or when the user wants the BSR timeline of a specific ASIN over the last N days. Typical intents include KDP niche research, low-competition book discovery, sales estimation, royalty/revenue projection, competitor analysis, paperback/hardcover filtering, bulk listing of books matching numeric/textual criteria, and single-ASIN BSR history charts. Do not use for price-history timelines, review/rating timelines, or account/user data — only book search and BSR history are exposed.

Safety Notice

This listing is from the official public ClawHub registry. Review SKILL.md and referenced scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "booksearch-api" with this command: npx skills add ramius88/booksearch-api

BookSearch API

Programmatic search over the BeyondBSR book catalogue plus BSR history retrieval for a single book. Two endpoints, JSON in / JSON out, API-key auth.

When to use this skill

Use it when the user asks to:

  • Find books matching numeric filters: BSR range, rating, reviews count, royalty, page count age, publication recency.
  • Discover niches by keyword inclusion/exclusion or Amazon category IDs.
  • Filter by marketplace (Amazon.com, .co.uk, .de, .fr, .it, .es, .ca).
  • Distinguish self-publishers from traditional publishers.
  • Estimate sales (daily / weekly / monthly / quarterly) and revenue per copy.
  • Compare BSR averages across multiple time windows (7d / 30d / 90d / 180d / 365d).
  • Retrieve the BSR timeline of a single book (by domainId + asin) over the last N days, e.g. for charting rank evolution.

Do NOT use for: price-history charts, review/rating timelines, account/user data, or anything not in the response schemas below. Those are out of scope.

Endpoints

POST https://beyondbsr.com/api/v1/books/search
GET  https://beyondbsr.com/api/v1/books/{domainId}/{asin}/bsr-history?days={1..365}
Content-Type: application/json   (search only)
X-API-Key: $BOOKSEARCH_API_KEY

Authentication

  • Read the key from the BOOKSEARCH_API_KEY env var. Format: bbsr_live_<43-char-base64url>.
  • Never print, echo, log, or include the key in any user-facing output. Never paste it into another tool's input.
  • On 401 Unauthorized: do not retry. Report "API key missing or invalid — check BOOKSEARCH_API_KEY env var" and stop.
  • Send X-API-Key exactly once. Multi-valued headers are rejected.

Marketplace domains

Map natural-language marketplace references (e.g. "Amazon.de", "the UK store", "amazon italia") to domainId using this table:

domainIdlocalecountryname
1comUSUnited States
2co.ukGBUnited Kingdom
3deDEGermany
4frFRFrance
6caCACanada
8itITItaly
9esESSpain

IDs 5 and 7 are intentional gaps in the dataset — do not invent them. The validator technically accepts 1–12, but only the seven IDs above are guaranteed to return data. If the user asks for a marketplace not listed (e.g. Japan, Australia), tell them it is not currently supported.

Request schema

All fields are optional except domainId. Enums accept either the string name (e.g. "Weekly") or the integer value.

Required

FieldTypeConstraint
domainIdintOne of the 7 IDs in the marketplace table above (validator allows 1–12).

BSR filters

FieldTypeDefaultNotes
bsrTypeenumWeeklyHistorical(-1), Current(0), Weekly(7), Days30(8), Days90(9), Days180(10), Days365(11)
bsrMinint?1≥ 1
bsrMaxint?100000≥ 1, bsrMin ≤ bsrMax
bsrYearshort?null2000–(current year + 1). Required together with bsrMonth. Use only with bsrType=Historical.
bsrMonthshort?null1–12. Required together with bsrYear.

Product filters

FieldTypeDefaultNotes
bindingTypeenum?null (all)All, Paperback, Hardcover
publisherTypeenum?AllAll, SelfPublishersOnly, PublishersOnly
interiorTypeenum?BlackWhiteBlackWhite, FullColor
vatTypeenum?ReducedReduced, Standard
includePreOrdersbool?false

Quality filters

FieldTypeConstraint
ratingMindouble?0.0–5.0, ratingMin ≤ ratingMax
ratingMaxdouble?0.0–5.0
reviewsMinint?≥ 0, reviewsMin ≤ reviewsMax
reviewsMaxint?≥ 0

Economic filters

FieldTypeNotes
royaltyMindecimal?In currency units, not cents. min ≤ max.
royaltyMaxdecimal?
monthsSincePublicationMinint?min ≤ max
monthsSincePublicationMaxint?

Discovery

FieldTypeDefaultConstraint
includeKeywordsstring[]null≤ 25 items, each ≤ 100 chars, non-empty
excludeKeywordsstring[]null≤ 25 items, each ≤ 100 chars, non-empty
categoryIdslong[]null≤ 100 items, each > 0 (Amazon BrowseNode IDs)
excludeFictionbool?trueWhen true (default), filters out fiction books — i.e. books whose categories all roll up to depth-2 ancestors flagged as fiction (Literature & Fiction, Romance, Mystery, Sci-Fi, Children's Books, Teen/YA, etc.) under the local Books root for the requested marketplace. A book is kept if at least one of its categories has a depth-2 ancestor flagged as non-fiction. Set false to include fiction. Auto-disabled when categoryIds is non-empty: explicit category intent overrides the fiction filter, otherwise passing a fiction category with the default would silently return zero results. Currently unsupported on Amazon.ca (domainId=6): with excludeFiction=true no books are returned for CA — pass false for that marketplace.

Pagination

FieldTypeDefaultRange
limitint?1001–300
offsetint?00–100000

Workflow

  1. Marketplace — Identify domainId from intent using the marketplace table. If ambiguous (e.g. "Amazon"), ask which country.
  2. Translate — Map every natural-language filter to its schema field. Don't guess enum values; use the table. Note: by default fiction is excluded (excludeFiction=true). If the user asks for fiction (e.g. "romance", "mystery novels", "show me fiction too") or a mixed catalog, set excludeFiction: false explicitly. Most KDP/low-content niche queries are non-fiction so the default is usually correct.
  3. Pagination — Default to limit: 50. Raise to 100–300 only if the user explicitly wants many results. Start with offset: 0.
  4. Send — POST the JSON body. Inspect the status code first.
  5. Paginate if needed — If returnedCount == limit, more results likely exist. Offer to fetch the next page with offset += limit.
  6. Present — Surface title, asin, bsr, sales/revenue estimates, and a clickable cover URL (see response notes).

Example request

{
  "domainId": 3,
  "bsrType": "Days90",
  "bsrMin": 1,
  "bsrMax": 50000,
  "bindingType": "Paperback",
  "publisherType": "SelfPublishersOnly",
  "ratingMin": 4.0,
  "reviewsMin": 10,
  "interiorType": "BlackWhite",
  "vatType": "Reduced",
  "royaltyMin": 2.50,
  "royaltyMax": 15.00,
  "monthsSincePublicationMax": 24,
  "includePreOrders": false,
  "includeKeywords": ["journal", "notebook"],
  "excludeKeywords": ["coloring"],
  "categoryIds": [266162, 3248921],
  "excludeFiction": false,
  "limit": 50,
  "offset": 0
}

Example cURL

curl -X POST "https://beyondbsr.com/api/v1/books/search" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BOOKSEARCH_API_KEY" \
  -d '{
    "domainId": 3,
    "bsrType": "Days90",
    "bsrMax": 50000,
    "bindingType": "Paperback",
    "publisherType": "SelfPublishersOnly",
    "ratingMin": 4.0,
    "limit": 50
  }'

Response schema

Envelope — BookSearchApiResponse

FieldTypeNotes
returnedCountintItems in this page. NOT a total-match count (no total exposed).
limitintEffective limit applied (capped at 300).
offsetintEffective offset applied.
resultsarrayBookSearchResultDto[]. Empty if no match.

Result item — BookSearchResultDto (most relevant fields)

FieldTypeNotes
idlongInternal book ID.
asinstring10-char Amazon ASIN.
titlestringFull title.
authorsstring?Comma-separated, ordered by display_order.
publicationDatedatetime?Nullable.
publisherstring?Manufacturer/publisher name.
coverImageFilenamestring?Build URL: https://m.media-amazon.com/images/I/{filename}.
imageFilenamesstring[]All carousel images (same URL pattern).
ratingdouble0.0–5.0.
reviewsintTotal reviews.
bsrintThe column matching the requested bsrType — i.e. the value filtered/sorted on.
bsrCurrentint?Latest snapshot BSR, regardless of bsrType.
avgBsr7dint?Always populated.
avgBsr30dint?Always populated.
avgBsr90dint?Always populated.
avgBsr180dint?Always populated.
avgBsr365dint?Always populated.
pageCountint?
priceCentsint?List price (MSRP) in cents.
dailyEstimatedecimalEstimated copies/day from BSR model.
weeklyEstimatedecimalEstimated copies/week.
monthlyEstimatedecimalEstimated copies/month.
quarterlyEstimatedecimalCopies/quarter (needs ≥ 13 weeks of data).
royalty*Centsint?Per-copy royalty in cents. 4 combinations: B/W or Color × Reduced or Standard VAT.
*Revenue*Centslong?Derived = estimate × royalty. 16 fields total: {daily,weekly,monthly,quarterly} × {Black,Color} × {Reduced,Standard}.
bindingstring?Localised label (e.g. "Paperback", "Hardcover", "Non-standard").
dimensionsstring?Formatted, prefixed by binding. Example: "Paperback: 152 x 8 x 229 mm".
trim/spineWidthMmint?Trim/spine measurements.

Important caveats

  • All royalty and revenue fields are in cents — divide by 100 before showing currency.
  • bsrbsrCurrent. bsr is whatever column was chosen by bsrType; bsrCurrent is always the latest snapshot.
  • In bsrType=Historical mode, the avgBsrXd averages come from the current snapshot table while bsr itself is the historical month value — there is a documented temporal asymmetry inside the same response. Mention this if the user is doing a strict historical analysis.

BSR History endpoint

Single-ASIN BSR timeline. Returns raw snapshots from the time-series store, ordered ascending by recordedAt.

GET https://beyondbsr.com/api/v1/books/{domainId}/{asin}/bsr-history?days={1..365}
X-API-Key: $BOOKSEARCH_API_KEY
Accept: application/json

When to use

  • The user has a specific ASIN and wants its BSR over time (chart, drill-down, sanity-check the search-time avgBsrXd averages).
  • The user wants to verify a book's recent rank trajectory (e.g. "is it gaining or losing visibility?").

If the user has filter criteria but no specific ASIN, use POST /search first, then call this endpoint per ASIN of interest.

Path & query parameters

ParamInTypeRequiredConstraint
domainIdpathintyesOne of the 7 marketplace IDs (see Marketplace domains table; validator allows 1–12).
asinpathstringyesExactly 10 chars, regex ^[A-Z0-9]{10}$ (uppercase letters / digits only).
daysqueryint?no1–365. Default 365. Window is [now - days, now] UTC.

Example request

GET /api/v1/books/1/1635864348/bsr-history?days=90
X-API-Key: $BOOKSEARCH_API_KEY
Accept: application/json

Example cURL

curl -X GET "https://beyondbsr.com/api/v1/books/1/1635864348/bsr-history?days=90" \
  -H "X-API-Key: $BOOKSEARCH_API_KEY" \
  -H "Accept: application/json"

Response schema — BookBsrHistoryApiResponse

FieldTypeNotes
asinstringEchoed from request.
domainIdintEchoed from request.
fromUtcdatetimeWindow start (now - days), UTC.
toUtcdatetimeWindow end (now), UTC.
pointCountintNumber of BSR snapshots in points.
pointsarrayBsrPointDto[] ordered ascending by recordedAt.

BsrPointDto:

FieldTypeNotes
recordedAtdatetimeUTC timestamp of the snapshot.
bestSellersRankint?BSR at that timestamp. May be null if Keepa returned no rank.

Example body:

{
  "asin": "1635864348",
  "domainId": 1,
  "fromUtc": "2026-01-27T00:00:00Z",
  "toUtc": "2026-04-27T00:00:00Z",
  "pointCount": 412,
  "points": [
    { "recordedAt": "2026-01-27T03:14:00Z", "bestSellersRank": 1234 },
    { "recordedAt": "2026-01-27T15:02:00Z", "bestSellersRank": 1218 }
  ]
}

Status codes (BSR history specific)

CodeMeaningNotes
200OKpointCount may be 0 if no snapshots exist in the window.
400Validation failedValidationProblemDetails. Common causes: days out of range, asin wrong format, domainId out of [1,12].
404ASIN not found for that domainEmpty body. The book is not tracked in BeyondBSR for this marketplace. Tell the user — do not retry with the same pair.
401 / 429 / 500See generic table below.

Caveats

  • Granularity is raw: Keepa snapshots arrive 1–4× per day on actively-tracked books. A 365-day window typically yields 365–1460 points. No daily aggregation is applied.
  • The endpoint returns only (recordedAt, bestSellersRank). Use POST /search if you also need rating/review/price data.
  • ASIN is case-sensitive — must be uppercase. 1635864348 (all digits) is valid.
  • Default 365 days is the cap. Longer histories are not exposed; do not retry with days > 365.

Status codes & error handling

CodeMeaningBodyAgent action
200OK (may be empty list)BookSearchApiResponseParse results. Empty array = no matches, not an error.
400Validation failedValidationProblemDetails (RFC 7807)Read the errors map, fix the body, do not retry blindly. Surface the issue.
401Auth failedempty + WWW-Authenticate: ApiKey realm="BeyondBSR"Stop. Report misconfigured BOOKSEARCH_API_KEY. Do not retry.
429Rate limit exceeded"Rate limit exceeded. Please try again later." + Retry-After headerHonour Retry-After. Back off. Do not hammer the endpoint.
500Unhandled server errorProblemDetails JSONRetry once after a few seconds. If it persists, escalate to the user.

Example 400 body

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "errors": {
    "DomainId": ["DomainId must be between 1 and 12."],
    "Limit": ["Limit must be between 1 and 300."]
  }
}

Sorting & pagination notes

  • Default sort: ORDER BY <chosen BSR column> ASC (lower BSR = better seller appears first).
  • Historical mode (bsrType=Historical + bsrYear/bsrMonth): sorted by the historical monthly BSR rank ASC.
  • Tie-breaker is non-deterministic — books with identical BSR may appear in different orders across page fetches. Warn the user if they need a perfectly stable ordering.
  • No orderBy parameter is exposed.

Limits

  • Rate limit: 120 requests/minute per API key. Shared across all callers using the same key.
  • Body size: 128 KB max.
  • Page size: 300 results max per request (limit ≤ 300).
  • Offset cap: 100,000 (deep pagination beyond this is not supported — refine filters instead).

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

Byd Company

Chinese EV leader BYD integrates battery production, vehicle manufacturing, and semiconductors to dominate global plug-in sales and technology innovation.

Registry SourceRecently Updated
General

Polymarket Ladder Nhl Hockey Trader

Trades monotonicity violations in NHL hockey O/U market ladders and spread-vs-total consistency on Polymarket. Each game spawns multiple O/U lines that must...

Registry SourceRecently Updated
General

Polymarket 48h Precipitation Range Trader

Trades mispricings in precipitation-range markets by reconstructing the implied probability distribution across bins for the same city and period, detecting...

Registry SourceRecently Updated
General

City Of London

Global financial hub with a $900B+ economy, known for fintech innovation, diverse industries, top universities, and a key role in global trade and finance.

Registry SourceRecently Updated