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

Scrapes Amazon Today's Deals / Coupons grids per marketplace — deal price, list price, discount %, badge (lightning/coupon/best-deal), deal end. Errors never charged.

- **URL**: https://apify.com/cyprusapi/amazon-deals.md
- **Developed by:** [Torchtechnology LTD](https://apify.com/cyprusapi) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 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/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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

### What does this Actor do?

Amazon Deals Scraper harvests the **Today's Deals grid** of any Amazon marketplace — including **Lightning deals** (with live countdown and computed deal end) and **Coupon deals** (with the effective coupon price) — across eighteen verified marketplaces: amazon.de, .com, .co.uk, .fr, .it, .es, .ca, .com.au, .co.jp, .in, .nl, .se, .pl, .com.be, .com.mx, .com.br, .ae, and .sa. For every deal you get ASIN, title, deal price and list price as **structured numbers with the marketplace's own currency**, discount percentage, the deal badge, deal end time when Amazon renders a countdown, and full provenance (marketplace, source URL, scrape timestamp).

It is designed for both humans and AI agents: deterministic JSON output, documented error semantics, and pay-per-result pricing where **errors are never charged**.

### When to use this Actor

- **Deal monitoring** — pull the current deals of one or all marketplaces on a schedule and feed your price-comparison, alerting, or affiliate pipeline.
- **Lightning-deal tracking** — `dealType: "lightning"` returns only time-boxed deals, each with `dealEndsIn` (raw countdown) and `dealEndsAt` (computed UTC timestamp).
- **Coupon harvesting** — `dealType: "coupons"` returns coupon offers with the effective after-coupon price (`dealPrice`) and the pre-coupon price (`priceBeforeCoupon`).
- **Category-scoped research** — `categorySlug` scopes the grid to a deals collection such as `beauty`, `toys`, or `computers-and-software`.

**When not to use it:** you need full product detail pages (use a product-data actor), historical price charts (use a price-monitor actor), or review texts (use a reviews actor).

### Quickstart (API)

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~amazon-deals/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "marketplaces": ["com", "co.uk", "de"],
    "dealType": "all",
    "maxItemsPerMarketplace": 50
  }'
```

Or in the Console: pick the marketplaces, click Start, download as JSON/CSV/Excel/XML.

### Input reference

| Field | Type | Default | Description |
|---|---|---|---|
| `marketplaces` | string\[] | `["com"]` | Marketplace codes: `com`, `de`, `co.uk`, `fr`, `it`, `es`, `ca`, `com.au`, `co.jp`, `in`, `nl`, `se`, `pl`, `be`, `mx`, `br`, `ae`, `sa`. Several per run are fine. |
| `dealType` | string | `all` | `all` | `lightning` | `coupons` — filters the grid by deal kind. Ignored when `categorySlug` is set. |
| `categorySlug` | string | — | Optional deals-collection category filter (locale-independent slug from the deals-page filter bubbles), e.g. `beauty`, `toys`, `electronics`, `computers-and-software`. Available slugs vary per marketplace; an unknown slug yields an uncharged `no_results_found` error item. |
| `maxItemsPerMarketplace` | integer | 10 | Cap of unique deals per marketplace (the grid lazy-loads while scrolling; max 500). |
| `minDiscountPercent` | integer | — | Keep only deals discounted by at least this many percent (0–95, parsed from the deal badge). Fail-closed: a deal whose badge carries no discount value does not match. |
| `priceRange` | object | — | Keep only deals whose effective deal price is inside `{"min": …, "max": …}` (marketplace currency, inclusive bounds, either side optional). Fail-closed: a deal with no parsed deal price does not match. |
| `primeOnly` | boolean | `false` | Keep only deals the card marks as Prime (Prime badge/icon or Prime-exclusive badge). Fail-closed: a deal without a Prime marker does not match. |
| `proxyConfiguration` | object | bundled geo proxies | Optional — the actor ships with bundled geo proxies per marketplace (no setup needed, we cover the cost). Enable this only to force your own or Apify proxies instead. |
| `proxiesByMarketplace` | object | — | Bring-your-own geo-pinned proxies per marketplace (`{"co.uk": ["http://…"]}`). Overrides the bundled pool for the listed marketplaces. |

All filters (`minDiscountPercent`, `priceRange`, `primeOnly`) apply after parsing but **before charging**: filtered-out deals never appear in the dataset and are never charged.

### Output

One dataset item per unique deal:

```json
{
  "asin": "B0D3J7CKFR",
  "dealId": "019c2bdd",
  "itemId": "amzn1.asin.B0D3J7CKFR:amzn1.deal.019c2bdd",
  "dealType": "best-deal",
  "title": "Apple Pencil Pro: Advanced tools, pixel-perfect precision …",
  "url": "https://www.amazon.com/dp/B0D3J7CKFR",
  "thumbnailUrl": "https://m.media-amazon.com/images/I/…jpg",
  "dealPrice": { "value": 99.0, "currency": "USD" },
  "listPrice": { "value": 129.0, "currency": "USD" },
  "priceBeforeCoupon": null,
  "discountPercent": 23,
  "primeExclusive": false,
  "badgeText": "Limited time deal",
  "dealEndsIn": null,
  "dealEndsAt": null,
  "marketplace": "com",
  "sourceUrl": "https://www.amazon.com/deals",
  "collection": null,
  "input": "com",
  "scrapedAt": "2026-08-18T17:45:12.543773+00:00"
}
```

A lightning deal additionally carries the countdown:

```json
{
  "dealType": "lightning",
  "badgeText": "Endet in 04:27:08",
  "dealEndsIn": "04:27:08",
  "dealEndsAt": "2026-08-18T16:27:08+00:00"
}
```

A coupon deal carries the effective price in `dealPrice` and the regular price in `priceBeforeCoupon`:

```json
{
  "dealType": "coupon",
  "dealPrice": { "value": 22.02, "currency": "EUR" },
  "priceBeforeCoupon": { "value": 24.47, "currency": "EUR" },
  "listPrice": { "value": 29.99, "currency": "EUR" }
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Field reference

| Field | Description |
|---|---|
| `asin` | Amazon Standard Identification Number. |
| `dealId` | Amazon's deal/coupon id when rendered (`amzn1.deal.*` / promo id). |
| `itemId` | Full provenance id of the card (`amzn1.asin…:amzn1.deal…`); used for dedupe. |
| `dealType` | `lightning` (countdown rendered), `coupon` (coupon card), `best-deal` (discounted deal without countdown), or `null` when no badge is rendered. |
| `dealPrice` | Effective deal price, structured: `value` + marketplace `currency`. For coupons: the after-coupon price. |
| `listPrice` | Strike-through reference price (e.g. UVP/RRP) when rendered. |
| `priceBeforeCoupon` | Coupon cards only: the price before the coupon is applied. |
| `discountPercent` | Parsed from the badge label (e.g. "27 % Rabatt" → `27`). |
| `primeExclusive` | `true` when the card renders a Prime marker (Prime icon or Prime-exclusive badge); used by the `primeOnly` filter. |
| `badgeText` | Raw localized badge message (e.g. "Befristetes Angebot", "Endet in …"). |
| `dealEndsIn` / `dealEndsAt` | Lightning deals: raw remaining time (HH:MM:SS) and the computed UTC end timestamp. |
| `marketplace` / `sourceUrl` / `collection` / `input` / `scrapedAt` | Provenance: which marketplace, which page, which filter, and when. |

### How much does it cost?

The Actor uses **pay-per-event pricing**: you pay one `deal` event per unique deal item delivered. Error items (`blocked`, `transport`, `no_results_found`, `deals_page_unavailable`) are pushed for transparency and are **never charged**. Duplicate deals are deduplicated before charging, and filters are applied before charging as well.

### Tips

- The deals grid lazy-loads while scrolling; the Actor scrolls until the requested number of unique deals is reached (or the grid is exhausted). Large `maxItemsPerMarketplace` values simply take longer.
- Deal inventory changes during the day (lightning deals expire) — schedule runs for stable snapshots.
- Use `categorySlug` to avoid paying for deals outside your niche.

### FAQ, disclaimers, and support

- **Is this legal?** The Actor scrapes publicly visible data only — no login, no personal data, no circumvention of technical protection measures. You are responsible for complying with applicable law and Amazon's terms in your jurisdiction.
- **Known limitations:** Amazon renders deals client-side; rare hydration failures surface as an uncharged `no_results_found` error — just retry. Some marketplaces offer fewer deal collections than others; an unknown `categorySlug` is reported, never silently ignored. On some marketplaces (observed: it, es, se, be) Amazon currently serves a grid variant **without prices** — those deal items still carry ASIN, title, badge and discount %, with `dealPrice`/`listPrice` as `null`.
- **Price accuracy:** prices are parsed from the localized card markup into typed numbers (`value` + marketplace `currency`); `dealPriceString` always keeps the raw text for auditing.
- **Feedback:** please use the Issues tab of this Actor. Custom solutions (other marketplaces, other fields) are available on request.

# Actor input Schema

## `marketplaces` (type: `array`):

Amazon marketplaces to harvest the deals grid from. One run can cover several marketplaces.

## `dealType` (type: `string`):

Filter the grid by deal kind: all deals, lightning deals only, or coupon deals only. Ignored when a category slug is set.

## `categorySlug` (type: `string`):

Optional deals-collection category filter (locale-independent slug from the deals page filter bubbles), e.g. 'beauty', 'toys', 'electronics', 'computers-and-software', 'kitchen-home-and-furniture', 'fashion-redirect'. Available slugs vary per marketplace — an unknown slug yields a no\_results\_found error item (not charged). Wins over 'Deal type' when both are set.

## `maxItemsPerMarketplace` (type: `integer`):

Upper bound of unique deals collected per marketplace (the grid lazy-loads while scrolling).

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

Keep only deals discounted by at least this many percent (parsed from the deal badge). Applied after parsing but BEFORE charging — filtered-out deals never appear in the dataset and are never charged. Fail-closed: a deal whose badge carries no discount value does NOT match this filter.

## `priceRange` (type: `object`):

Keep only deals whose effective deal price falls inside this range, in the marketplace's own currency — e.g. {"min": 20, "max": 100}. Either side is optional ({"min": 50} or {"max": 25} alone are valid); bounds are inclusive. Applied after parsing but BEFORE charging — filtered-out deals never appear in the dataset and are never charged. Fail-closed: a deal with no parsed deal price does NOT match this filter.

## `primeOnly` (type: `boolean`):

Keep only deals the card marks as Prime (Prime badge/icon or a Prime-exclusive deal badge). Applied after parsing but BEFORE charging — filtered-out deals never appear in the dataset and are never charged. Fail-closed: a deal without a Prime marker does NOT match this filter.

## `proxyConfiguration` (type: `object`):

Optional — the actor ships with bundled geo proxies per marketplace (no setup needed, we cover the cost). Enable this only to force your own or Apify proxies instead.

## `proxiesByMarketplace` (type: `object`):

Optional: {"de": \["http://user:pass@host:port", …], "co.uk": \[…]}. Geo-pinned proxies per marketplace — exit-IP country should match the marketplace, otherwise Amazon serves wrong currencies or bot-gates. Proxy tier chain per task: this explicit pool FIRST; otherwise the bundled shared pool (we cover it); on blocked/transport the run falls back to Apify datacenter, then Apify residential. With useApifyProxy off and no pool at all: single direct attempt.

## Actor input object example

```json
{
  "marketplaces": [
    "com"
  ],
  "dealType": "all",
  "maxItemsPerMarketplace": 10,
  "primeOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "marketplaces": [
        "com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cyprusapi/amazon-deals").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 = { "marketplaces": ["com"] }

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

```

## MCP server setup

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

```

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/Yp6c4GT9P6cRS8mZU/builds/L8L5jhEhXTkyAWJLn/openapi.json
