# Amazon Deals Scraper (`steadyscrape/amazon-deals-scraper`) Actor

Amazon Today's Deals and discounts: lightning deals with end time and % claimed, coupons, outlet and every category collection, on 22 marketplaces. Deal price, list price, % off, badge, deal type, optional product details, only-new mode. Export to JSON, CSV or Excel, or via API. No login.

- **URL**: https://apify.com/steadyscrape/amazon-deals-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** E-commerce, Lead generation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 deals

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Scraper

**Amazon Today's Deals** as a dataset: **lightning deals** with their end time and the share already claimed, **coupons** with what they take off, **outlet**, **refurbished**, **trending** and every **category deal collection** (Electronics, Kitchen, Toys & Games…), on 22 Amazon marketplaces. Deal price, list or typical price, percent off, the deal badge, deal type and state, brand, image and category. Optionally each deal's **product page** too: rating, review count, seller, stock and Best Sellers Rank. An **only-new-deals** mode for scheduled runs delivers each deal once.

No browser, no login, no API key: it reads the deals page the way a visitor's browser does, including the deals the page loads as you scroll, and moves to another IP if Amazon's bot check shows up. **Every collection you ask for comes back**: when Amazon has nothing, the row says why (`no_deals`, `not_found`, `invalid`, `blocked`) instead of an empty dataset. You pay only for deals read.

This Actor is unofficial: it is not affiliated with, endorsed by or sponsored by Amazon.

### What you get

One row per deal. On 2026-10-22, 70 of the first 100 deals of amazon.com's Coupons collection carried a coupon.

| field | what it holds |
|---|---|
| `status` | `ok`; `no_deals` (Amazon lists none with your filters, or all were delivered before with "Only new deals"); `not_found` (the page has no such collection, or the link has no deals grid); `invalid` (the line is not an Amazon deals link); `blocked` (every IP route was refused). Only `ok` is paid. |
| `reason` | Why a row is not `ok`; a `not_found` row lists the collections the page has. |
| `input` | The line of your input the row answers, as you wrote it. |
| `marketplace` | `com`, `co.uk`, `de`, `in`… |
| `collection`, `collectionId` | "Lightning deals", "Electronics", "All deals", and the page's `bubble-id`. |
| `position` | 1 for the first deal in Amazon's order. |
| `asin`, `title`, `url` | The product and its link (`https://www.amazon.com/dp/<ASIN>`). |
| `image` | The product image, full size. |
| `brand`, `brandId` | The brand name where the card shows its logo, and Amazon's brand id. |
| `departmentIds` | Amazon's department (browse node) ids. |
| `productGroup`, `productType` | `gl_kitchen`, `KITCHEN`. |
| `price`, `priceLabel` | The deal price ("Deal Price:", "Price:", "With Deal:"); empty when the card shows none (a product with sizes or colours). |
| `listPrice`, `listPriceLabel` | The struck-through price and what it is ("List:", "Typical:", "Was:", "RRP:", "M.R.P:"). |
| `currency` | ISO code of both prices. |
| `percentOff`, `badge` | The badge's discount (30) and its text ("30% off"). |
| `dealMessage` | "Limited time deal", "Ends in", "Limited Prime deal". |
| `dealType` | `LIGHTNING_DEAL`, `BEST_DEAL`, `DEAL_OF_THE_DAY`; empty for a coupon or an outlet price. |
| `dealState` | `AVAILABLE`, `UPCOMING`, `WAITLIST`, `WAITLISTFULL`. |
| `dealId`, `isLightningDeal` | Amazon's deal id, and whether it is a lightning deal. |
| `endsAt` | When a lightning deal's countdown ends, ISO 8601 UTC. |
| `percentClaimed` | 16 for "16% claimed". |
| `coupon` | The coupon as the card words it. |
| `couponPercent` | 10 for "Save 10% with coupon". |
| `couponSaving` | 15 for "Save 15.00 USD with coupon". |
| `priceWithCoupon` | 144.99 for "You pay 144.99 USD with coupon", how amazon.com words most coupons to a US visitor. |
| `variations` | How many size/colour combinations the product has. |
| `buyingOption` | `NEW`, `BUNDLE`, `LIGHTNING_DEAL`. |
| `detailsStatus` | With "Include product details": `ok`, `not_found` or `blocked` (the product page could not be read). |
| `rating`, `reviewCount` | From the product page (details only). |
| `pagePrice` | The product page's buy box price (details only). |
| `availability`, `inStock` | "In Stock", `true` (details only). |
| `soldBy`, `shipsFrom` | Seller and shipper (details only). |
| `bestSellersRank` | `[{ "rank": 562, "category": "Home & Kitchen" }]` (details only). |
| `scrapedAt` | When the row was read, ISO 8601 UTC. |

A deal whose card shows no price (a product with sizes or colours picks its price on the product page) comes with `price` empty: prices are never guessed.

### Input

| field | what it does |
|---|---|
| `collections` | One per line: a link to an Amazon deals page, copied from the address bar after picking a collection or filters on the site (`https://www.amazon.com/deals?bubble-id=deals-collection-lightning-deals`, `https://www.amazon.co.uk/deals`, an old `/gp/goldbox` link; the page's Department, Discount and Customer Reviews filters in the link are kept), or a collection's name as the page labels it (`Lightning deals`, `Coupons`, `Outlet`, `Electronics`). `lightning` and `coupons` work on every marketplace, whatever the page calls them. **Leave it empty for all of Today's Deals.** |
| `marketplace` | Where a collection given by name is read: `com` (default), `ca`, `com.mx`, `com.br`, `co.uk`, `de`, `fr`, `it`, `es`, `in`, `co.jp`, `com.au`… |
| `maxDealsPerCollection` | How many deals to read from each collection, in Amazon's order. Default 100; Amazon lists at most 500 per collection. |
| `minDiscountPercent` | Only deals at least this much off, filtered by Amazon (the page's Discount filter). |
| `fourStarsAndUp` | Only products rated 4 stars and up, filtered by Amazon. |
| `includeDetails` | Also read each deal's product page (rating, reviews, seller, stock, ranks). |
| `onlyNewDeals` | For schedules: deals an earlier run with the same collections and filters delivered are left out, free. |
| `residentialFallback` | Retry through residential proxies of the marketplace's country when Amazon refuses the datacenter IPs. Default on, included in the price. |

```json
{
    "collections": ["Lightning deals", "https://www.amazon.com/deals?bubble-id=deals-collection-coupons", "Electronics", "https://www.amazon.co.uk/deals"],
    "maxDealsPerCollection": 200,
    "minDiscountPercent": 30,
    "onlyNewDeals": true
}
```

### Output example

A lightning deal on amazon.com, read from Apify's cloud on 2026-10-22:

```json
{
    "status": "ok",
    "reason": null,
    "input": "Lightning deals",
    "marketplace": "com",
    "collection": "Lightning deals",
    "collectionId": "deals-collection-lightning-deals",
    "position": 4,
    "asin": "B07C94DC4C",
    "title": "Stelle Girls' Footed Ballet Tights for Dance Class Toddler Kids 2T-15Y | High Waist, Stretch, Opaque Coverage,…",
    "url": "https://www.amazon.com/dp/B07C94DC4C",
    "image": "https://m.media-amazon.com/images/I/61it3br0bTL.jpg",
    "brand": "Stelle",
    "brandId": "235201",
    "departmentIds": [
        "7141123011",
        "7141124011"
    ],
    "productGroup": "gl_apparel",
    "productType": "TIGHTS",
    "price": 6.96,
    "priceLabel": "Deal Price:",
    "listPrice": 11.99,
    "listPriceLabel": "List:",
    "currency": "USD",
    "percentOff": 42,
    "badge": "42% off",
    "dealMessage": "Ends in",
    "dealType": "LIGHTNING_DEAL",
    "dealState": "AVAILABLE",
    "dealId": "70071470",
    "isLightningDeal": true,
    "percentClaimed": 1,
    "endsAt": "2026-10-23T00:45:00.000Z",
    "coupon": null,
    "couponSaving": null,
    "couponPercent": null,
    "priceWithCoupon": null,
    "variations": 72,
    "buyingOption": "LIGHTNING_DEAL",
    "detailsStatus": null,
    "rating": null,
    "reviewCount": null,
    "pagePrice": null,
    "availability": null,
    "inStock": null,
    "soldBy": null,
    "shipsFrom": null,
    "bestSellersRank": null,
    "scrapedAt": "2026-10-22T13:43:03.227Z"
}
```

A coupon deal read with "Include product details" (the other fields as above):

```json
{
    "asin": "B09XHYNHB2",
    "collection": "Coupons",
    "price": 159.99,
    "listPrice": 219.99,
    "currency": "USD",
    "coupon": "You pay 144.99 USD with coupon",
    "couponSaving": null,
    "couponPercent": null,
    "priceWithCoupon": 144.99,
    "detailsStatus": "ok",
    "rating": 4.4,
    "reviewCount": 4523,
    "pagePrice": 159.99,
    "availability": "In Stock",
    "inStock": true,
    "soldBy": "LieneDirect",
    "shipsFrom": "Amazon",
    "bestSellersRank": [
        {
            "rank": 659,
            "category": "Office Products"
        },
        {
            "rank": 2,
            "category": "Desktop Photo Printers"
        }
    ]
}
```

A collection the page does not have:

```json
{ "status": "not_found", "reason": "www.amazon.com/deals has no collection called \"banana deals\" today; it lists \"Lightning deals\", \"Outlet\", \"Electronics\", …", "input": "banana deals", "asin": null, "…": "…" }
```

### Use cases

- **Deal and coupon channels**: a schedule every hour with "Only new deals" posts each new lightning deal once, with its end time, to Telegram, Discord or a website.
- **Affiliate sites**: the deal price, list price, discount, image and product link of every deal in your niche's collection.
- **Price and promotion monitoring**: which of your products, or a competitor's brand, are on a deal today, at what discount and how fast the lightning deal is being claimed.
- **Market research**: what Amazon puts on deal by department, how deep the discounts run, and what share are coupons.
- **More on a product**: the details option adds reviews, seller and ranks; for everything on the product page, feed the ASINs to our [Amazon Product Details Scraper](https://apify.com/steadyscrape/amazon-product-scraper).

### Limits and honesty

- **Amazon lists at most 500 deals per collection.** For more, ask for several collections: a deal that comes up in two of them is returned (and charged) once, under the first.
- **Collections differ by marketplace and by day**: the page's collections are what Amazon shows today (Halloween comes and goes). A name the page does not have gives a free `not_found` row listing the ones it has. amazon.in currently sends its deals page to its Great Indian Festival page; that page's deals are read.
- **Prices follow the IP**: Amazon prices what a visitor from the run's IP would pay, and `currency` says which. Residential proxies are taken in the marketplace's country.
- **Lightning deals change by the minute**: a deal can end or sell out between two pages of a long collection.
- **Ratings and review counts are not on the deals grid**: they come with "Include product details", which reads one product page per deal and takes about a second per deal per IP.
- **Measured from Apify's cloud on 2026-10-22**: amazon.com, .ca, .co.uk, .de, .co.jp and .in answered directly, no proxy needed; the other marketplaces' deals pages answered a desktop visitor the same way. amazon.de answers its deals API only with the cookies its own deals page set, which the Actor carries. A collection every route refuses is a free `blocked` row.

### Pricing

Pay per event, no start fee:

- `deal`: US$0.001 per deal read from the deals grid.
- `deal-with-details`: US$0.003 per deal with its product page read ("Include product details"); a deal whose product page cannot be read is charged as a plain `deal`.
- Rows with any status other than `ok`, deals left out as duplicates or as already delivered: free.

Set a spending limit on the run and the Actor stops at it.

### Legal

The Actor reads publicly available deals pages that Amazon shows to anyone, without logging in, and stores no personal data. Use the data in line with Amazon's terms and your local law.

# Actor input Schema

## `collections` (type: `array`):

One per line: a link to an Amazon deals page, copied from the address bar after picking a collection or filters on the site (<code>https://www.amazon.com/deals?bubble-id=deals-collection-lightning-deals</code>, <code>https://www.amazon.co.uk/deals</code>, a <code>/gp/goldbox</code> link), or a collection's name as the page labels it on the marketplace below (<code>Lightning deals</code>, <code>Coupons</code>, <code>Outlet</code>, <code>Electronics</code>, <code>Kitchen</code>…; <code>lightning</code> and <code>coupons</code> work on every marketplace). A link's domain picks its marketplace. Leave it empty for all of the marketplace's Today's Deals.

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

Where a collection given by name is read, and whose Today's Deals an empty list reads. amazon.in currently sends its deals page to its festival page; that page is read.

## `maxDealsPerCollection` (type: `integer`):

How many deals to read from each collection, in Amazon's order. Amazon lists at most 500 per collection.

## `minDiscountPercent` (type: `integer`):

Only deals at least this much off, filtered by Amazon itself (the page's Discount filter). 0 keeps every deal.

## `fourStarsAndUp` (type: `boolean`):

Only products rated 4 stars and up (the page's Customer Reviews filter, applied by Amazon).

## `includeDetails` (type: `boolean`):

Also read each deal's product page: rating, review count, the product page price, availability, seller, ships from and Best Sellers Rank. Charged as a deal with details; a deal whose product page cannot be read is charged as a plain deal.

## `onlyNewDeals` (type: `boolean`):

For scheduled runs: leave out (free) the deals an earlier run with the same collections and filters already delivered. A product that comes back as a new deal is delivered again. The memory lives in your account's key-value store <code>steadyscrape-amazon-deals-state</code>.

## `residentialFallback` (type: `boolean`):

When Amazon refuses the run's own IP and the datacenter proxies, retry through residential proxies of the marketplace's country (included in the price: you pay per deal, not per proxy byte). Off: those collections come back with status <code>blocked</code>, unpaid.

## Actor input object example

```json
{
  "collections": [
    "Lightning deals"
  ],
  "marketplace": "com",
  "maxDealsPerCollection": 20,
  "minDiscountPercent": 0,
  "fourStarsAndUp": false,
  "includeDetails": false,
  "onlyNewDeals": false,
  "residentialFallback": true
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "collections": [
        "Lightning deals"
    ],
    "maxDealsPerCollection": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/amazon-deals-scraper").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 = {
    "collections": ["Lightning deals"],
    "maxDealsPerCollection": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/amazon-deals-scraper").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 '{
  "collections": [
    "Lightning deals"
  ],
  "maxDealsPerCollection": 20
}' |
apify call steadyscrape/amazon-deals-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyscrape/amazon-deals-scraper"
        }
    }
}
```

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/jgiZbLvoASJYldYwU/builds/gkT9WlsPQtOtJ0Thm/openapi.json
