Amazon Today's Deals Scraper With Star Ratings & Deal Badges avatar

Amazon Today's Deals Scraper With Star Ratings & Deal Badges

Pricing

$19.99/month + usage

Go to Apify Store
Amazon Today's Deals Scraper With Star Ratings & Deal Badges

Amazon Today's Deals Scraper With Star Ratings & Deal Badges

Amazon Today’s Deals Scraper extracts live deal data from Amazon. Collect product titles, prices, discounts, categories, ratings, and availability. Ideal for price tracking, deal monitoring, market research, and ecommerce analytics.

Pricing

$19.99/month + usage

Rating

0.0

(0)

Developer

Scraper Engine

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

0

Monthly active users

a day ago

Last modified

Share

Amazon Today's Deals Scraper — Ratings, Badges and Deal Prices

Amazon Today's Deals Scraper reads Amazon's public Today's Deals feed and returns every promotion as a typed JSON row: asin, title, priceToPay, basisPrice, savingsPercentageValue, rating, reviewCount, the full 1–5★ histogram and Amazon's own deal badge. A 70% discount on a 2.1★ product is not a bargain, and these rows let you tell the difference before you buy, publish or push to an affiliate feed. Nothing is required to start — run it empty and the defaults do something sensible.

What is Amazon Today's Deals Scraper With Star Ratings & Deal Badges?

It is an Apify Actor that queries Amazon's public promotions feed — the data behind amazon.com/deals — and returns one flat row per discounted product, combining the deal economics with the review-quality evidence you need to judge it. Ratings, the star histogram and the deal badge all ride on the same request as the price, so no product page is opened twice.

No Amazon account, login, cookie or Product Advertising API credential is required. The only credential you need is your Apify token.

It is built for affiliate publishers and deal-site operators, retail and pricing analysts tracking discount activity, resellers hunting well-reviewed markdowns, and developers feeding live deal data into an internal tool or an LLM pipeline.

What Amazon deal data is publicly available to scrape?

Amazon's deals surface renders the whole commercial offer to anonymous visitors: the discounted price, the list price it is measured against, the deal window, the star rating, the review distribution and Amazon's own merchandising badge. What it does not render is individual review content or anything about a buyer.

Data CategoryOn the public deals feedGated or not exposed on this surface
ASIN, product title, image, product link✅ Public
Deal price, list price, savings amount and percent✅ Public
Deal window and deal state (dealStartTime, dealEndTime, dealState)✅ Public
Star rating and review count✅ Public
1–5★ review distribution (percentages)✅ Public
Amazon's deal badge label and messaging, including "With Prime"✅ Public
Category, product type, brand identifier✅ Public
Individual review text and reviewer namesNot requested by this Actor — no review bodies are fetched
Offers beyond the first buying option, seller by sellerThe Actor reads the first buying option only
A server-side "Prime-exclusive deals" queryNot exposed by the feed — only the badge label can be read
Buyer identity, order or payment historyAmazon account

Amazon Today's Deals Scraper only returns publicly visible data — what any visitor to the deals page sees. Nothing behind a login wall.

What data can I extract with Amazon Today's Deals Scraper?

Every row carries four layers: what the product is, what the deal costs, what reviewers think of it, and how Amazon itself labels the promotion. Thirty-eight keys are written per row (thirty-three when includeStarHistogram is off); the dataset's default table view surfaces thirty of them as columns.

Field NameDescription
asinAmazon Standard Identification Number — the dedupe and join key
titleProduct title as displayed on the deal
imagePrimary product image URL, hi-res variant preferred, low-res as fallback
linkAbsolute amazon.com product URL
basisPriceList price the discount is measured against. 0.0 when absent
priceToPayCurrent deal price. 0.0 when absent
currencyCurrency of the prices. Falls back to "USD" when Amazon omits it
currencyCodeThe same currency read from the pay price first; null when Amazon omits it
savingsAmountAbsolute saving in currency units. 0.0 when absent
savingsPercentageValueDiscount percentage as a number. 0 when absent
dealStartTimeDeal start timestamp as Amazon publishes it. "" when absent
dealEndTimeDeal end timestamp as Amazon publishes it. "" when absent
dealStateAmazon's deal state string, e.g. AVAILABLE. "" when absent
dealIdDeal identifier from the deal record, or parsed from the badge's amzn1.deal.<id> instrumentation value. null when neither is present
dealTypeAmazon's deal type string. null when absent
isRealDealtrue when the row carries an actual deal record rather than carousel filler
ratingAverage star rating as a number. null when Amazon returns none
ratingDisplayAmazon's own rendered rating string. null when absent
reviewCountNumber of customer reviews as an integer. null when absent
reviewCountDisplayAmazon's own rendered review-count string. null when absent
starsFivePercentShare of reviews that are 5★. Key present only when includeStarHistogram is on
starsFourPercentShare of reviews that are 4★. Key present only when includeStarHistogram is on
starsThreePercentShare of reviews that are 3★. Key present only when includeStarHistogram is on
starsTwoPercentShare of reviews that are 2★. Key present only when includeStarHistogram is on
starsOnePercentShare of reviews that are 1★. Key present only when includeStarHistogram is on
positiveReviewPercent4★ + 5★ share. null unless all five histogram slices came back
criticalReviewPercent1★ + 2★ share. null unless all five histogram slices came back
hasDealBadgetrue when Amazon attached its own deal badge to this offer
dealBadgeLabelBadge label text, e.g. the "30% off" label. null when unbadged
dealBadgeMessageBadge messaging text, e.g. "Limited time deal". null when unbadged
dealBadgeShortMessageShorter badge messaging variant. null when unbadged or not provided
isPrimeExclusiveBadgetrue when the badge messaging contains "With Prime", false when badged otherwise, null when there is no badge at all
ratingWeightedDiscountsavingsPercentageValue × (rating ÷ 5), rounded to 2 decimals. null when either input is missing or zero
categoryAmazon's website display group, e.g. Kitchen. null when absent
productTypeAmazon's internal product type string. null when absent
glProductGroupAmazon's GL product group symbol. null when absent
brandIdNumeric brand identifier parsed from the brand logo URL. null when there is no logo
scrapedAtUTC timestamp of extraction, YYYY-MM-DDTHH:MM:SSZ

Deal and pricing fields

priceToPay against basisPrice gives the discount in money; savingsAmount and savingsPercentageValue give it as Amazon states it. dealStartTime, dealEndTime and dealState describe the promotion window — these are the fields that tell you whether a row is a week-long promotion or something that expires tonight. dealId and dealType group ASINs that belong to the same Amazon promotion. Note the fallback semantics: the price and deal-window fields use typed empty defaults (0.0, "") rather than null, a behaviour kept deliberately stable for existing consumers, while every field layered on top of those returns null when genuinely absent instead of a fake zero.

Review-quality fields

rating and reviewCount are the headline signals; starsOnePercent through starsFivePercent are the distribution behind them, returned as five flat percentage columns rather than a nested object, so CSV and spreadsheet consumers get real columns with no flattening step. positiveReviewPercent and criticalReviewPercent are the two summaries most people actually filter on — 4–5★ share and 1–2★ share — and both are emitted whether or not the histogram columns are included. Both are null unless all five slices were returned, because a partial histogram cannot be summed honestly.

Badge and ranking fields

hasDealBadge, dealBadgeLabel, dealBadgeMessage and dealBadgeShortMessage are Amazon's own merchandising text, returned unmodified. isPrimeExclusiveBadge is derived from the badge message containing "With Prime" — it is a reading of Amazon's label, not a Prime-exclusive search. ratingWeightedDiscount is the Actor's own value score: discount multiplied by rating over five, so 60% off at 4.6★ outranks 70% off at 3.2★. It doubles as a sortBy option.

🤖 Add-on: Need additional Amazon data?

Three companion Scraper-Engine Actors extend this one. Amazon Top Rated Products Scraper screens Amazon search results by rating and review count and can pull the ratings breakdown, Amazon's AI review summary and on-page top reviews. Amazon ASIN Scraper By Country & Marketplace takes the ASINs you found here and prices them across storefronts, one row per ASIN and storefront. Amazon Product Scraper By Bestseller & Demand Filter adds sales-demand analytics — a parsed monthly-purchases count, the main Best Sellers Rank and an estimated monthly-sales range.

Why not build this yourself?

Amazon's Product Advertising API is not an alternative here. It requires an approved Associates account in good standing with qualifying sales before credentials are issued, and it does not expose the Today's Deals surface at all — you cannot ask it what is discounted right now. So the DIY route is a scraper, and the work is in the details rather than the volume.

The deals page is not the data source. The listings come from a promotions endpoint on data.amazon.com that refuses requests without a CSRF token, and that token is served inline in the HTML of the deals page — so every run has to fetch the page, locate the token (its key name is not stable, so several patterns must be tried), and then use it verbatim against the API. Getting ratings, the histogram and the deal badge out of that endpoint means composing an expand grammar in the Accept header, and the badge and deal-details entities only return data when scoped to the buying-option level; ask for them at product scope and they come back silently empty.

Then there is the failure mode nobody expects: the endpoint answers HTTP 200 with a node whose type is error/v1 when it cannot serve an entity you asked for. A key-presence check reports full coverage on entities that returned nothing at all, so a naive parser produces a dataset that looks complete and is quietly wrong. This Actor validates every node against its expected type before reading it, which is why an unavailable field arrives as null rather than as plausible garbage.

How to use Amazon Today's Deals Scraper

The Actor runs on Apify. Start it from the Apify Console or call it through the Apify API.

  1. Open Amazon Today's Deals Scraper on Apify and click Try for free
  2. Nothing is required — click Start and you get the first 100 real deals in Amazon's own ranking, histogram columns included
  3. Optionally set How many deals to collect (maxDeals) — anything above 500 is coerced down, because that is the size of Amazon's window
  4. Optionally add quality gates: Minimum star rating, Minimum number of reviews, Maximum share of 1–2★ reviews, Only deals Amazon itself badges, Only deals badged 'With Prime'
  5. Optionally pick a Sort the results by order — Amazon's ranking, discount × rating, rating, review count or discount
  6. Start the run, then download the dataset as JSON, CSV or Excel

Leave Proxy alone unless a run starts failing. The deals feed answers on a direct connection, and the Actor deliberately does not build a proxy configuration you did not ask for.

How to scale to bulk deal extraction

There is no bulk input field, because there is nothing to enumerate: Amazon exposes one Today's Deals feed and this Actor reads all of it. maxDeals is the only volume control, and 500 is the ceiling Amazon's own totalCount puts on a single run.

Scale over time instead of over inputs. Schedule the Actor on Apify at whatever cadence your use case needs, and key each dataset on asin plus scrapedAt. Deals rotate, so a repeated run is not a duplicate run: diffing priceToPay, savingsPercentageValue and dealState between runs is how you build the discount history a single 500-row snapshot cannot give you.

What can you do with Amazon deal data?

  • 🏷️ An affiliate publisher curating a deals page sets minRating to 4 and minReviewCount to 500, sorts by ratingWeightedDiscount, and publishes only markdowns that will not generate returns — dealBadgeMessage supplies the urgency copy.
  • 📉 A pricing analyst tracking a category schedules repeated runs and diffs priceToPay and savingsPercentageValue per asin, using dealStartTime and dealEndTime to separate genuine promotion windows from steady-state repricing.
  • 🛒 A reseller sourcing inventory sets maxCriticalReviewPercent to 10 to drop polarised listings, then reads basisPrice, priceToPay and reviewCount to judge whether the margin survives on a product with real demand behind it.
  • 📊 A retail researcher studying discount behaviour groups rows by category and productType and compares positiveReviewPercent against savingsPercentageValue to see which categories discount their weakest-reviewed stock hardest.
  • 🤖 An AI engineer building a shopping agent indexes title, category, dealBadgeMessage and criticalReviewPercent into a vector store, so the agent can answer "what is discounted today above 4.5★ with under 5% one- and two-star reviews" against live data rather than a stale snapshot.

Because the Actor is callable over the Apify API, any agent framework that can make an HTTP request can invoke it as a tool and get typed JSON back.

How does Amazon Today's Deals Scraper handle rate limits and blocking?

The Actor uses plain HTTP against Amazon's promotions endpoint — no browser, no rendering engine, no CAPTCHA solver. It sends a desktop Chrome user agent, the origin and referer a real deals-page visitor sends, and the CSRF token harvested from that page in the same session.

Requests run one page at a time rather than in parallel, which keeps the request rate low by design. Each page request is retried up to three times with an increasing pause between attempts. A response is treated as a block rather than a result when the status is not 200 or the body is under 20,000 bytes — that catches the soft block where Amazon returns a 200 with a near-empty shell instead of a page of deals.

Two failure paths, both explicit. If the deals page itself cannot be read — non-200, a body under 20,000 bytes, or no CSRF token found in it — the run stops with the reason in the log, so there is no half-built dataset to misread. If a later page of the feed cannot be recovered after its three attempts, the Actor logs a warning and stops paginating, so you keep the deals already collected instead of losing the run. No partial or fabricated row is ever written.

Proxying is off by default. The feed is reachable directly, and building a default proxy configuration would bill proxy traffic the Actor does not need, so one is created only when you actually enable Apify Proxy or supply your own proxy URLs. The run log states which mode was used.

⚠️ Limits worth knowing before your first run

  • Amazon caps the window at 500 deals. The promotions feed reports its own totalCount as 500 on every call. maxDeals accepts values up to 10000 because the schema allows it, but anything above 500 is coerced to 500 with a warning in the log — a run cannot return more than 500 rows no matter what you ask for.
  • Every filter is applied after fetching, not by Amazon. The endpoint accepts only a paging parameter, and its refinement options — including Prime programs — are silently ignored. So minRating, minReviewCount, maxCriticalReviewPercent, onlyBadgedDeals and onlyPrimeExclusiveBadge are evaluated on rows the Actor has already fetched and parsed. Billing is per pushed row, so filtered-out deals cost you nothing in row charges — but turning on any filter, or choosing any sortBy other than Amazon's own, makes the Actor read the entire 500-deal window before it returns anything, which costs compute time. Strict filters mean fewer rows than maxDeals, never more pages.
  • A row is a snapshot, not a state. Today's Deals is ephemeral by nature: prices, badges and dealState reflect the moment of the run, stamped in scrapedAt. A deal collected at 09:00 may be gone by 11:00, and the Actor never revisits a row to update it.
  • maxCriticalReviewPercent drops what it cannot evaluate. It reads criticalReviewPercent, which is null unless all five histogram slices came back from Amazon. When the filter is active (any value below 100), a product with an incomplete histogram is excluded rather than passed through. The same rule applies to minRating and minReviewCount: an unrated product cannot be shown to clear a minimum rating, so it is dropped.
  • onlyPrimeExclusiveBadge is a label filter, not a Prime search. It keeps only rows whose badge messaging contains "With Prime". It cannot ask Amazon for Prime-exclusive deals, and it will not surface a Prime deal that Amazon did not label that way.
  • US marketplace only, prices in USD. The marketplace is fixed to amazon.com and the request pins the currency-of-preference header to USD. There is no region or currency parameter, and no other storefront is reachable in this Actor.
  • Rows without a buying option are never returned. A promotion carrying no buying option, or no ASIN, is skipped before any filter runs — independently of skipNonDeals.
  • Dedupe is per run, by ASIN. The first occurrence of an ASIN in the feed wins and later occurrences across pages are dropped. Across separate runs there is no dedupe, which is what makes scheduled diffing possible.

⬇️ Input

Every parameter is optional. An empty input is a valid run: with the schema defaults applied you get the 100 highest-ranked real deals in Amazon's own order, histogram columns included, no quality gates, on a direct connection.

ParameterRequiredTypeDescriptionExample Value
maxDealsNointegerNumber of deals to return. Amazon's feed exposes a fixed window of 500 promotions, so anything above 500 is accepted and coerced down to 500 with a warning in the log. Minimum 1, maximum 10000. Default 100.250
skipNonDealsNobooleanDrops promotional filler — rows that have a title and an ASIN but no deal record, so no price, no discount and no deal window — instead of returning and billing empty results. Default true.true
minRatingNointegerKeep only deals rated at or above this many stars. A product with no rating is excluded whenever this is above 0. Whole stars only. Minimum 0, maximum 5. Default 0 (no rating requirement).4
minReviewCountNointegerKeep only deals with at least this many customer reviews — a 4.8★ from 6 reviewers is not the same evidence as a 4.4★ from 8,480. Minimum 0. Default 0 (no minimum).500
maxCriticalReviewPercentNointegerThe polarisation guard. Reads the 1★ and 2★ slices of the star histogram and drops anything above your threshold. Minimum 0, maximum 100. Default 100 (off).10
onlyBadgedDealsNobooleanKeep only rows carrying Amazon's own deal badge — the discount label plus its "Limited time deal" / "Ends in …" messaging. Default false.false
onlyPrimeExclusiveBadgeNobooleanKeep only deals whose badge messaging reads "With Prime". A label filter, not a Prime search: it can only keep the deals Amazon itself marked that way. Default false.false
includeStarHistogramNobooleanAdds the five per-star percentage columns (starsOnePercentstarsFivePercent) to every row. Turn off for a narrower table; positiveReviewPercent and criticalReviewPercent are emitted either way. Default true.true
sortByNostringResult order. One of default, ratingWeightedDiscount, rating, reviewCount, discount. Any value other than default makes the Actor read the whole window before returning. Default "default"."ratingWeightedDiscount"
proxyConfigurationNoobjectApify Proxy settings. The deals feed is reachable directly, so no proxy is used unless you enable one. Prefilled with {"useApifyProxy": false}.{"useApifyProxy": true}

One pitfall for API callers: the Actor reads an undocumented limit key before maxDeals, so a raw API payload containing both silently uses limit and ignores maxDeals. The key is not in the input schema, so the Console can never set it — send maxDeals only, and drop limit from any payload you copied from another Actor.

What each sortBy value does

ValueOrder
defaultAmazon's own deal ranking, preserved exactly as the feed returns it. The only value that lets rows stream into the dataset as they are found
ratingWeightedDiscountBest value for the rating first — savingsPercentageValue × (rating ÷ 5), so 60% off at 4.6★ outranks 70% off at 3.2★
ratingHighest star rating first
reviewCountMost-reviewed first
discountBiggest savingsPercentageValue first

For every value except default, rows missing the sort field sort to the bottom rather than being dropped.

Example input

{
"maxDeals": 250,
"skipNonDeals": true,
"minRating": 4,
"minReviewCount": 500,
"maxCriticalReviewPercent": 10,
"onlyBadgedDeals": true,
"onlyPrimeExclusiveBadge": false,
"includeStarHistogram": true,
"sortBy": "ratingWeightedDiscount",
"proxyConfiguration": {
"useApifyProxy": false
}
}

⬆️ Output

Every deal is one flat dataset row with the same keys in the same order, run after run — 38 keys with includeStarHistogram on, 33 with it off, which is the only toggle that changes the shape of a row. Nothing is nested: the star histogram is five plain percentage columns, so CSV and Excel exports are usable as they come. Export as JSON, CSV or Excel, or read the dataset through the Apify API.

Only deal rows are ever pushed, and each one is charged as a single row_result event. There are no error rows, no diagnostic rows and no run-accounting rows in the dataset — blocked pages, filtered-out deals and empty runs are reported in the run log only. So no filter expression is needed to clean the dataset, and nothing you are billed for is anything other than a deal.

Example output

{
"asin": "B09JQMJHXY",
"basisPrice": 149.99,
"priceToPay": 99.99,
"currency": "USD",
"currencyCode": "USD",
"savingsAmount": 50.0,
"savingsPercentageValue": 33,
"title": "Ninja BL660 Professional Compact Smoothie & Food Processing Blender, 1100 Watts, 72-oz Pitcher",
"link": "https://www.amazon.com/Ninja-BL660-Professional-Processing-Blender/dp/B09JQMJHXY",
"dealStartTime": "2026-07-24T07:00:00.000Z",
"dealEndTime": "2026-07-28T06:59:59.999Z",
"dealState": "AVAILABLE",
"image": "https://m.media-amazon.com/images/I/81pQrPnVFAL.jpg",
"rating": 4.6,
"ratingDisplay": "4.6 out of 5 stars",
"reviewCount": 12480,
"reviewCountDisplay": "12,480",
"starsFivePercent": 74,
"starsFourPercent": 15,
"starsThreePercent": 6,
"starsTwoPercent": 2,
"starsOnePercent": 3,
"positiveReviewPercent": 89,
"criticalReviewPercent": 5,
"hasDealBadge": true,
"dealBadgeLabel": "33% off",
"dealBadgeMessage": "Limited time deal",
"dealBadgeShortMessage": "Limited time",
"isPrimeExclusiveBadge": false,
"dealId": "7c41e0b9",
"dealType": "BEST_DEAL",
"isRealDeal": true,
"category": "Kitchen",
"productType": "BLENDER",
"glProductGroup": "gl_kitchen",
"brandId": "1043921",
"ratingWeightedDiscount": 30.36,
"scrapedAt": "2026-07-25T14:08:31Z"
}

How does it work?

The Actor first loads the public deals page over plain HTTP and pulls the CSRF token Amazon serves inline in that HTML. It then calls Amazon's promotions endpoint with that token, asking — in a single request per page — for the title, links, images, customer-reviews summary, product category, brand logo, price, deal details and deal badge together. That is why star ratings, the histogram and the badge cost no extra requests: they are additional entities on a request the Actor already makes, not a second lookup per product.

Pages are read one at a time, following Amazon's own next-index pointer until the feed is exhausted or 500 unique ASINs have been collected. Each entity in the response is validated against its expected type before it is read, so an entity Amazon declines to serve becomes an explicit null instead of a silently missing value. Rows are then deduplicated by ASIN, filtered, optionally sorted, and written to the dataset.

Only publicly visible deal data is collected — no account, no cookie, no session login. Because the Actor reads a structured JSON feed rather than rendered markup, a visual redesign of the deals page does not change your field names or their types.

Integrations

Amazon Today's Deals Scraper is an Apify Actor, so it works with anything that can call the Apify API or consume an Apify dataset.

Calling Amazon Today's Deals Scraper from Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<YOUR_USERNAME>/amazon-todays-deals-scraper-star-ratings-deal-badges").call(run_input={
"maxDeals": 250,
"minRating": 4,
"minReviewCount": 500,
"maxCriticalReviewPercent": 10,
"sortBy": "ratingWeightedDiscount",
})
for deal in client.dataset(run["defaultDatasetId"]).iterate_items():
print(deal["asin"], deal["priceToPay"], deal["savingsPercentageValue"],
deal["rating"], deal["criticalReviewPercent"], deal["dealBadgeMessage"])

Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.

No-code tools (n8n, Make, LangChain)

In n8n, use the Apify node — or an HTTP Request node pointed at the Actor's run endpoint with your token — and pass the same JSON input shown above. In Make, use the Apify module and map the dataset output straight into a Google Sheets, Airtable or Slack step for a scheduled deal digest. In LangChain, wrap the run-and-fetch call as a tool function: rows are already typed JSON, so no output parser is needed between the dataset and the model.

Collecting publicly listed product, price and promotion data is broadly treated as permissible where the data is accessible without authentication, and this Actor collects only what an anonymous visitor to Amazon's deals page already sees — no login, no cookie, no session.

Deal records, prices, discount percentages and aggregate ratings are commercial product data, not personal data. The output contains no review text, no reviewer names and no buyer or seller-representative identities — only rating, reviewCount and the histogram percentages, which are aggregates that identify no one. GDPR and equivalent personal-data regimes therefore do not attach to this output the way they would to a profile scraper. The obligations that do apply are contractual and database-related: Amazon's terms of service restrict automated access, which is a civil and contractual matter, and database or unfair-competition rules can apply if you systematically reproduce a substantial part of Amazon's catalogue as a competing listing.

Consult legal counsel before republishing extracted deal data as a competing catalogue, or reselling it as a standalone product.

❓ Frequently asked questions

What Amazon deal fields does Amazon Today's Deals Scraper return?

The five most used are priceToPay, savingsPercentageValue, rating, criticalReviewPercent and dealBadgeMessage. Thirty-eight keys are written per row in total — see the data fields table above.

Does Amazon Today's Deals Scraper require an Amazon account or login?

No. No Amazon account, no login, no cookie, and no Product Advertising API credentials — that API requires an approved Associates account and does not expose the Today's Deals surface anyway. The only credential you need is your Apify token.

How many deals can I extract in one run?

Up to 500. Amazon's promotions feed reports its own totalCount as 500 on every call, so that is the hard ceiling for a single run. maxDeals accepts values up to 10000, but anything above 500 is coerced down with a warning in the log. If you also apply quality filters, expect fewer rows than maxDeals, because filtering happens after fetching.

What happens when no deals pass the filters?

The run finishes successfully with an empty dataset and a log warning telling you to loosen the filters and re-run. No error row is written, and because billing is per pushed row, an empty result set means no row charges. If it keeps happening, the usual cause is minReviewCount combined with maxCriticalReviewPercent — the second also excludes any product whose star histogram came back incomplete. Loosen one gate at a time and read the coverage line in the run log, which reports how many of the scanned rows carried a rating, a deal badge and a "With Prime" badge.

What happens if a deal expires or its price changes during the run?

The row keeps the values that were live when it was fetched, timestamped in scrapedAt. Today's Deals is a moving surface: a deal can expire, sell out or reprice minutes later, and the Actor does not revisit rows to refresh them. Treat priceToPay, dealState and the badge fields as point-in-time observations, use dealEndTime to judge how long a row is likely to stay valid, and schedule repeated runs if you need a time series.

Which Amazon marketplace and currency does it read?

The US marketplace, amazon.com, with prices requested in USD. That is fixed in the Actor — there is no marketplace or currency parameter, and no other storefront is reachable here. To price the ASINs you collect on other storefronts, feed them into Amazon ASIN Scraper By Country & Marketplace, which fetches each storefront with its own locale.

Does maxCriticalReviewPercent need includeStarHistogram turned on?

No. The histogram is read from the same response either way, and includeStarHistogram only controls whether the five per-star columns appear in your rows. The filter works with the toggle off, and it costs no extra request per product — the review histogram rides on the same call as the price. What does matter is completeness: criticalReviewPercent is null unless all five slices came back, and when the filter is active any row with a null there is dropped rather than passed through.

How do skipNonDeals, onlyBadgedDeals and onlyPrimeExclusiveBadge interact?

They are three independent gates read from three different parts of the response, applied in that order, and a row must pass all of the ones you enabled. skipNonDeals requires an actual deal record (isRealDeal) — the price, discount and deal window. onlyBadgedDeals requires Amazon's merchandising badge (hasDealBadge), which is a separate object: a row can carry a badge without a deal record, or a deal record without a badge. onlyPrimeExclusiveBadge requires a badge whose message contains "With Prime", so it is strictly narrower than onlyBadgedDeals — enabling both is the same as enabling only the Prime one. Turning on any badge or rating gate also switches the run from streaming to buffered mode, in which the whole 500-deal window is read before the first row is written.

Can I collect deals from several categories or marketplaces in one run?

No, and there is nothing to enumerate: Amazon exposes one Today's Deals feed, this Actor reads all of it, and category and productType come back on every row so you can group or split afterwards. For breadth over time rather than over inputs, schedule repeated runs and key your store on asin plus scrapedAt.

Does Amazon Today's Deals Scraper work with Claude, ChatGPT and other AI agent tools?

Yes. It is callable as a standard HTTP endpoint through the Apify API, so LangChain, CrewAI, n8n or a custom tool definition can invoke it and receive typed JSON directly. Rows are flat typed primitives with stable key names — no HTML parsing, no selectors, and no transformation step before a row enters a context window.

How does it compare to other Amazon Today's Deals scrapers?

Checked on the Apify Store on 25 July 2026: piotrv1001/amazon-todays-deals-scraper is the most-used Today's Deals Actor and documents 13 regional Amazon domains through a domain and limit input, returning price, discount and deal-window fields — broader regionally than this Actor, which is US-only. api-empire/amazon-todays-deals-scraper and scraper-engine/amazon-todays-deals-scraper both document a startUrls plus maxItems input and a sample output of the same twelve price-and-deal fields; star ratings, review counts, a review histogram and a deal-badge field are not documented in either listing. Where this Actor differs is review-quality evidence on the deal row itself — rating, reviewCount, the five histogram columns, positiveReviewPercent, criticalReviewPercent, Amazon's badge text and a ratingWeightedDiscount score — plus filters and sort orders built on those fields. If you need deals from a non-US storefront, one of the multi-domain Actors is the better fit.

What happens when Amazon changes its layout or anti-bot system?

The Actor is maintained, and because it reads Amazon's structured promotions feed rather than rendered HTML, a visual redesign of the deals page generally does not affect it. The CSRF token is located with several alternative patterns rather than one, and every response entity is type-checked before it is read, so a change on Amazon's side tends to empty a single field instead of corrupting a row. Your field names and types do not change on your end.

Which fields work best for AI training data and RAG indexing?

For RAG indexing: title is the high-information text field, and pairing it with category, productType and dealBadgeMessage gives an entity with usable merchandising context. For training data: priceToPay, basisPrice, savingsPercentageValue, rating, reviewCount, positiveReviewPercent, criticalReviewPercent and ratingWeightedDiscount are the most structurally consistent fields across records. All values arrive as typed primitives — numbers, strings and booleans, with null where Amazon returned nothing — so no normalization pass is needed before indexing. Keep scrapedAt on every record: deal data is only interpretable against the moment it was captured.

Scraper NameWhat it extracts
Amazon Top Rated Products ScraperSearch results screened by star rating and review count, ranked with a Bayesian weighted rating, with optional ratings breakdown and review insights
Amazon ASIN Scraper By Country & MarketplaceOne row per ASIN and storefront, with cheapestMarketplace, priceRank and priceGapPercent
Amazon Product Scraper By Bestseller & Demand FilterProduct data from category, search or product URLs plus monthly purchases, Best Sellers Rank and an estimated monthly-sales range
Alibaba ScraperB2B product listings with prices, MOQ and supplier trust signals

💬 Your feedback

Found a bug, or need a field that is in Amazon's promotions payload but not in the output? Open an issue on the Actor's Issues tab and it will be looked at. Requests that name the field and include a sample ASIN are the fastest to act on.