BeyondBSR - BookSearch API

v1.0.2

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...

2· 170·0 current·0 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for ramius88/booksearch-api.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "BeyondBSR - BookSearch API" (ramius88/booksearch-api) from ClawHub.
Skill page: https://clawhub.ai/ramius88/booksearch-api
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Required env vars: BOOKSEARCH_API_KEY
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install booksearch-api

ClawHub CLI

Package manager switcher

npx clawhub@latest install booksearch-api
Security Scan
Capability signals
Requires sensitive credentials
These labels describe what authority the skill may exercise. They are separate from suspicious or malicious moderation verdicts.
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
Name/description match the declared requirements and endpoints. The only required secret is BOOKSEARCH_API_KEY, which is appropriate for an external API that provides BSR/book search data. Minor note: the skill metadata lacks a source/homepage which means provenance is unknown, but this is a transparency issue rather than an incoherence between purpose and requested capabilities.
Instruction Scope
SKILL.md limits runtime actions to calling two documented BeyondBSR endpoints for search and BSR history and instructs the agent to read only BOOKSEARCH_API_KEY. The doc explicitly forbids unrelated data (price-history, account/user data) and instructs not to echo the API key. No instructions request access to unrelated files, credentials, or external endpoints.
Install Mechanism
Instruction-only skill with no install spec and no code files; nothing is written to disk or downloaded during install. This is the lowest-risk install model and is appropriate for a simple API-integration skill.
Credentials
Only a single environment variable is required (BOOKSEARCH_API_KEY) and the SKILL.md documents the expected format and strict handling. The requested credential is proportionate and directly tied to the described API usage.
Persistence & Privilege
The skill does not request permanent/always-on inclusion (always:false) and does not declare writes to other skills or system-wide config. Autonomous invocation by the agent is allowed by default (disable-model-invocation:false) which is normal for skills; this is noted but not flagged by itself.
Assessment
This skill appears coherent and limited to calling the BeyondBSR API using a single API key. Before installing, consider: 1) Verify the origin/trustworthiness of the skill (source and owner are not public and there is no homepage listed). 2) Only provide a BOOKSEARCH_API_KEY issued by a trusted BeyondBSR account; avoid using long-lived keys with broader scopes than necessary. 3) Treat the key as a secret: confirm the platform will not leak it and rotate it if you suspect exposure. 4) Review BeyondBSR’s privacy/terms to ensure you are comfortable with sending search queries and ASINs to that service. 5) If you are uncomfortable with autonomous invocation, disable model invocation for the skill or avoid setting the API key in shared environments.

Like a lobster shell, security has layers — review code before you run it.

Runtime requirements

EnvBOOKSEARCH_API_KEY
latestvk971301w5z9n4xpvt5000m390h85nmkr
170downloads
2stars
3versions
Updated 23h ago
v1.0.2
MIT-0

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

FieldTypeConstraint
includeKeywordsstring[]≤ 25 items, each ≤ 100 chars, non-empty
excludeKeywordsstring[]≤ 25 items, each ≤ 100 chars, non-empty
categoryIdslong[]≤ 100 items, each > 0 (Amazon BrowseNode IDs)

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.
  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],
  "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).

Comments

Loading comments...