# Amazon Deals Grid Tracker by Category & Discount (`dataspryva/amazon-deals-grid-tracker-by-category-and-discount`) Actor

Pull Amazon's Today's Deals grid across 23 marketplaces, with deal price, list price, savings amount/percent, deal type, brand, and department for each product. Filter by category, brand, price range, and discount range.

- **URL**: https://apify.com/dataspryva/amazon-deals-grid-tracker-by-category-and-discount.md
- **Developed by:** [Dataspryva](https://apify.com/dataspryva) (community)
- **Categories:** E-commerce, Automation, Other
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Amazon Deals Grid Tracker by Category & Discount

Turn Amazon's Today's Deals grid into a clean dataset of discounted products — ASIN, title, images, local-currency deal and list price, discount, rating and review histogram, deal window, collection, brand and category. Filter by department, discount, price, collection and Prime status across 23 marketplaces. No login, cookies or proxy setup.

### What this actor does

- **23 Amazon marketplaces** — amazon.com, .co.uk, .de, .fr, .it, .es, .ca, .com.au, .co.jp, .in, .com.br, .com.mx, .nl, .se, .pl, .com.tr, .ae, .sa, .sg, .eg, .ie, .com.be, .co.za. 20 of 23 answered during testing; amazon.com.br, amazon.com.tr and amazon.co.za returned 503 and remain best-effort.
- **Amazon-applied filters** — department/category, discount range, price range and Prime Exclusive deals are filtered by Amazon before the rows are read.
- **Deal collections** — Lightning Deals, Coupons, Outlet, Customers' Most-Loved, New Arrivals, Trending, Prime Exclusive, Refurbished, Premium Brands and Amazon Brands.
- **Ratings and reviews summary** — average rating, ratings count and the full 5→1 star histogram, from Amazon's own product summary.
- **Deal urgency** — deal start and end time, badge text, deal state, promotion type and percent claimed (when Amazon exposes it, especially on Lightning Deals).
- **Local prices** — prices are returned in the marketplace's local currency. When Amazon only serves a converted display price in another currency, the price is omitted instead of being mislabelled.
- **Multi-category runs** — add several categories to move past Amazon's 500-deal window for a single query.
- **Empty fields are omitted** — never `null`, never a fabricated zero.

### Output per deal

- `asin` — Amazon Standard Identification Number
- `title` — product title
- `sourceUrl` — canonical product URL
- `images[]` — product image URLs
- `marketplace` — the Amazon domain
- `dealPrice`, `listPrice` — `{value, currency, display}` in the marketplace's local currency
- `currency` — ISO code shared by the price fields, when a price is present
- `dealPriceLabel`, `listPriceLabel` — Amazon's own labels (`Deal Price`, `List`, `Typical`, `Was`, `RRP`, …), when shown
- `savingsAmount`, `savingsPercent` — money and percent saved
- `dealBadgeText`, `dealBadgeMessage` — badge label and messaging (`25% off`, `Limited time deal`, `Ends in`, …)
- `dealStartsAt`, `dealEndsAt` — ISO-8601 UTC promotion window, when Amazon exposes it
- `percentClaimed`, `percentClaimedMessage` — live claim progress for limited offers
- `dealState`, `dealPromotionType`, `dealId` — Amazon's deal state/type/id
- `isLightningDeal` — whether the row is a Lightning Deal
- `averageRating`, `ratingsCount`, `ratingHistogram` — product rating summary; histogram keys are `"5"`…`"1"` percentages
- `ratingCountByStar` — derived counts from the histogram and total ratings (rounded)
- `isPrimeExclusive` — present and `true` when Amazon labels the deal a Prime deal (`Limited Prime deal`) or the Prime filter is active
- `brandId`, `brandName`, `brandLogoUrl` — brand metadata
- `departmentIds[]`, `departmentNames[]`, `category` — Amazon's department taxonomy and a readable category
- `categorySymbol`, `glProductGroup`, `productType` — Amazon taxonomy codes
- `variationDimensions` — size/colour/variant options when present
- `isPinned`, `position`, `recordType: "deal"`, `scrapedAt`

#### When no deals are emitted

If a run ends with zero deal rows, it pushes exactly one `recordType: "status"` row so an empty dataset is never ambiguous:

- `success: false` — the grid could not be reached (`BLOCKED`), the widget was missing (`WIDGET_NOT_FOUND`), the grid was empty (`NO_ENTRIES`), or the requested collection is not shown on this marketplace today (`COLLECTION_NOT_FOUND`)
- `success: true, reason: "NO_MATCHES"` — the grid was read successfully but every deal was filtered out

Every status row also carries `marketplace`, `message` and `scrapedAt`.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `marketplace` | select | `amazon.com` | Which Amazon domain's Deals page to read |
| `categories` | list | – | Departments such as Electronics, Home & Kitchen, Kitchen, Beauty & Personal Care, Toys & Games, Sports & Outdoors. Add several to scan past the 500-deal window |
| `collection` | select | any | Lightning Deals, Coupons, Outlet, Customers' Most-Loved, New Arrivals, Trending, Prime Exclusive, Refurbished, Premium Brands, Amazon Brands |
| `brand` | string | – | Case-insensitive brand substring |
| `minRating` | int | – | Keep products rated at least this value; unrated products are excluded when set |
| `priceMin` / `priceMax` | int | – | Deal-price range in local currency |
| `discountMin` / `discountMax` | int | – | Discount percentage range |
| `primeExclusiveOnly` | boolean | false | Only Prime Exclusive deals |
| `sortBy` | select | `featured` | Amazon featured, price low/high, biggest discount, highest rating |
| `maxItems` | int | 30 | Hard cap on emitted deals (1–2000) |

#### Example: US Electronics deals with at least 25% off

```json
{
  "marketplace": "amazon.com",
  "categories": ["Electronics"],
  "discountMin": 25,
  "minRating": 4,
  "maxItems": 100
}
```

#### Example: UK Lightning Deals

```json
{
  "marketplace": "amazon.co.uk",
  "collection": "lightning-deals",
  "maxItems": 60
}
```

#### Example: three categories in one run

```json
{
  "marketplace": "amazon.com",
  "categories": ["Electronics", "Home & Kitchen", "Kitchen"],
  "discountMin": 20,
  "maxItems": 300
}
```

### Use cases

- **Deal feeds and newsletters** — a fresh, structured snapshot of today's discounts by category and collection.
- **Competitive intelligence** — which brands and categories Amazon is discounting, and how deep.
- **Price and promotion monitoring** — track deal windows, Lightning Deal urgency and changes between scheduled runs.
- **Shopping assistants** — surface highly rated deals that meet a price and discount floor.
- **Market research** — compare discount depth and category mix across Amazon marketplaces.

### FAQ

**Does this require an Amazon account or cookies?** No. The Deals grid and its product summaries are public. The actor works cookielessly, and no proxy setup is required.

**How many deals can I get?** Amazon exposes up to 500 deals per category/collection query. Add more categories to partition that window; `maxItems` can go up to 2,000 across categories. A single query stops honestly when Amazon's window is exhausted. Amazon can also reshuffle the grid between pages, so after de-duplication one window may return fewer than 500 unique deals.

**Why do some rows have no `dealPrice` or `discount`?** Amazon genuinely omits price and discount data for a subset of deals (for example, some coupon-only promotions), and it omits a local price when only a converted display price is available. The actor never guesses, converts or fills a zero. Price and discount filters exclude rows that cannot be verified.

**How does `minRating` work now?** Ratings come from Amazon's own product summary, so `minRating` filters real values. If a product has no rating, it is excluded when `minRating` is set.

**Why is `percentClaimed` missing on many rows?** Amazon exposes claim progress mainly for limited/urgent offers such as Lightning Deals. It is populated when present and omitted otherwise.

**Why don't I see shipping, seller, stock, Best Sellers Rank or review text?** Those fields are not part of the Deals grid or its product-summary data. This actor stays focused on deals; use a product-details or reviews actor for those fields.

**Why is the currency different from what I see on Amazon?** Amazon can show a converted price based on the visitor's location. This actor reports the marketplace's local price (for example, GBP on amazon.co.uk) so rows from different marketplaces stay comparable.

**Why does a collection sometimes return a `COLLECTION_NOT_FOUND` status?** Amazon's collections differ by marketplace and change seasonally. The actor reports the missing collection plainly instead of silently returning unfiltered deals.

**Why can `sortBy` take longer?** Amazon has no server-side sort for the Deals grid. To return the cheapest or highest-rated deals, the actor reads the available window first, then sorts it.

**Why does `sourceUrl` return 503 in a plain script?** Amazon blocks bare non-browser requests on product pages. The URL is the canonical product page and opens normally in a browser.

**Is this affiliated with Amazon?** No. This is an independent third-party actor that reads Amazon's public Deals pages.

**How fresh is the data?** As fresh as the live Deals grid at run time. Deals rotate throughout the day, so schedule the actor as often as your use case needs.

# Actor input Schema

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

Which Amazon domain's Today's Deals page to scrape.

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

Amazon departments to scan. Common names: Electronics, Home & Kitchen, Kitchen, Beauty & Personal Care, Clothing Shoes & Jewelry, Toys & Games, Sports & Outdoors, Books, Pet Supplies, Automotive, Health & Household, Computers & Accessories, Cell Phones & Accessories, Video Games, Tools & Home Improvement, Patio Lawn & Garden, Baby Products, Office Products, Musical Instruments, Camera & Photo, Grocery & Gourmet Food, Amazon Devices & Accessories. Add several categories to scan past Amazon's 500-deal window.

## `collection` (type: `string`):

Restrict to one of Amazon's curated deal collections. The collection names differ by marketplace; unsupported collections return a clear status record instead of unfiltered data.

## `brand` (type: `string`):

Case-insensitive brand name substring (e.g. Anker, Samsung). Leave empty for all brands.

## `minRating` (type: `integer`):

Keep only deals whose product rating is at least this value. Deals without a rating are excluded when this is set.

## `priceMin` (type: `integer`):

Keep deals at or above this price in the marketplace's local currency.

## `priceMax` (type: `integer`):

Keep deals at or below this price in the marketplace's local currency.

## `discountMin` (type: `integer`):

Keep deals with at least this percentage off, filtered by Amazon itself.

## `discountMax` (type: `integer`):

Keep deals with at most this percentage off, filtered by Amazon itself.

## `primeExclusiveOnly` (type: `boolean`):

Only return deals in Amazon's Prime Exclusive collection.

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

Featured keeps Amazon's order. Other sorts read the fetched deal window before returning, so they may take longer.

## `maxItems` (type: `integer`):

Hard cap on emitted deal records. Amazon exposes up to 500 deals per category/collection query; add categories to partition the window.

## Actor input object example

```json
{
  "marketplace": "amazon.com",
  "categories": [],
  "collection": "",
  "brand": "",
  "primeExclusiveOnly": false,
  "sortBy": "featured",
  "maxItems": 3
}
```

# Actor output Schema

## `deals` (type: `string`):

Dataset containing all scraped Amazon deals.

# 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 = {
    "marketplace": "amazon.com",
    "categories": [],
    "collection": "",
    "brand": "",
    "primeExclusiveOnly": false,
    "sortBy": "featured",
    "maxItems": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspryva/amazon-deals-grid-tracker-by-category-and-discount").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 = {
    "marketplace": "amazon.com",
    "categories": [],
    "collection": "",
    "brand": "",
    "primeExclusiveOnly": False,
    "sortBy": "featured",
    "maxItems": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("dataspryva/amazon-deals-grid-tracker-by-category-and-discount").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 '{
  "marketplace": "amazon.com",
  "categories": [],
  "collection": "",
  "brand": "",
  "primeExclusiveOnly": false,
  "sortBy": "featured",
  "maxItems": 3
}' |
apify call dataspryva/amazon-deals-grid-tracker-by-category-and-discount --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dataspryva/amazon-deals-grid-tracker-by-category-and-discount"
        }
    }
}
```

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/yZ5tcZFmAAXi1egIo/builds/jBUJUe5UwT4agcDX0/openapi.json
