# Amazon Bestseller Radar - BSR Movers, New Entries & Price Delta (`doesaiknow/amazon-bestseller-radar`) Actor

Track Amazon Best Sellers categories and see what actually changed since your last run: new entries, climbers, fallers and drop-outs with rank deltas, prices and demand signals. Up to 10 categories per run, flat price per category - not per product. Schedule it daily or weekly.

- **URL**: https://apify.com/doesaiknow/amazon-bestseller-radar.md
- **Developed by:** [David S](https://apify.com/doesaiknow) (community)
- **Categories:** E-commerce, Automation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.032 / category scan (per category, per page scanned)

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Amazon Bestseller Radar — BSR Movers, New Entries & Price Delta

Most bestseller scrapers hand you a list. This one hands you **what changed**: run it on up to **10 Amazon Best Sellers categories** at once and get, next to the current ranking (top 30, plus ranks 51–80 at depth 2), the **movement since your previous run** — new entries, climbers, fallers and drop-outs, each with rank deltas, prices and demand signals, plus a per-category volatility score. One **flat price per category — never per product**. Schedule it daily or weekly and wire the dataset straight into **n8n, Make, Zapier, Google Sheets, Slack alerts or AI agents** (Claude, ChatGPT and any LLM workflow via Apify's API and MCP).

The radar computes movement from **your own run history** — not from Amazon's Movers & Shakers page, which shows only Amazon's fixed 24-hour window. Your watchlist compares any two of *your* runs, at any cadence you choose: daily, weekly, monthly. Every run deepens a history that no fresh scrape can reproduce.

### What changed since your last run (the product)

Set a `watchlistId` and every run answers the only question that matters: *what moved?*

```json
"movement": {
  "new_entries":  [{ "asin": "B0FN4NH4K8", "rank_after": 12 }],
  "climbers":     [{ "asin": "B00NTCH52W", "rank_before": 28, "rank_after": 9,  "delta": 19,  "price_change": -0.50 }],
  "fallers":      [{ "asin": "B07BGLT25K", "rank_before": 4,  "rank_after": 22, "delta": -18, "price_change": 0.32 }],
  "dropped_out":  [{ "asin": "B0C2CY22B8", "rank_before": 30 }],
  "vs_run": "2026-07-20T06:00:00Z"
}
````

- **Positive delta = moved up the list.** A climb from 28 to 9 is `+19`; a slide from 4 to 22 is `-18`.
- **`price_change` rides along** on every mover, so you see whether a climb came with a price cut.
- **The first run of a watchlist is the baseline**: full ranking delivered, movement empty by definition, flagged `baseline: true` — never a silent empty result. From run 2 onward, movement flows.
- If a run was taken differently from the previous one (different depth, different data path), the row says `not_comparable_reason` instead of inventing movement. Reporting nothing honest beats reporting fake movement.

### Ranking with demand signals

Every category row carries the ordered ranking — `rank` is **Amazon's own badge number**, read off the page:

```json
{ "rank": 1, "asin": "B079VP6DH5", "title": "Bounty Paper Towels Quick Size...",
  "brand": "Bounty", "price": 45.73, "stars": 4.8, "reviews": 234786,
  "bought_last_month": 100000, "is_amazon_choice": true, "is_best_seller": false }
```

- **Price, stars and review counts come with every ranked product.**
- **Demand signals** (`bought_last_month`, Amazon's Choice / Best Seller badges) are attached to the **top 10 of each category** — the zone worth acting on. So "new entry at rank 12" arrives with purchase context, not as a bare ASIN.
- `brand` is inferred from product titles (Amazon states no brand on Best Sellers pages); `brand_source` tells you which rule produced it, so an inferred brand is never dressed up as a stated fact.

### Volatility score — which categories are in play

Each row ends with a summary built for choosing where to compete:

```json
"summary": { "volatility_score": 4.8, "new_entry_count": 3,
             "avg_price_top10": 21.40, "price_movement_top10": -0.6 }
```

`volatility_score` is the mean absolute rank change across products present in both runs. A category at 0.5 is frozen; a category at 6+ is in play. Combined with `avg_price_top10` and its movement, it is a shortlist machine for product research: scan 10 categories weekly, read one number per category, dig into the two that moved.

### Pricing — flat per category, not per product

You pay **per category scanned**, after results are delivered:

| Event | Price (Store FREE tier) | What it covers |
|---|---|---|
| Actor start | $0.05 per run | validation + cache lookup |
| **Category scan** | **$0.05 per category × depth** (down to $0.032 on higher Store tiers) | ranking + demand signals + movement + volatility summary |

Depth 1 (top 30) = 1 scan per category; depth 2 (top 30 + ranks 51–80) = 2 scans. **There is no per-row fee.** Raw per-item scrapers charge $0.005–0.006 per product, which makes one top-100 category cost $0.30–0.59 *per run* — this radar delivers the same category **with the movement layer included** for $0.05–0.10.

Worked examples (FREE-tier prices — paid Store tiers are cheaper):

| Setup | Monthly cost |
|---|---|
| 5 categories, daily, depth 2 | ≈ $16.50/mo |
| 10 categories, weekly, depth 2 | ≈ $4.55/mo |
| 1 hobby category, weekly, top 30 | ≈ $0.45/mo |

**Never billed:** categories that failed upstream, repeat runs served from the 24-hour cache, and empty results. **Start free:** every account gets a 1-category preview per run (top 30) at no feature cost, and Apify's free $5 platform credit covers roughly 50 category scans — enough to watch one category daily for a month before paying anything.

### How it compares

- **Jungle Scout ($49–129/mo), Helium 10 ($99+/mo), AMZScout ($45+/mo)** — seat-based suites. If all you need is "what moved in my categories this week", a scheduled radar at a few dollars a month answers it without the seat.
- **Keepa (€19/mo)** — excellent per-product BSR *history*; no category-level "what changed since my last check" layer. Many users run both: Keepa for product deep-dives, the radar for category-level triage.
- **Amazon's own Movers & Shakers page** — a fixed 24-hour window, Amazon's choice of products. The radar measures *your* categories over *your* cadence, and keeps history.
- **Per-item bestseller scrapers** — a list, priced per row. No memory, no deltas, and a top-100 dump costs 3–6× more per run than a category here.

### Use with AI agents & LLM workflows

The dataset is plain JSON, which makes the radar a natural sensor for automation:

- **n8n / Make / Zapier**: schedule the Actor → trigger on new dataset items → push "3 new entries in Health & Household today" into Slack, Teams or Google Sheets.
- **AI agents**: connect through Apify's MCP server and let a Claude- or GPT-based agent run scans on demand and read movement directly.
- **LLM summaries**: pipe the `movement` object into a prompt like *"Summarize today's category changes and pick 3 products worth investigating"* — the object is small, structured and delta-only, so it fits comfortably in any context window.

### How movement is measured (honest scope)

- **Coverage:** a static scan of a Best Sellers page yields Amazon's top 30; page 2 carries ranks 51–80. Amazon only serves ranks 31–50 and 81–100 to a scrolling browser, so **no scheduled tool can see them** — this one does not pretend to. Ranks shown are Amazon's own badge numbers, and `new_entries` / `dropped_out` mean "entered / left the observed window".
- **Cadence:** Amazon refreshes Best Sellers roughly hourly. Scanning more often than daily mostly measures that hourly jitter — the radar is built and priced for **daily or weekly** tracking. In release testing, two scans of the same category taken minutes apart agreed within 0–3 rank positions across the full observed set.
- **Baseline:** movement needs two points. Your first run of a watchlist stores the baseline and says so; it is billed, because the ranking it delivers and stores is the answer your next run is measured against.
- **Reliability:** if the primary data path fails twice in a row, the run completes on an independent fallback path — those rows are flagged `source: "fallback"` and carry ranks only, with price fields `null` (never a fake zero).
- **Marketplace:** amazon.com (US) in this version. Other marketplaces are planned.

### Input

```json
{
  "categories": ["https://www.amazon.com/Best-Sellers-Health-Household/zgbs/hpc/"],
  "depth": 2,
  "watchlistId": "my-radar",
  "enrichDemand": true
}
```

Paste full Best Sellers URLs (they contain `/zgbs/`). Duplicates and paste variants of the same category are merged before anything is charged. Invalid entries are rejected up front — a malformed request never costs money.

| Field | Type | Default | What it does |
|---|---|---|---|
| `categories` | array | — (required) | Full Amazon Best Sellers category URLs, up to 10 per run |
| `depth` | 1–2 | 2 | 1 = top 30 · 2 = top 30 + ranks 51–80 (2× category-scan events) |
| `watchlistId` | string | — | Any label; runs sharing it are compared → movement. One per niche/client |
| `enrichDemand` | boolean | true | Demand signals (bought-last-month, badges) for each category's top 10 |
| `marketplace` | `com` | `com` | amazon.com (US) in this version |
| `bypassRunCache` | boolean | false | Force a fresh scan inside the 24-hour cache window (this charges) |

### Quick start

**Console:** paste one or more Best Sellers URLs into *Categories*, set a *Watchlist ID*, click Start. The first run stores your baseline; from the second run the **Movement** view shows what changed.

**Schedule it** (this is where the radar earns its name): Apify Console → *Schedules* → attach this Actor, cron `0 6 * * *` for daily at 06:00 or `0 6 * * 1` for weekly on Mondays. Keep the same input — same watchlist, same categories, same depth — so every scheduled run extends one clean history. Results land in the run's dataset, downloadable as JSON/CSV/Excel or served over the API.

**API:**

```bash
curl -X POST "https://api.apify.com/v2/acts/<ACTOR_ID>/runs?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"categories": ["https://www.amazon.com/Best-Sellers-Health-Household/zgbs/hpc/"],
       "depth": 2, "watchlistId": "my-radar"}'
```

Then read the dataset: `GET https://api.apify.com/v2/datasets/<DATASET_ID>/items` — one JSON object per category, ready for a spreadsheet, a dashboard or an LLM prompt.

### Output reference

One dataset row per category per run:

| Field | What it is |
|---|---|
| `category`, `category_url` | Human-readable name (from the page itself) and the canonical URL |
| `run_at` | ISO timestamp of this scan |
| `ranking[]` | Ordered products: `rank` (Amazon's badge number), `asin`, `title`, `brand` + `brand_source`, `price`, `stars`, `reviews`, `url`; top 10 add `bought_last_month`, `is_amazon_choice`, `is_best_seller` |
| `movement` | `new_entries` / `climbers` / `fallers` / `dropped_out` (+ `vs_run`) — only when `watchlistId` is set |
| `baseline` | `true` on the first run of a watchlist (movement empty by definition) |
| `not_comparable_reason` | Present instead of movement when this run was taken differently than the last (`depth_changed`, `source_changed`) |
| `summary` | `volatility_score`, `new_entry_count`, `avg_price_top10`, `price_movement_top10` |
| `source` | `primary` (full rows) or `fallback` (rank-only; price fields `null`) |
| `depth_pages`, `results_scanned`, `parse_confidence` | Scan telemetry — `parse_confidence` below 1.0 signals a page-layout change |

Null means *unobserved*, never zero: a fallback-sourced price is `null`, a product with no rating shows `stars: null`, and `price_change` only appears when both runs actually carried a price.

### Popular categories to start with

All verified live — paste any of these straight into the input:

| Category | URL |
|---|---|
| Health & Household | `https://www.amazon.com/Best-Sellers-Health-Household/zgbs/hpc/` |
| Beauty & Personal Care | `https://www.amazon.com/Best-Sellers-Beauty/zgbs/beauty/` |
| Kitchen & Dining | `https://www.amazon.com/Best-Sellers-Kitchen-Dining/zgbs/kitchen/` |
| Home & Garden | `https://www.amazon.com/Best-Sellers-Home-Kitchen/zgbs/home-garden/` |
| Electronics | `https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/` |
| Toys & Games | `https://www.amazon.com/Best-Sellers-Toys-Games/zgbs/toys-and-games/` |
| Pet Supplies | `https://www.amazon.com/Best-Sellers-Pet-Supplies/zgbs/pet-supplies/` |
| Sports & Outdoors | `https://www.amazon.com/Best-Sellers-Sports-Outdoors/zgbs/sporting-goods/` |
| Grocery & Gourmet Food | `https://www.amazon.com/Best-Sellers-Grocery-Gourmet-Food/zgbs/grocery/` |
| Baby | `https://www.amazon.com/Best-Sellers-Baby/zgbs/baby-products/` |
| Office Products | `https://www.amazon.com/Best-Sellers-Office-Products/zgbs/office-products/` |
| Automotive | `https://www.amazon.com/Best-Sellers-Automotive/zgbs/automotive/` |
| Video Games | `https://www.amazon.com/Best-Sellers-Video-Games/zgbs/videogames/` |
| Clothing, Shoes & Jewelry | `https://www.amazon.com/Best-Sellers-Clothing-Shoes-Jewelry/zgbs/fashion/` |
| Tools & Home Improvement | `https://www.amazon.com/Best-Sellers-Tools-Home-Improvement/zgbs/hi/` |

Subcategories work the same way — navigate to any Best Sellers subcategory on Amazon (the URL keeps the `/zgbs/` segment) and paste it. A niche subcategory usually gives a sharper signal than a giant root category: top-30 movement in *Whey Protein Powders* means more than rank 29→28 in all of *Health & Household*.

### Who uses a bestseller radar

- **FBA / private-label sellers** — watch your own category daily: a new entry climbing with a price cut is tomorrow's competitor, visible on day one.
- **Product researchers** — scan 10 candidate niches weekly; let `volatility_score` and `new_entry_count` shortlist the two worth a deep dive.
- **Brands & agencies** — one watchlist per client; the movement object is the weekly report, ready for Slack or a slide.
- **Arbitrage & wholesale** — `price_movement_top10` plus faller lists flag categories where prices are sliding before margins do.

### FAQ

**How is this different from Amazon's Movers & Shakers page?**
That page is Amazon's own fixed 24-hour snapshot of products Amazon picks. The radar diffs *your* chosen categories between *your* runs — any cadence, any category, with history that accumulates in your account.

**Do I get the full top-100?**
No — and neither does any scheduled scraper, honestly labeled or not. Amazon lazy-loads ranks 31–50 and 81–100 in the browser. You get the top 30 (depth 1) plus ranks 51–80 (depth 2), under Amazon's own rank numbers.

**How often should I run it?**
Daily or weekly. Amazon updates Best Sellers hourly, so sub-daily runs mostly measure noise — and identical runs within 24 hours are served from cache without charges anyway.

**Does it track prices?**
Yes: every ranked product carries its current price, movers carry `price_change`, and each category summarizes `avg_price_top10` and its movement.

**Can I monitor several niches or clients separately?**
Yes — use a separate `watchlistId` per niche or client. Each keeps its own independent movement history.

**Is this a Jungle Scout alternative?**
For category-trend watching, yes: a scheduled radar at a few dollars per month instead of a $49–129/mo seat. For full product research suites (keyword tools, supplier databases), those platforms do more — pair the radar with a keyword-research actor and you cover the research loop for a fraction of the price.

**What happens on the very first run?**
You get the full ranking plus `baseline: true` and empty movement arrays. Movement appears from the second run of the same watchlist.

### Legal & compliance

The Actor reads publicly visible Amazon Best Sellers listing pages: product titles, ranks, prices, ratings and badges. It does not log into any account, does not access private data, and collects no personal information. You are responsible for using the data in line with the laws and terms that apply to you.

### Related actors

- **[Amazon Rank Tracker](https://apify.com/doesaiknow/amazon-rank-tracker)** — a new product just entered your category's top 10? Track the keywords it ranks for — organic and sponsored positions, share of shelf, movement run over run.
- **[Amazon Keyword Research Tool](https://apify.com/doesaiknow/amazon-keyword-research-tool-volume-reverse-asin)** — find and prioritize the search terms behind any niche you spot moving here, with Amazon search volume and reverse-ASIN lookup.
- **[Keyword Metrics Pro](https://apify.com/doesaiknow/doesaiknow-keyword-metrics-apify)** — Google + Bing volume, CPC and trends for the head terms of a category before you commit to it.

***

If the radar catches a mover you would have missed, a bookmark or an honest review helps other sellers find it.

# Actor input Schema

## `categories` (type: `array`):

Amazon Best Sellers category URLs, one per line — e.g. https://www.amazon.com/Best-Sellers-Health-Household/zgbs/hpc/. Each category costs one category-scan event per run (× depth). Duplicates are merged before anything is charged. FREE PLAN: 1-category preview per run at depth 1, movement tracking disabled.

## `depth` (type: `integer`):

1 = top 30 of the category. 2 = top 30 PLUS ranks 51–80 (Amazon only serves ranks 31–50 and 81–100 to a scrolling browser, so no scheduled tool can see them — ranks shown are Amazon's own badge numbers). Depth 2 costs 2× category-scan events per category.

## `watchlistId` (type: `string`):

Any label you choose, e.g. "supplements-radar" or a client name. Runs sharing a watchlist ID are compared with each other, so every run reports new entries, climbers, fallers and drop-outs since the previous one. Leave empty for a one-off snapshot with no history. Use a separate ID per project.

## `enrichDemand` (type: `boolean`):

Adds "bought in past month" and Amazon's Choice / Best Seller badges to the TOP 10 of each category — the zone the volatility summary prices and the zone worth acting on. Price, stars and review counts come with the full ranking either way (except on rare fallback-sourced runs, where enrichment also fills top-10 prices in).

## `marketplace` (type: `string`):

Amazon.com (US) only in this version. Other marketplaces are planned.

## `bypassRunCache` (type: `boolean`):

Identical runs within 24 hours normally return cached results with no per-category charge. Tick this to force a fresh scan — this WILL incur charges. Note: Amazon updates Best Sellers roughly hourly, so scanning more often than daily mostly measures noise.

## Actor input object example

```json
{
  "categories": [
    "https://www.amazon.com/Best-Sellers-Health-Household/zgbs/hpc/"
  ],
  "depth": 2,
  "enrichDemand": true,
  "marketplace": "com",
  "bypassRunCache": false
}
```

# Actor output Schema

## `categoryRows` (type: `string`):

Default dataset link. See dataset\_schema.json for per-field documentation.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "categories": [
        "https://www.amazon.com/Best-Sellers-Health-Household/zgbs/hpc/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("doesaiknow/amazon-bestseller-radar").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "categories": ["https://www.amazon.com/Best-Sellers-Health-Household/zgbs/hpc/"] }

# Run the Actor and wait for it to finish
run = client.actor("doesaiknow/amazon-bestseller-radar").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "categories": [
    "https://www.amazon.com/Best-Sellers-Health-Household/zgbs/hpc/"
  ]
}' |
apify call doesaiknow/amazon-bestseller-radar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=doesaiknow/amazon-bestseller-radar",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Amazon Bestseller Radar - BSR Movers, New Entries & Price Delta",
        "description": "Track Amazon Best Sellers categories and see what actually changed since your last run: new entries, climbers, fallers and drop-outs with rank deltas, prices and demand signals. Up to 10 categories per run, flat price per category - not per product. Schedule it daily or weekly.",
        "version": "0.1",
        "x-build-id": "TOpkzl1OTL9ncZCFe"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/doesaiknow~amazon-bestseller-radar/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-doesaiknow-amazon-bestseller-radar",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/doesaiknow~amazon-bestseller-radar/runs": {
            "post": {
                "operationId": "runs-sync-doesaiknow-amazon-bestseller-radar",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/doesaiknow~amazon-bestseller-radar/run-sync": {
            "post": {
                "operationId": "run-sync-doesaiknow-amazon-bestseller-radar",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "categories"
                ],
                "properties": {
                    "categories": {
                        "title": "Best Sellers categories",
                        "maxItems": 10,
                        "type": "array",
                        "description": "Amazon Best Sellers category URLs, one per line — e.g. https://www.amazon.com/Best-Sellers-Health-Household/zgbs/hpc/. Each category costs one category-scan event per run (× depth). Duplicates are merged before anything is charged. FREE PLAN: 1-category preview per run at depth 1, movement tracking disabled.",
                        "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 500
                        }
                    },
                    "depth": {
                        "title": "Scan depth",
                        "minimum": 1,
                        "maximum": 2,
                        "type": "integer",
                        "description": "1 = top 30 of the category. 2 = top 30 PLUS ranks 51–80 (Amazon only serves ranks 31–50 and 81–100 to a scrolling browser, so no scheduled tool can see them — ranks shown are Amazon's own badge numbers). Depth 2 costs 2× category-scan events per category.",
                        "default": 2
                    },
                    "watchlistId": {
                        "title": "Watchlist ID (enables movement tracking)",
                        "maxLength": 40,
                        "type": "string",
                        "description": "Any label you choose, e.g. \"supplements-radar\" or a client name. Runs sharing a watchlist ID are compared with each other, so every run reports new entries, climbers, fallers and drop-outs since the previous one. Leave empty for a one-off snapshot with no history. Use a separate ID per project."
                    },
                    "enrichDemand": {
                        "title": "Attach demand signals",
                        "type": "boolean",
                        "description": "Adds \"bought in past month\" and Amazon's Choice / Best Seller badges to the TOP 10 of each category — the zone the volatility summary prices and the zone worth acting on. Price, stars and review counts come with the full ranking either way (except on rare fallback-sourced runs, where enrichment also fills top-10 prices in).",
                        "default": true
                    },
                    "marketplace": {
                        "title": "Amazon marketplace",
                        "enum": [
                            "com"
                        ],
                        "type": "string",
                        "description": "Amazon.com (US) only in this version. Other marketplaces are planned.",
                        "default": "com"
                    },
                    "bypassRunCache": {
                        "title": "Force a fresh scan",
                        "type": "boolean",
                        "description": "Identical runs within 24 hours normally return cached results with no per-category charge. Tick this to force a fresh scan — this WILL incur charges. Note: Amazon updates Best Sellers roughly hourly, so scanning more often than daily mostly measures noise.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
