# Amazon Deals & Discounts Scraper (`apt_marble/amazon-deals-scraper`) Actor

Find genuinely discounted Amazon products for any search term or category: current price, crossed-out list price, percentage off and money saved, plus rating and offer expiry. Filter by minimum discount, price band and star rating so only deals worth acting on come back.

- **URL**: https://apify.com/apt\_marble/amazon-deals-scraper.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.80 / 1,000 discounted product founds

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

## Amazon Deals & Discounts Scraper

Find products that are genuinely marked down on Amazon. Give it the search terms
or category links you care about, set the smallest discount worth your time, and
it returns every product showing a real price cut — the current price, the
crossed-out list price, the percentage off and the money saved — with an
optional price band and rating floor so a big discount on a bad product never
fills your results.

### What you can do with it

- **Build a daily deals feed** for a niche, a category or a brand.
- **Watch competitors' promotions** and see how deep they are willing to cut.
- **Find restock and arbitrage opportunities** by filtering on discount, price
  band and customer rating together.
- **Feed a price-alert or coupon site** with fresh, verified markdowns.
- **Check whether a category is in a discount cycle** by scanning the same terms
  on a schedule and watching the average discount move.
- **Catch time-limited offers** — products Amazon is actively promoting also
  report when the offer ends and how much of it has already been claimed.

### What you get

One row per discounted product. Abridged real example:

```json
{
  "asin": "B0F9X3FDYY",
  "title": "HUANUO 32x19 Inch Small Electric Standing Desk, Adjustable, Light Walnut",
  "url": "https://www.amazon.com/HUANUO-Electric-Adjustable-Workstation-LightWalnut/dp/B0F9X3FDYY",
  "image": "https://m.media-amazon.com/images/I/61ABU8EwDcL._AC_UL320_.jpg",
  "currentPrice": 696.94,
  "listPrice": 929.41,
  "discountPercent": 25,
  "savings": 232.47,
  "currency": "MAD",
  "priceSource": "search-result",
  "rating": 4.6,
  "ratingsCount": 2320,
  "boughtInPastMonth": "2K+",
  "isPrime": false,
  "badge": "Overall Pick",
  "isAmazonsChoice": true,
  "isBestSeller": false,
  "dealType": null,
  "dealEndsAt": null,
  "percentClaimed": null,
  "isListedDeal": false,
  "searchTerm": "standing desk",
  "categoryNode": null,
  "position": 1,
  "organicPosition": 1,
  "isSponsored": false,
  "marketplace": "us",
  "scrapedAt": "2026-08-07T16:40:13.856Z"
}
```

When Amazon is actively promoting a product, the same row also fills in
`dealType` (for example `LIGHTNING_DEAL`), `dealEndsAt`, `percentClaimed`,
`dealBadge`, `brand` and `category`, and `isListedDeal` becomes `true`.

### Input reference

| Input | Type | Default | What it does |
| --- | --- | --- | --- |
| Search terms or categories | list of text | — | What to scan. Plain phrases like `coffee maker`, or Amazon category and search links. Up to 100 per run — anything past the hundredth is not scanned, and the run log says how many were left out. Required. |
| Minimum discount (%) | whole number | `20` | Only keep products cut by at least this much off their list price (1–99). |
| Maximum products scanned per term | whole number | `200` | How many products to check for each term before moving on, up to 2,000. Only the discounted ones are returned. |
| Minimum price | whole number | — | Ignore products cheaper than this. |
| Maximum price | whole number | — | Ignore products more expensive than this. |
| Minimum star rating | whole number | — | Ignore products rated below this, so a deep discount on a poor product does not fill the results (1–4). |
| Amazon marketplace | choice | `United States` | Which country's Amazon site to read. Prices come back in that marketplace's own currency. |
| Parallel targets | whole number | `4` | How many terms to work on at the same time, up to 10. Higher is faster, but Amazon serves fewer complete pages when pushed hard — leave it at 4 unless you have a reason. |

### Output fields

| Field | Type | Description |
| --- | --- | --- |
| `asin` | text | Amazon's product identifier. |
| `title` | text | Full product name as listed. |
| `url` | text | Direct link to the product. |
| `image` | text | Product thumbnail. |
| `currentPrice` | number | What the product costs right now. |
| `listPrice` | number | The crossed-out price it is discounted from. |
| `discountPercent` | number | Percentage off, worked out from those two prices. |
| `savings` | number | Money off, worked out from those two prices. |
| `currency` | text | Currency the prices are shown in, taken from the product itself. |
| `priceSource` | text | Whether the pair of prices came from the search result or from Amazon's own promoted-deals listing. |
| `rating` | number | Average customer rating out of five. |
| `ratingsCount` | number | How many customers rated the product. This is not the number of written reviews. |
| `boughtInPastMonth` | text | Amazon's "bought in past month" figure, when it shows one. |
| `isPrime` | true / false | Prime delivery shown on the listing. |
| `badge`, `isAmazonsChoice`, `isBestSeller` | text / true / false | Badges shown on the listing. |
| `dealType` | text | The kind of offer when Amazon is actively promoting the product, such as a lightning deal. |
| `dealState`, `dealId` | text | The offer's status and reference. |
| `dealEndsAt` | text | When a time-limited offer ends. |
| `percentClaimed` | number | How much of a limited offer has already been taken. |
| `dealBadge` | text | The promotional wording Amazon shows, such as "Limited time deal". |
| `brand`, `category` | text | Brand and department, for promoted products. |
| `isListedDeal` | true / false | Whether Amazon is advertising this product as an offer, as opposed to it simply being marked down. |
| `searchTerm` | text | Which of your terms found it. |
| `categoryNode` | text | The category identifier, when you scanned a category link. |
| `position`, `organicPosition` | number | Where it sat in Amazon's results, as shown and with sponsored placements removed. |
| `isSponsored` | true / false | Whether the placement was an ad. |
| `marketplace` | text | The marketplace you chose. |
| `scrapedAt` | text | When the row was collected. |

### Pricing

Pay per result. You are charged **$0.0008 per discounted product** — $0.80 for
1,000 rows — and nothing for the products that are checked and turn out not to
be discounted.

Worked example: five search terms, 200 products checked for each, of which 150
are marked down by 20% or more → 150 rows, **$0.12**.

Tighten the minimum discount, the price band or the rating floor to keep the
rows — and the bill — focused on offers you would actually act on.

### Limits & what this actor cannot do

- **A discount is only reported when Amazon shows both a current price and a
  higher crossed-out list price.** Some products instead show a "typical price",
  which is an average of what the product normally sells for across the market,
  not a price it was ever cut from. Those are deliberately not reported as
  deals, because doing so would invent savings that do not exist.
- Amazon publishes a limited number of public results for any one search, so a
  broad term returns what Amazon actually serves rather than its entire
  catalogue. Amazon's own printed result count is an estimate and is not used.
- Not every discounted product is an advertised offer. Products Amazon is
  actively promoting also carry the offer type, its expiry and its claim rate;
  ordinary markdowns carry the prices and the discount only.
- Coupons, subscribe-and-save reductions and basket-level promotions are not
  part of the price shown on a listing and are not reported as discounts.
- Prices, discounts and stock are a snapshot at the moment of collection and
  keep changing afterwards — a lightning offer can be gone within the hour.
- Prices and availability differ between Amazon marketplaces; results reflect
  the marketplace you select, in that marketplace's own currency.
- Sponsored placements appear inside Amazon's own results; they are flagged so
  they can be kept or excluded.
- Terms that Amazon has nothing to serve for are reported as empty rather than
  failed.
- Speed depends on the size of the job and on Amazon's own response times; no
  fixed throughput is promised.
- Amazon's terms govern automated access. You are responsible for using the
  results lawfully and in line with the source site's terms.

### FAQ

**Do I need an Amazon account?**
No. Everything collected is what Amazon shows to any visitor.

**Does it need my login or password?**
No. There is nothing to connect and nothing to authorise.

**Why did a product with a big "% off" badge not come back?**
Because the badge was measured against a typical market price rather than a
crossed-out list price. Only genuine markdowns are reported, so the discount you
see in the output is one you can verify on the product page.

**Can I schedule it?**
Yes. Daily runs on the same terms give you a clean history of how deep and how
often a category discounts.

**Is the data complete?**
It is every genuine markdown Amazon serves publicly for the terms you gave, up
to the number of products you asked it to check. It is not a list of every
discount on Amazon.

**How do I get more results for one term?**
Raise the number of products checked per term, lower the minimum discount, or
add narrower terms — narrow terms surface deals that a broad one buries.

# Actor input Schema

## `keywords` (type: `array`):

What to scan for discounts. Search terms, or Amazon category links. Up to 100 per run; anything past that is not scanned, and the log says how many were left out.

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

Only keep products discounted by at least this much off their list price.

## `maxResultsPerTerm` (type: `integer`):

How many products to check for each search term before moving on. Only the discounted ones are returned.

## `minPrice` (type: `integer`):

Ignore products cheaper than this.

## `maxPrice` (type: `integer`):

Ignore products more expensive than this.

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

Ignore products rated below this, so a big discount on a bad product does not fill the results.

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

Which country's Amazon site to read. Prices, availability and rankings differ between marketplaces, and results come back in that marketplace's own currency.

## `maxConcurrency` (type: `integer`):

How many targets to work on at the same time. Higher is faster but Amazon serves fewer complete pages when pushed hard. Leave at 4 unless you have a reason.

## Actor input object example

```json
{
  "keywords": [
    "headphones",
    "coffee maker"
  ],
  "minDiscountPercent": 20,
  "maxResultsPerTerm": 100,
  "marketplace": "us",
  "maxConcurrency": 4
}
```

# Actor output Schema

## `results` (type: `string`):

Every row this run produced.

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

What this run collected, and anything it could not read.

# 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 = {
    "keywords": [
        "headphones",
        "coffee maker"
    ],
    "minDiscountPercent": 20,
    "maxResultsPerTerm": 100,
    "marketplace": "us",
    "maxConcurrency": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/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 = {
    "keywords": [
        "headphones",
        "coffee maker",
    ],
    "minDiscountPercent": 20,
    "maxResultsPerTerm": 100,
    "marketplace": "us",
    "maxConcurrency": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/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 '{
  "keywords": [
    "headphones",
    "coffee maker"
  ],
  "minDiscountPercent": 20,
  "maxResultsPerTerm": 100,
  "marketplace": "us",
  "maxConcurrency": 4
}' |
apify call apt_marble/amazon-deals-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apt_marble/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/RUt0faRt7xlzUnkVC/builds/DhQUy0k5IFDBTfpNJ/openapi.json
