# Amazon.ca Product & Trending Tracker (`akhil_rajesh/amazon-ca-product-trending-tracker`) Actor

Track Amazon.ca Best Sellers and New Releases (the whole top 100), prices with price history, stock and Best Sellers Rank, search positions, keyword suggestions and reviews, on Canada and 22 more marketplaces. Scheduled runs show what moved, what is new and which prices dropped.

- **URL**: https://apify.com/akhil_rajesh/amazon-ca-product-trending-tracker.md
- **Developed by:** [Akhil rajesh](https://apify.com/akhil_rajesh) (community)
- **Categories:** E-commerce, SEO tools
- **Stats:** 2 total users, 1 monthly users, 85.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 results rows

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Track **Amazon.ca Best Sellers and New Releases**, **product prices and Best Sellers Rank**, **keyword search positions**, **keyword suggestions** and **reviews** as clean JSON, and see **what changed since your last run**. Canada comes first, and the same input works on 22 more Amazon marketplaces: the United States, the United Kingdom, Germany, France, Italy, Spain, Mexico, Japan, India, Australia, Brazil, the Netherlands, Sweden, Poland, Türkiye, Belgium, Ireland, Singapore, the United Arab Emirates, Saudi Arabia, Egypt and South Africa.

- **The whole top 100 of any list.** Best Sellers or New Releases for any category, or any subcategory by its link (Headphones, Laptops, Fantasy Books...). You get rank, ASIN, title, price, rating, number of ratings and image. Amazon shows 30 products a page; this Actor reads all 100 in four requests.
- **Subcategories and whole departments in one run.** Read a category with all its subcategories (one or two levels: Amazon.ca's Electronics has 15), or every department of a marketplace, each list with its top N.
- **What moved since the last run.** On a schedule, every row says its previous rank, how many places it climbed or fell, whether it's new on the list, and its previous price. Amazon no longer publishes its Movers & Shakers lists; this gives you your own.
- **Only changes.** Turn it on and a scheduled run outputs, and charges for, only what changed: new products, moves, price and stock changes, and products that dropped off the list. The first run outputs the baseline; after that, a quiet day costs almost nothing.
- **Product pages by ASIN or link.** Price, list price and discount, coupon, stock, seller and who ships it (FBA or not), other offers and their lowest price, every Best Sellers Rank with its category, number of ratings and the star breakdown, Amazon's "Customers say" summary with its aspects, Amazon's Choice and #1 Best Seller badges, all gallery images, every variant (colour, size, style) with its ASIN, the description and "From the manufacturer" text, "bought in past month", breadcrumbs, bullet points and the specification table. Each run also shows the change in price, rank and stock since the last run.
- **Keyword search positions.** Results in Amazon's order, with each product's position, its organic position (sponsored results not counted), sponsored and Amazon's Choice flags, coupons and discounts, and its change since the last run. Sort by price, rating or newest, set a price range, or paste an Amazon search link with any filters. Track several keywords in one run.
- **Prices for a delivery address in the marketplace's country.** Amazon prices a product page for the address it picks for the visit, and from abroad it often picks none and withholds the price. The Actor sets the marketplace's main city the way Amazon's own location dialog does (no sign-in), or your own postcode, and names the address on every row.
- **Price history from your own runs.** Every list, search and product row carries the lowest, highest and average price of the product over your last 30 runs (or as many as you choose), whether it is at its lowest now, and the readings themselves.
- **Keyword suggestions (Amazon's search-box autocomplete).** The keywords Amazon suggests as people type, for each of your keywords on any of the 23 marketplaces, in Amazon's order. Expand each keyword a to z (and 0 to 9) for about 250 to 350 long-tail keywords, and see on a schedule which suggestions are new, which moved and which Amazon dropped.
- **Product details for list and search rows, if you want them.** One switch adds each product's page to its Best Sellers or search row.
- **Reviews with their text.** The reviews a product page shows (8 to 13 per product): stars, title, text, date, country, verified purchase, helpful votes, variant and the reviewer's pictures. Filter by stars (positive or critical) or verified purchases, order them newest or most helpful first, read the same product on other marketplaces for more of its reviews, and add a summary row per product (rating, star breakdown, Customers say).
- **38 categories mapped for each marketplace.** Each Amazon site names its categories differently (Amazon.de's Electronics is `ce-de`, Amazon.com's Toys are `toys-and-games`, Amazon.com.tr's Fashion is `apparel`). Pick a category once; the Actor uses each site's own name, taken from its own department list and checked live.

No login or API key is needed, and a proxy is optional. The default run (Amazon.ca's top 100 in Electronics) takes about 8 seconds on Apify, start included.

### What you get

| Field | Example |
|---|---|
| `rank`, `listType`, `categoryName` | 1, bestsellers, Electronics |
| `subcategoryLevel`, `parentCategoryName` | 1, Electronics (with Subcategories or All departments) |
| `asin`, `title`, `url`, `imageUrl` | B0F7K67DY2, Amazon Fire TV Stick HD..., full-size image |
| `price`, `listPrice`, `currency` | 22.99, 69.99, CAD (read from the page: Amazon.com shows Canadians CAD prices) |
| `rating`, `reviewCount` | 4.1, 14780 (the exact count, not "14.7K") |
| `previousRank`, `rankChange`, `isNew`, `previousPrice`, `priceChange` | 5, 3 (climbed three places), false, 24.99, -2.00 |
| `movement`, `changes` | up, \["rank", "price"] (new, up, down, same or dropped; what changed past your limits) |
| `brand`, `authors` | Apple; Rebecca Yarros (books) |
| `inStock`, `availability`, `seller`, `shipsFrom`, `fulfilledByAmazon` | true, In Stock, UGREEN GROUP LIMITED, Amazon, true |
| `deliveryLocation`, `priceHidden`, `partialPage` | Delivering to Dublin D04 (the address Amazon showed the page for), true when Amazon withheld the price, true when the page came without its lower half |
| `bestSellersRank`, `bestSellersCategory`, `bestSellersRanks` | 7, Electronics, every rank with its category and that list's link |
| `boughtPastMonth` | 4000 (Amazon's "4K+ bought in past month") |
| `categoryPath`, `features`, `details` | breadcrumbs, bullet points, the specification table (publisher, model number, dimensions...) |
| `discountPercent`, `coupon`, `offerCount`, `lowestOfferPrice` | 25, Save 10% with coupon, 4, 22.23 |
| `ratingBreakdown`, `customersSay`, `customersSayAspects` | {"5": 63, "4": 9, ...}, Amazon's summary, \[{"aspect": "Quality", "sentiment": "mixed", "mentions": 173}] |
| `amazonsChoice`, `bestSellerBadge` | true, #1 Best Seller in Earbud & In-Ear Headphones |
| `images`, `variants`, `variantCount`, `parentAsin`, `videoCount` | 9 full-size images, \[{"asin": "B0DW9C8RVQ", "attributes": {"Colour Name": "Purple"}}], 7, B09M9J5P1L, 2 |
| `description`, `aPlusContent` | the description (a book's blurb), the "From the manufacturer" text |
| `searchQuery`, `searchFilters`, `position`, `organicPosition`, `sponsored`, `badge` | airpods pro, s=price-asc-rank, 5, 4, false, Amazon's Choice |
| `reviewRating`, `reviewTitle`, `reviewText`, `reviewDate`, `reviewedIn`, `verifiedPurchase`, `helpfulVotes`, `reviewImages` | 5, Product quality, the text, 2026-09-21, Canada, true, 3, the reviewer's pictures |
| `reviewSummary`, `reviewsShown`, `reviewsMatched` | true on a product's summary row, with its `rating`, `reviewCount`, `ratingBreakdown` and `customersSay`; 13, 4 |
| `lowestPrice`, `highestPrice`, `averagePrice`, `atLowestPrice`, `priceReadings`, `priceHistory` | 19.99, 24.99, 22.66, true, 3, \[{"at": "2026-10-06T10:00:00Z", "price": 24.99}, ...] (over your last runs) |
| `seedKeyword`, `suggestion`, `position`, `prefix`, `prefixPosition`, `searchUrl` | airpods, airpods pro 3, 3, airpods, 3, the search for it (Keyword suggestions) |
| `marketplace`, `snapshotAt` | ca, 2026-10-06T20:15:08Z |

The Output tab has a table for each kind of row: lists, products, search results, keyword suggestions and reviews. Each run also saves a **run summary** for automated pipelines (see [Run summary](#run-summary-for-pipelines)).

### How to use it

#### Best Sellers and New Releases

```json
{ "mode": "trending", "marketplace": "ca", "category": "electronics", "listTypes": ["bestsellers", "new-releases"], "maxResults": 200 }
```

Each list has 100 products. **Max results** is shared evenly between the lists you ask for, so 200 gives both whole lists. A list with fewer products passes its share on to the others.

For a subcategory, open its Best Sellers page on Amazon and paste the address in **Category links**:

```json
{ "mode": "trending", "categoryUrls": ["https://www.amazon.ca/gp/bestsellers/electronics/680468011/"] }
```

Links from any of the 23 marketplaces work, Best Sellers and New Releases alike. A product's `bestSellersRanks` gives the links of the subcategories it ranks in.

#### Subcategories and all departments

```json
{ "mode": "trending", "category": "electronics", "subcategoryLevels": "1", "maxResultsPerList": 10, "maxResults": 160 }
```

**Subcategories** reads each list's subcategories as Amazon's list page names them, one level or two, each a list of its own: Electronics on Amazon.ca and its 15 subcategories, the top 10 of each, took 16 requests and 23 seconds on Apify. Every row says its `subcategoryLevel` (0 for the list you chose) and `parentCategoryName`. **Max results per list** sets each list's top N; **Max results** is still shared over all the lists, so set it to at least lists × N. A run stops looking for more lists at as many as Max results covers (one row each) and says so: two levels below Amazon.com's Electronics New Releases found 166 lists.

Pick **All departments** as the category (or paste the overview link, such as `https://www.amazon.ca/gp/bestsellers/`) to read every department of a marketplace: Amazon.com.au has 31. Subcategories work on top of it.

#### Products by ASIN or link

```json
{ "mode": "products", "asins": ["B0F7K67DY2", "https://www.amazon.ca/dp/B0DCH8VDXF"] }
```

A link to another of the 23 marketplaces (`https://www.amazon.de/dp/...`, `smile.` and `m.` links too) is read on that marketplace. Links to other sites, Amazon.cn among them, are skipped and named in the status message, and so are products past **Max results**.

#### Keyword search positions

```json
{ "mode": "search", "marketplace": "ca", "searchQueries": ["airpods pro", "wireless earbuds"], "maxResults": 100 }
```

`position` counts every result as Amazon shows them, sponsored ones included, and `organicPosition` counts only the unsponsored ones. A product can appear twice, once sponsored and once organic; each is its own row.

**Sort by** (price, average review, newest, best sellers) and a **price range** apply to every keyword. For any other filter (star rating, Prime, brand, department), set it on Amazon and paste the search's address as a keyword line: its filters are kept, and Amazon's tracking parameters are dropped.

```json
{ "mode": "search", "searchQueries": ["https://www.amazon.ca/s?k=wireless+earbuds&rh=p_72%3A11192170011"], "sortBy": "price-low-to-high" }
```

A sorted or filtered search is tracked apart from the same keyword without filters: `searchFilters` on each row says which it is.

#### Keyword suggestions

```json
{ "mode": "suggestions", "marketplace": "uk", "searchQueries": ["nappies", "air fryer"], "suggestionExpansion": "letters" }
```

Each row is one keyword Amazon's search box suggests for what is typed, in Amazon's order: Amazon's own request for its search box, made for each marketplace with that marketplace's id, so Amazon.ca suggests "tim hortons gift card" where Amazon.com suggests "tim hortons coffee k cups". **Expand each keyword** also asks for the keyword followed by a, b, c ... z (**Letters**, 27 requests per keyword) and 0 to 9 (**Letters and digits**, 37): "nappies" on Amazon.co.uk gave 344 keywords, イヤホン on Amazon.co.jp 343. Each suggestion is one row, at the first place it came up; `prefix` says what was typed and `prefixPosition` its place among the box's 10. Each request takes about a second, so an expanded keyword takes about 30 to 40 seconds.

Search links work as keywords too (their marketplace and keyword are used; the search box has no filters). With **Compare with the previous run** on, a scheduled run marks new suggestions, moves and, with **Only changes**, the ones Amazon dropped. Max results is shared between the keywords as for search.

#### Product details for list and search rows

Turn on **Add product details to each row** and every Best Sellers, New Releases or search row also gets what its product page shows: Best Sellers Rank, seller, stock, images, variants, star breakdown, Customers say, coupon, offers and the specifications. It takes about a second per product. With **Only changes** on, only the changed products' pages are read.

#### Delivery address and prices

Amazon prices and stocks a product page for a delivery address. It picks one for each visit, and from abroad (Apify's servers are in the United States) it often picks none: then product pages say "add this item to your cart to see its details" instead of a price, or call a product "Currently unavailable" because it doesn't ship to the US.

So when a product page comes without a local address or with its price withheld, the Actor sets the marketplace's main city (New York 10001, London SW1A 1AA, Berlin 10115, Paris 75001, Madrid 28001, Sydney 2000, Tokyo 100-0001, Singapore 018956 and so on) through Amazon's own location dialog, as any visitor can without signing in, and reads the page again. It happens once per marketplace and visit, a few requests in all. The address goes with the visit, so a refusal that brings a fresh visitor sets it again (at most three times a marketplace in a run). Prices are shown in each marketplace's own currency.

```json
{ "mode": "products", "marketplace": "com", "asins": ["B0DW9BXCYW"], "deliveryPostcode": "90210" }
```

**Delivery postcode** prices the chosen marketplace's product pages for your own postcode instead, whatever address Amazon picked. **Set a delivery address where Amazon shows none** (on by default) can be turned off. Every product row says which address its page was shown for in `deliveryLocation`, for example "Deliver to Beverly H... 90210".

Measured on 2026-10-08 with the same 12 to 13 products across the marketplaces: with the step, 48 of 73 product rows had prices over six runs (6 to 11 a run); without it, 16 of 50 over four runs read at the same moments (3 to 6 a run). When it went through, Amazon.co.uk showed £49.99 for London, Amazon.com.tr 699.47 TRY for Istanbul and Amazon.com.au $16.99 for Sydney, all withheld without it. Your own postcode went through on Amazon.com every time it was tried alone or with three products (90210, 60601, 10001). Amazon.com.be, .co.za, .ae, .sa and .eg take no postcode (they pick Brussels, Johannesburg, Dubai, Riyadh or New Cairo themselves), and Amazon.nl offered a visitor from abroad only a list of countries. The step can fail too: Amazon may answer the Best Sellers page it needs with a robot check, or offer a visit only "Sign in to update your location". The run then says so and keeps the page as it came.

#### Reviews

```json
{ "mode": "reviews", "asins": ["B0F7K67DY2", "168281808X"], "maxResults": 20 }
```

**Max results** is shared between the products. Reviews are saved as each product's page is read, so a run that stops early keeps what it read. Amazon shows a product's full review pages only to signed-in visitors, so this mode reads the reviews on the product page itself.

```json
{ "mode": "reviews", "asins": ["B015CH1NAQ"], "reviewStars": ["critical"], "reviewSort": "recent", "reviewMarketplaces": ["com", "uk"], "reviewSummary": true }
```

- **Stars:** positive (4 and 5), critical (1 to 3) or single stars. **Verified purchases only** leaves out the rest.
- **Order:** Amazon's own (top), newest first or most helpful first. It decides which reviews Max results keeps.
- **Also read reviews on:** each product's page on other marketplaces too. Each shows its own top reviews and some from other countries, so this is the way to more reviews of one product without signing in. A review shown on several pages is returned once, from the first. A marketplace that doesn't sell the product is named.
- **Summary row:** one more row per product page, before its reviews: rating, number of ratings, star breakdown, Amazon's Customers say with each aspect's sentiment, and how many reviews the page showed and how many passed your filters. It counts as a result.

### Tracking changes on a schedule

Leave **Compare with the previous run** on (the default) and schedule the Actor, daily for example. Each run compares with the last run of the same list, search or product:

- **Lists:** `previousRank`, `rankChange` (positive means it climbed), `isNew` (it wasn't in the ranks the last run read) and `previousPrice`.
- **Search:** `previousPosition` and `positionChange` of each organic result, and `isNew`.
- **Products:** `previousPrice`, `priceChange`, `previousBestSellersRank`, `bestSellersRankChange` and `previousReviewCount`.
- **Keyword suggestions:** `previousPosition`, `positionChange` and `isNew` of each suggestion.

The status message sums it up, for example "Compared with the run of 2026-10-05 09:00 UTC: 6 new, 31 moved up, 28 moved down." The first run of a list has nothing to compare with yet. `movement` says how each row moved (new, up, down, same) and `changes` lists what changed (new, rank, position, price, stock, bestSellersRank).

#### Only changes

Turn on **Only changes** and a run outputs, and charges for, only the rows that changed since the last run:

```json
{ "mode": "trending", "category": "electronics", "onlyChanges": true, "minRankChange": 3 }
```

- **Lists and searches:** new products, moves of at least **Smallest move** places (1 by default), price changes of at least **Smallest price change** (1% by default), and products that dropped off: they were in the ranks this run read last time and aren't now (`movement` "dropped", with their previous rank). Sponsored search results are left out.
- **Products:** price changes, stock changes (in or out of stock) and Best Sellers Rank moves of at least 10% (**Smallest Best Sellers Rank change**).
- A move smaller than your limit isn't reported, and the last reported value stays the baseline, so small moves add up: a price that slips 0.4% a day is reported on the third day at a 1% limit.
- The first run outputs everything as the baseline. A run with nothing to report succeeds with no rows and says "No changes since the run of …".
- **Max results** decides how many ranks are watched (the top 100 of a list by default), and at most that many changes go out. Products that dropped off come on top of it: on a busy day, the changes alone filled Max results 100 on Amazon.ca's Electronics. Turn off **Include products that dropped off** to leave them out.

Prices are compared only in the same currency (so a run of an older version that saw prices converted to the visitor's currency isn't read as a price change), and a Best Sellers Rank only within the same category. A price or rank that a page doesn't show keeps the last one known, so the next real change is still reported.

Snapshots are kept in a key-value store of your Apify account named `amazon-tracker-history`. Give schedules that should track separately their own **History name**. `snapshotAt` on every row lets you diff runs yourself too.

A run that reads fewer ranks than the last one, such as a quick test of a list's top 10, doesn't replace the deeper snapshot for two days, so it doesn't reset the next daily comparison. Each product keeps a record of its own, so schedules that share products don't overwrite each other.

#### Price history

Each list, search and product keeps the prices of its last **Price history: runs to keep** runs (30 by default, up to 365), and every row shows:

- `lowestPrice`, `highestPrice` and `averagePrice` over those readings and this run's price;
- `atLowestPrice`: true when the price is now the lowest of them (with at least two readings);
- `priceReadings` and `priceHistory`: how many readings, and each one's time and price, oldest first.

The history is built from your own runs, so it starts with one reading and fills up as a schedule runs. A product keeps its history per list, per search and as a product (one in two lists has two). Readings are counted only in the row's currency: Amazon.com shows a visitor abroad prices in their own currency, and those aren't mixed with dollars. A run with **Only changes** records the prices of products that didn't change too, so quiet days count. A quick run that reads fewer ranks than the last one, within two days of it, leaves that deeper snapshot in place, and its prices with it, so it adds no readings to a list or search. Set it to 0 to keep no history.

### Run summary for pipelines

Every run saves a `RUN_SUMMARY` record in its default key-value store (linked from the Output tab as **Run summary**), so a pipeline can check a run without reading its log. It holds `outcome` (`succeeded`, `partial` when something asked for didn't load, `failed` or `stopped`), the status message, `rowsOutput` and `rowsRead`, each list's, search's or keyword's outcome (`lists`: loaded, partial, failed, empty or skipped, with rows read, rows delivered and why), what `failed` and `partlyLoaded` with the reason, Amazon's refusals by kind (`refusals`), products not found, delivery-address results, the changes found, and the run's start and end times. A run stopped by bad input saves `inputError: true`. Read it with `GET https://api.apify.com/v2/actor-runs/<runId>/key-value-store/records/RUN_SUMMARY`.

### How much does it cost?

You pay **$1.00 per 1,000 rows** (a list product, product, search result, keyword suggestion or review), and less on larger Apify plans, plus a start fee of $0.00005 per run (per GB of memory, at least one; runs use 256 MB by default). **Platform usage is included**: there is no compute charge on top.

| Apify plan | Per 1,000 rows |
|---|---|
| Free and Starter | $1.00 |
| Scale | $0.90 |
| Business and above | $0.80 |

| Run | Rows | Cost (Free and Starter plans) |
|---|---|---|
| Amazon.ca's top 100 Best Sellers in one category (the default input) | 100 | $0.10 |
| Best Sellers and New Releases of one category, both whole | 200 | $0.20 |
| Amazon.ca's Electronics and its 15 subcategories, top 10 of each | 160 | $0.16 |
| 50 products by ASIN | 50 | $0.05 |
| 3 keywords, 100 results each | 300 | $0.30 |
| 1 keyword's suggestions, expanded a to z | about 250 | about $0.25 |

Products Amazon doesn't have, lists it doesn't show and pages that didn't load aren't charged. To cap spending, set **Max results** or a maximum cost per run in the run options; the Actor stops cleanly at the limit.

### Input

| Field | Default | What it does |
|---|---|---|
| `mode` | `trending` | `trending`, `products`, `search`, `reviews` or `suggestions` |
| `marketplace` | `ca` | `ca`, `com`, `uk`, `de`, `fr`, `it`, `es`, `mx`, `jp`, `in`, `au`, `br`, `nl`, `se`, `pl`, `tr`, `be`, `ie`, `sg`, `ae`, `sa`, `eg`, `za` |
| `category` | `electronics` | Trending: `all` (every department), or one of 38 categories, mapped to each marketplace's own |
| `listTypes` | `bestsellers` | Trending: `bestsellers`, `new-releases` or both |
| `categoryUrls` | none | Trending: links of Best Sellers or New Releases pages, subcategories and overviews too (replaces `category`) |
| `subcategoryLevels`, `maxResultsPerList` | `0`, none | Trending: also read subcategories (`1` or `2` levels), and each list's top N |
| `asins` | none | Products and Reviews: ASINs or product links |
| `searchQueries` | none | Search and Keyword suggestions: keywords, one per line |
| `suggestionExpansion` | `none` | Keyword suggestions: also `letters` (a to z after each keyword) or `letters-digits` (and 0 to 9) |
| `reviewStars`, `verifiedOnly`, `reviewSort`, `reviewMarketplaces`, `reviewSummary` | all, off, `top`, none, off | Reviews: star filter, verified only, order, other marketplaces, a summary row per product |
| `maxResults` | 100 | Most rows per run, shared evenly between lists, keywords or products |
| `sortBy`, `minPrice`, `maxPrice` | relevance, none, none | Search: Amazon's sort order and a price range |
| `productDetails` | off | Trending and search: add each product's page to its row |
| `setDeliveryAddress`, `deliveryPostcode` | on, none | Products and details: set the marketplace's main city where Amazon shows no address, or your own postcode on the chosen marketplace |
| `trackChanges` | on | Compare with the previous run of the same list, search or product |
| `priceHistoryRuns` | 30 | Lists, search and products: runs of prices kept for the lowest, highest and average price (0: none) |
| `onlyChanges` | off | Output only what changed since the last run |
| `minRankChange`, `minPriceChangePercent`, `minBestSellersRankChangePercent`, `includeDropped` | 1, 1, 10, on | What counts as a change with Only changes, and whether products that dropped off are output |
| `historyName` | `amazon-tracker-history` | The key-value store that keeps the snapshots |
| `proxy` | none | Optional: Apify's datacenter proxy or your own (only the first of your own is used; residential is refused) |

### Good to know

- **Amazon sometimes answers with a robot check instead of a page.** This Actor never solves or bypasses it. It waits, tries again as a new visitor (up to 11 tries over about three and a half minutes for a list's first page, 4 for its other pages and for a product page, 6 for a search page), and then names what didn't load and why in the status message, for example "Best Sellers in Books on Amazon.de (robot check)". A run that got nothing fails, so you're not charged for results and the failure is visible. When only part of a run loads, you get the rest, and the message says what's missing.
- **Keyword suggestions are the most reliable mode, search the least, and Amazon.ca's lists vary by the hour.** In eight test runs from Apify's servers on 2026-10-08, about 400 keyword-suggestion requests on all 23 marketplaces were each answered on the first try, and each marketplace gave its own list for the same keyword. Amazon.ca's Best Sellers lists loaded on almost every run on 2026-10-08, but on 2026-10-09 and 10-10 Amazon.ca answered many runs from Apify's servers with robot checks: batches of 10 default runs got the list 6, 7 and 3 times, and the next 6 runs, an hour after the 3, all loaded at once. A run asks for a list's first page up to 11 times over about three and a half minutes, as a new visitor each time, so many of those runs still got through; one that didn't fails without charging any results. Amazon.com and Amazon.co.uk lists loaded first time in the same hours. In test runs on 2026-10-06, lists loaded on all ten marketplaces of then (one Amazon.co.jp run met a robot check and failed; the next one loaded). Product pages loaded on Amazon.ca, .com and .de, with an occasional retry, and one of three on Amazon.co.uk got HTTP 503 on every try. Searches loaded on Amazon.ca, .com, .com.mx, .es, .fr and .in, some after a few retries, but Amazon.de, .co.uk, .it and .co.jp answered every search try with HTTP 503 that day. Amazon's answers change from hour to hour, so a refused run is worth trying again later.
- **The thirteen newer marketplaces, measured on 2026-10-08 from Apify's servers:** lists loaded everywhere (every department of all thirteen: 294 of 296 lists, one robot check). Product pages loaded on all but Amazon.se, which answered every product try with a robot check, and Amazon.pl and .ae, which loaded about half. Searches loaded on Amazon.com.br, .pl, .com.be, .ie, .sg, .sa and .co.za in both rounds, on .com.au, .nl and .eg in one of two, and on neither for Amazon.se, .com.tr and .ae (HTTP 503).
- **Prices and stock are shown for a delivery address.** See [Delivery address and prices](#delivery-address-and-prices). When the address couldn't be set, a page Amazon showed without one keeps its withheld price: such rows have no `price` and say `priceHidden`, and the other offers' lowest price may still show. List and search pages show their prices either way.
- **Some product pages come without their lower half.** Amazon serves some visits a product page whose lower half (Best Sellers Rank, description, full specifications, reviews) is empty, popular products most: 5 to 7 of every 20 product pages from Apify's servers on 2026-10-08. The Actor asks once more as a fresh visitor (none of 8 such retries brought the whole page), then outputs the row with `partialPage` and what the page did show. In reviews mode such a page is named as not loaded, never as a product without reviews.
- **Prices are in the marketplace's own currency.** The Actor asks for it (Amazon's currency preference), so Amazon.co.uk shows pounds to Apify's servers in the United States, not converted dollars. A product that "cannot be shipped to your selected delivery location" has no `price`, and `inStock` is unknown rather than false.
- **Some products have no Best Sellers Rank on their page.** Amazon's own devices (Echo, Fire TV, Kindle) show none. A product with no featured offer ("See All Buying Options") has no `price`.
- **Long runs stop cleanly.** Lists and search pages take about a second each, and product pages about a second and a half (two are read at a time: 30 products took 52 seconds on Apify, about 2,000 an hour). A run stops a minute before its timeout (one hour by default) and says what it read, so for thousands of products raise the timeout in the run options.
- **If Amazon changes its pages, the run fails and says so.** A page this Actor can't read (a list whose products can't be read, a results page without results or Amazon's "No results" message, another page in a product's place) fails the run with the page named, never an empty success. A schedule with a failure alert catches it. A page that arrives cut short is asked for again, never read as complete.
- **Movers & Shakers, Most Wished For and Gift Ideas** pages exist, but Amazon shows no lists on them now ("Sorry, there are no movers and shakers available in this category"). Change tracking gives the same signal from your own runs.

### FAQ

**Which categories are there?** Electronics, Computers, Home & kitchen, Tools, Garden, Toys, Video games, Books, Kindle, Music, Movies & TV, Software, Apps, Beauty, Health, Grocery, Baby, Fashion, Sports, Automotive, Pet supplies, Office, Industrial, Musical instruments, Amazon devices, Amazon Renewed, Handmade, Gift cards, and a few that only some marketplaces have (Appliances, Lighting, Luggage, Cell phones, Camera & photo, Shoes, Jewellery, Watches, Arts & crafts). A run on a marketplace without the category fails at once and names the marketplaces that have it. For anything deeper, use Subcategories or paste a subcategory's link; All departments reads every list a marketplace has.

**Why are only 30 products shown on Amazon's page, and here 100?** Amazon's Best Sellers page loads ranks 31-50 and 81-100 as you scroll. The Actor makes the same requests the page makes.

**How fresh are the lists?** Amazon says its lists are "updated frequently", based on sales. Each run reads them as they are at that moment.

**What does `isNew` mean?** True when the product wasn't in the ranks the previous run read. When that run read the whole list (the default does), the product is new to the list; when it read the top 50 (two lists sharing Max results 100), it is new to the top 50 and may have climbed from further down. It is empty when the previous run read fewer ranks than this one (say the top 50), so it can't tell whether a product at rank 70 was on the list then, and on a first run.

**Does it give sales numbers?** Amazon doesn't publish them. Best Sellers Rank, its change between runs, `boughtPastMonth` and the change in the number of ratings are the signals Amazon shows.

### Other Actors by this developer

- [Price Tracker Canada - Best Buy, Walmart, Canada Computers](https://apify.com/akhil_rajesh/bot-wall-price-scraper): live price comparison across major Canadian retailers
- [Google Hotels Scraper - Hotel Price Tracker & Comparison](https://apify.com/akhil_rajesh/google-hotels-scraper): hotel prices from Google Hotels, with price tracking
- [Indeed Jobs Scraper - Canada, US, UK, Australia & More](https://apify.com/akhil_rajesh/indeed-jobs-scraper): job listings from Indeed in eight countries
- [Sports API - Live Scores, Stats & Odds](https://apify.com/akhil_rajesh/sports-scraper): scores, statistics and odds for seven sports

### Disclaimer

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Amazon. It reads publicly available pages at a modest pace and never gets past Amazon's robot checks. Use the data in line with Amazon's terms and the laws that apply to you.

# Changelog

This Actor's version history is a separate document: https://apify.com/akhil_rajesh/amazon-ca-product-trending-tracker/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Trending lists: a category's Best Sellers or New Releases, the whole top 100. Products: product pages by ASIN or link, with price, stock, seller and Best Sellers Rank. Search: keyword search results in Amazon's order, sponsored ones marked. Reviews: the reviews a product page shows, with their text. Keyword suggestions: what Amazon's search box suggests for each keyword in Search keywords (keyword research), optionally expanded a to z.

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

Which Amazon site to read. A pasted link (category or product) uses its own site.

## `category` (type: `string`):

Trending lists: the category whose list to read, or All departments (every department's list on the marketplace). Each marketplace names its categories its own way; this list maps them for you, and the run says so when a marketplace has no such list (with those that have it). For a subcategory (Headphones, Laptops...), paste its link in Category links, or read them all with Subcategories.

## `listTypes` (type: `array`):

Best Sellers, New Releases (the bestselling new and coming products), or both. Each list has 100 products. Amazon's Movers & Shakers, Most Wished For and Gift Ideas pages show no lists now, so they aren't offered.

## `categoryUrls` (type: `array`):

Links of Best Sellers or New Releases pages, subcategories too, such as https://www.amazon.ca/gp/bestsellers/electronics/680468011/ (Headphones). Open the list on Amazon and copy its address. The overview link (https://www.amazon.ca/gp/bestsellers/) reads every department. When given, these lists are read instead of Category and Lists, each on its own marketplace.

## `subcategoryLevels` (type: `string`):

Also read the subcategories of each list, as Amazon's list page names them: Electronics on Amazon.ca has 15 (Headphones, Televisions...), and they have their own. Each subcategory is a list of up to 100 products, with its level and the list above it in each row. Max results is shared over all the lists: raise it, or set Max results per list.

## `maxResultsPerList` (type: `integer`):

Trending lists: the most products from one list, such as 10 for each subcategory's top 10. Empty: up to 100 (the whole list), as Max results allows.

## `asins` (type: `array`):

Products and Reviews modes: ASINs such as B0F7K67DY2, or product links (https://www.amazon.ca/dp/B0F7K67DY2). A link to another of the 23 marketplaces is read there; links to other sites are skipped and named.

## `reviewStars` (type: `array`):

Reviews mode: only reviews with these stars. Positive is 4 and 5 stars, critical 1 to 3. Empty: all.

## `verifiedOnly` (type: `boolean`):

Reviews mode: only reviews Amazon marks as a verified purchase.

## `reviewSort` (type: `string`):

Reviews mode: the order of each product's reviews, which decides which ones Max results keeps. Top: Amazon's own order on the product page.

## `reviewMarketplaces` (type: `array`):

Reviews mode: each product's page on these marketplaces too. A product page shows 8 to 13 reviews, and each marketplace shows others (its own top reviews, and some from other countries), so this gets more reviews of a product without signing in. A review shown on several is returned once. A product a marketplace doesn't sell is named.

## `reviewSummary` (type: `boolean`):

Reviews mode: one more row for each product page read, before its reviews: its rating, number of ratings, star breakdown, Amazon's AI summary (Customers say) with each aspect's sentiment, and how many reviews the page showed and matched. Each summary row counts as a result.

## `searchQueries` (type: `array`):

Search mode: one keyword or phrase per line, searched on the chosen marketplace, or an Amazon search link: its own filters are kept (star rating, Prime, brand, department, sort). Each result has its position on the page and its organic position (sponsored results not counted). Keyword suggestions mode: the keywords whose search-box suggestions to get.

## `sortBy` (type: `string`):

Search mode: the order of the results, as Amazon sorts them. A sorted search is tracked apart from the same keyword unsorted. For other filters, set them on Amazon and paste the search's link in Search keywords.

## `minPrice` (type: `number`):

Search mode: only results at this price or above, in the marketplace's currency. Empty or 0: no limit.

## `maxPrice` (type: `number`):

Search mode: only results at this price or below, in the marketplace's currency. Empty or 0: no limit.

## `suggestionExpansion` (type: `string`):

Keyword suggestions mode: the search box suggests 10 keywords for what is typed. Letters also asks for the keyword followed by a, b, c ... z (up to about 270 suggestions per keyword); letters and digits adds 0 to 9 (up to about 370). Each suggestion is one row, at its first place.

## `productDetails` (type: `boolean`):

Trending lists and search: also read each product's page, and add what it shows to the row: all images, variants, description, star breakdown, Customers say, coupon, other offers, Best Sellers Rank, seller and specifications. Takes about a second per product; with Only changes, only changed products are read.

## `setDeliveryAddress` (type: `boolean`):

Products and product details: Amazon prices a product page for a delivery address, and where it picks none for the visit it often shows "add this item to your cart to see its details" instead of the price (Amazon.com, .co.uk, .de, .es, .nl, .com.tr and .com.au did from Apify's servers). Then the run sets the marketplace's main city (New York 10001, London SW1A 1AA, Berlin 10115...) the way Amazon's own location dialog does, no sign-in, and reads the page again. Each row's deliveryLocation says which address it was shown for.

## `deliveryPostcode` (type: `string`):

Products and product details: price product pages for this postcode (ZIP) on the chosen marketplace, such as 90210 on Amazon.com or M1 1AE on Amazon.co.uk, whatever address Amazon picked. Pasted links of other marketplaces keep their main city. Amazon.com.be, .co.za, .ae, .sa and .eg take no postcodes.

## `maxResults` (type: `integer`):

The most rows a run outputs (and charges for). Several lists or keywords share it evenly, and one that has fewer rows passes its share on to the others. Each Best Sellers or New Releases list has 100 products: set 200 to get two whole lists. In Products mode it caps the number of products read. With Only changes it is how many ranks or results are watched: only their changes go out, and products that dropped off come on top.

## `trackChanges` (type: `boolean`):

Adds what changed since the last run of the same list, search, product or keyword's suggestions: previous rank and rank change, whether a product (or suggestion) is new, previous price. Snapshots are kept in a key-value store of your account (amazon-tracker-history), so schedule the run to track a list day by day. Reviews mode doesn't compare.

## `priceHistoryRuns` (type: `integer`):

Trending lists, search and products: each row also gets the lowest, highest and average price of the product over the last runs that read it (in this list, this search, or as a product), whether it is now at its lowest, and the readings themselves. This many runs are kept per product; 0 turns it off. Built from your own runs, so it fills up as a schedule runs; needs Compare with the previous run.

## `onlyChanges` (type: `boolean`):

Output, and pay for, only what changed since the last run of the same list, search, product or keyword's suggestions: new products or suggestions, moves, price and stock changes, and products or suggestions that dropped off. The first run outputs everything as the baseline. Sponsored search results are left out. Needs Compare with the previous run.

## `minRankChange` (type: `integer`):

Lists, searches and keyword suggestions: a product (or suggestion) counts as moved when its rank or position changed at least this many places. Smaller moves add up until they reach it.

## `minPriceChangePercent` (type: `number`):

A price counts as changed when it moved at least this much from the last price reported. Smaller moves add up until they reach it.

## `minBestSellersRankChangePercent` (type: `number`):

Products mode: a Best Sellers Rank counts as changed when it moved at least this much from the last one reported (10: #100 to #90 or #110).

## `includeDropped` (type: `boolean`):

Lists, searches and keyword suggestions: a row for each product (or suggestion) that was in the ranks this run read last time and isn't now, with its previous rank or position.

## `historyName` (type: `string`):

The key-value store that keeps the snapshots compared with. Give schedules that should track separately (for example, hourly and daily runs of one list) their own name. Letters, digits and hyphens.

## `proxy` (type: `object`):

Not needed: Amazon's pages load without one. Apify's datacenter proxy or your own proxies can be used (of your own, the first one: a run sends its requests through one address); residential proxies aren't, as they are billed per GB on top of the result price.

## Actor input object example

```json
{
  "mode": "trending",
  "marketplace": "ca",
  "category": "electronics",
  "listTypes": [
    "bestsellers"
  ],
  "subcategoryLevels": "0",
  "asins": [
    "B0F7K67DY2"
  ],
  "verifiedOnly": false,
  "reviewSort": "top",
  "reviewSummary": false,
  "searchQueries": [
    "airpods pro"
  ],
  "sortBy": "relevance",
  "suggestionExpansion": "none",
  "productDetails": false,
  "setDeliveryAddress": true,
  "maxResults": 100,
  "trackChanges": true,
  "priceHistoryRuns": 30,
  "onlyChanges": false,
  "minRankChange": 1,
  "minPriceChangePercent": 1,
  "minBestSellersRankChangePercent": 10,
  "includeDropped": true
}
```

# Actor output Schema

## `lists` (type: `string`):

No description

## `products` (type: `string`):

No description

## `search` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `allData` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# 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 = {
    "asins": [
        "B0F7K67DY2"
    ],
    "searchQueries": [
        "airpods pro"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("akhil_rajesh/amazon-ca-product-trending-tracker").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 = {
    "asins": ["B0F7K67DY2"],
    "searchQueries": ["airpods pro"],
}

# Run the Actor and wait for it to finish
run = client.actor("akhil_rajesh/amazon-ca-product-trending-tracker").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "asins": [
    "B0F7K67DY2"
  ],
  "searchQueries": [
    "airpods pro"
  ]
}' |
apify call akhil_rajesh/amazon-ca-product-trending-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,akhil_rajesh/amazon-ca-product-trending-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GDbXzRMmwfphiHQ9c/builds/p12OYdmJTUK8kv4A1/openapi.json
