Amazon Today's Deals Scraper & Affiliate Link Builder avatar

Amazon Today's Deals Scraper & Affiliate Link Builder

Pricing

from $2.99 / 1,000 results

Go to Apify Store
Amazon Today's Deals Scraper & Affiliate Link Builder

Amazon Today's Deals Scraper & Affiliate Link Builder

Amazon Today's Deals Scraper extracts deal listings, prices, discounts, ratings, reviews, ASINs, images, and product URLs, with affiliate link generation. Ideal for deal tracking, affiliate marketing, price monitoring, product research, and e-commerce intelligence.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

0

Monthly active users

2 days ago

Last modified

Share

Amazon Today's Deals Scraper & Affiliate Link Builder reads Amazon's Today's Deals feed and returns publish-ready rows: asin, title, priceToPay, basisPrice, savingsPercentageValue, dealBadgeLabel, an uncloaked affiliateLink built from your own Associates tag, a rendered postText caption, and every product photo in images[] with hi-res and low-res URLs and pixel dimensions. It's built for deal bloggers, newsletter writers and affiliate publishers who republish Amazon's daily deals without hand-editing each row before it goes out.

⚠️ Amazon caps this feed at 500 deals

Amazon's Today's Deals surface itself reports a fixed totalCount of 500 for this window, and pagination stops there regardless of what you ask for. Set maxDeals above 500 and the Actor collects up to 500 anyway and says so in the run log β€” this is Amazon's ceiling on the feed, not a setting this Actor imposes.

The feed is also US-only: requests are sent to the amazon.com marketplace and priced in USD. There is no domain switch for other regional Amazon sites.

It's an Apify Actor that reads Amazon's public Today's Deals promotions feed and turns each entry into one structured, publish-ready row β€” price, discount, deal window, an affiliate link tagged with your own Associates ID, a rendered post caption, and the product's full photo set. No Amazon account, login or cookie is required; the Actor reads the same public deals page any visitor sees and pulls a CSRF token straight out of its HTML to call Amazon's own deals API.

Key features:

  • Reads Amazon's curated Today's Deals feed directly β€” there's no query or URL to supply, just how many deals you want
  • Returns each deal's identifying and pricing fields: asin, title, priceToPay, basisPrice, savingsAmount, savingsPercentageValue, dealBadgeLabel
  • Builds an uncloaked, Associates-compliant affiliateLink from your own associateTag β€” or leaves it null if you don't supply one
  • Renders a ready-to-post postText line from a template you control, with {title}, {price}, {link} and eight other placeholders
  • Returns the product's complete image set β€” 2 to 19 photos per product, both resolutions, with width and height on every photo
  • Filters deals by title keyword after collection and drops non-deal carousel filler by default
  • Exports as JSON, CSV or Excel, or reads straight from the dataset through the Apify API

Every row falls into four groups: product identity, pricing and deal status, the affiliate link and caption this Actor builds, and the product's photo set.

FieldExample ValueUse Case
asin"B0FW7YTVH3"Amazon's permanent product ID β€” the join key back to any other Amazon dataset
title"Ninja Air Fryer Pro 6-in-1"Product name as shown on the deal
basisPrice129.99Price the discount is measured against
priceToPay89.99The discounted price right now
currency"USD"Currency the two price fields are denominated in
savingsAmount40.0Flat dollar amount saved
savingsPercentageValue31Discount percentage shown on Amazon's own badge
link"https://www.amazon.com/Ninja-Air-Fryer.../dp/B0FW7YTVH3"Amazon's own product URL, exactly as returned, no tag
productUrl"https://www.amazon.com/dp/B0FW7YTVH3"The URL this Actor builds before any tag is added, per linkFormat
affiliateTag"yourstore-20"Your Associates tag, echoed back onto the row
affiliateLink"https://www.amazon.com/dp/B0FW7YTVH3?tag=yourstore-20"The uncloaked, tagged link β€” null when associateTag is empty
postText"Ninja Air Fryer Pro 6-in-1 β€” 31% off, now $89.99 (was $129.99)\nhttps://..."Ready-to-paste caption rendered from postTemplate
image"https://m.media-amazon.com/images/I/81iH+3VYNzL.jpg"Primary product photo URL, flat convenience copy
primaryImage"https://m.media-amazon.com/images/I/81iH+3VYNzL.jpg"Same photo, paired with the two fields below
primaryImageWidth2070Pixel width of the primary photo
primaryImageHeight1725Pixel height of the primary photo
imageCount6Number of photos on this row after maxImagesPerProduct is applied
imageUrls["https://m.media-amazon.com/images/I/81iH+3VYNzL.jpg", "..."]Flat URL list at the resolution(s) set by imageSize, ready for a gallery
images[{ "variant": "MAIN", "hiRes": {...}, "lowRes": {...} }]Full per-photo set β€” every photo, both resolutions, with pixel dimensions
category"Home & Kitchen"Amazon's display category for the product
productType"AIR_FRYER"Amazon's internal product-type code
glProductGroup"kitchen"Amazon's product-group symbol
categoryId"289913"Amazon's numeric category ID
dealBadgeLabel"31% off"Badge text Amazon shows on the deal tile
dealBadgeMessage"Limited time deal"Badge's supporting message
dealId"54d4baef"Amazon's identifier for this specific deal
dealType"BEST_DEAL"Amazon's deal-tier classification
dealState"AVAILABLE"Amazon's current status string for the deal
dealStartTime"2026-07-20T07:00:00Z"When the deal window opened
dealEndTime"2026-08-01T06:59:59Z"When the deal window closes
currencyCode"USD"Currency code as Amazon's pricing entity reported it
isDealtrueWhether this row is a real priced deal, not carousel filler
scrapedAt"2026-07-25T14:03:11Z"UTC timestamp the row was collected

Pricing and deal-status fields

priceToPay, basisPrice, savingsAmount and savingsPercentageValue carry the commercial numbers β€” the ones that decide whether a deal is worth featuring. dealBadgeLabel and dealBadgeMessage are Amazon's own marketing copy for the tile, useful as a ready-made headline. dealState, dealStartTime and dealEndTime tell you whether a deal is still live and when it stops being one, so a scheduled run can drop rows whose window has already closed. dealId and dealType identify the specific promotion and its tier.

Category and product-type fields

category, productType, glProductGroup and categoryId are Amazon's own classification for the product, at increasing levels of internal specificity. Group today's deals by category to see which departments Amazon is discounting hardest on a given day, or filter a run's output by productType when you only publish deals from one niche.

Why not build this yourself?

Amazon's Product Advertising API (PA-API) is the official, sanctioned route into Amazon product and pricing data for Associates β€” but it doesn't expose Today's Deals as a queryable feed. There's no PA-API operation that returns "what's discounted on the deals page right now"; you request data for ASINs you already know, not a curated feed of what's currently on sale.

Building that feed yourself means reverse-engineering Amazon's own Today's Deals surface: the page loads its data from an internal promotions API gated behind a CSRF token you have to pull out of the page HTML, paginated with a startIndex cursor that is the only parameter the endpoint accepts (offset, from and start all return HTTP 400), and mixed with carousel filler rows that carry a title and an ASIN but no price or deal window at all. Every nested field on that API β€” price, images, deal badge, category β€” can come back as a well-formed node holding an error body instead of the data you asked for, so a naive integration looks like it has full field coverage while quietly returning nothing for several fields.

Then there's the Associates-specific part PA-API was never going to do for you anyway: building a link the Operating Agreement actually allows (uncloaked, plain amazon.com, no shortener or redirect hop) and rendering it into a ready caption.

This Actor does all of it: harvests the CSRF token, pages the promotions API on startIndex, drops the carousel filler, unwraps every field defensively, and hands back a row with the tagged link and caption already built. Use PA-API if you already have an Associates account tied to it and need catalog lookups by ASIN. Use this Actor when what you want is today's curated deals, ready to publish.

How to use data extracted from Amazon's Today's Deals

  • πŸ›οΈ Deal bloggers and affiliate publishers set titleKeywords to their site's niche, associateTag to their own Associates ID, and postTemplate to match their house caption format. postText and affiliateLink on every row are then copy-paste ready β€” no editing, no manual link tagging.
  • πŸ“° Newsletter and content agencies run the same Actor once per client, each with its own titleKeywords and associateTag, and schedule a daily or weekly run so each client's deal roundup fills itself from the same feed without cross-contamination between clients' tags.
  • πŸ“Š Market research and pricing analysts pull a full sweep with maxDeals at 500 and group the output by category and productType to see which departments Amazon is discounting hardest on a given day, or track savingsPercentageValue distribution over repeated runs.
  • πŸ€– AI agents and automated pipelines call the Actor as a tool and pass postText, affiliateLink and imageUrls straight into a downstream posting workflow β€” this Actor only builds the text and link; it holds no bot token and posts nothing itself, so the posting step is yours to wire up in n8n, Make or a custom agent.

⬇️ Input

Required per schema: none β€” every field below is optional.

ParameterRequiredTypeDescriptionExample Value
maxDealsNointegerNumber of deals to pull. Minimum 1, maximum 500, default 50. Amazon's deals surface exposes a maximum of 500 deals at a time, so anything above 500 is collected as 500 and noted in the log.100
titleKeywordsNoarray of stringsKeep only deals whose title contains at least one of these words, case-insensitive. Applied after collection, because Amazon's deals API has no text-search parameter. Leave empty to keep everything. Default [].["headphones", "laptop"]
associateTagNostringYour own Amazon Associates tracking ID, e.g. yourstore-20. Appended to each product link as ?tag=… and returned in affiliateLink, uncloaked. Leave empty and affiliateLink comes back null β€” nothing is ever tagged with someone else's ID."yourstore-20"
linkFormatNostring (enum)How the product URL is built before the tag is added. "short" β€” Canonical, https://www.amazon.com/dp/ASIN?tag=…. "full" β€” Full product URL, keeps Amazon's descriptive slug. Default "short"."short"
postTemplateNostringPlain-text template rendered into postText on every row. Placeholders: {title} {asin} {price} {wasPrice} {discount} {savings} {currency} {link} {image} {badge} {category}. {link} uses your affiliate link when a tag is set, otherwise the plain product URL. Use \n for a line break. Clear the field to leave postText null. Default: "{title} β€” {discount}% off, now {price} (was {wasPrice})\n{link}"."{title} β€” {discount}% off\n{link}"
imageSizeNostring (enum)Which URLs go into the flat imageUrls column. "both" β€” hi-res and low-res URLs. "hiRes" β€” hero images (~2000px) only. "lowRes" β€” thumbnails (~500px) only. If a photo is missing the size you asked for, the other size is used rather than returning a blank. Default "both"."hiRes"
maxImagesPerProductNointegerKeep only the first N photos of each product, in Amazon's own order (the MAIN pack shot comes first). Minimum 0, maximum 25, default 0 β€” 0 means every photo Amazon has.5
skipNonDealRowsNobooleanDrops carousel filler rows β€” a title and an ASIN but no price, no discount and no deal window. A measured 500-deal sweep returned 2 of them. These rows are never billed either way; turn this off to see them, flagged by isDeal. Default true.true

Example input

{
"maxDeals": 100,
"titleKeywords": ["kitchen", "air fryer"],
"associateTag": "yourstore-20",
"linkFormat": "short",
"postTemplate": "{title} β€” {discount}% off, now {price} (was {wasPrice})\n{link}",
"imageSize": "both",
"maxImagesPerProduct": 5,
"skipNonDealRows": true
}

Common pitfall: an empty associateTag does not break postText. {link} inside the template falls back to the plain productUrl when no tag is set, so the caption still renders β€” it's only affiliateLink itself that comes back null. If a row's caption looks fine but has an untagged link, check associateTag first.

⬆️ Output

Typed, normalized JSON, one row per deal, pushed live as each page of the feed is collected. The dataset's default view surfaces 27 of the Actor's fields as table columns; six more (glProductGroup, categoryId, dealBadgeMessage, dealType, currencyCode, images) are pushed on every row and available through export or the API, just left out of the default table for readability. Export as JSON, CSV or Excel, or read the dataset through the Apify API.

Example output

{
"asin": "B0FW7YTVH3",
"basisPrice": 129.99,
"priceToPay": 89.99,
"currency": "USD",
"savingsAmount": 40.0,
"savingsPercentageValue": 31,
"title": "Ninja Air Fryer Pro 6-in-1",
"link": "https://www.amazon.com/Ninja-Air-Fryer-Pro-6-in-1/dp/B0FW7YTVH3",
"dealStartTime": "2026-07-20T07:00:00Z",
"dealEndTime": "2026-08-01T06:59:59Z",
"dealState": "AVAILABLE",
"image": "https://m.media-amazon.com/images/I/81iH+3VYNzL.jpg",
"productUrl": "https://www.amazon.com/dp/B0FW7YTVH3",
"affiliateTag": "yourstore-20",
"affiliateLink": "https://www.amazon.com/dp/B0FW7YTVH3?tag=yourstore-20",
"postText": "Ninja Air Fryer Pro 6-in-1 β€” 31% off, now $89.99 (was $129.99)\nhttps://www.amazon.com/dp/B0FW7YTVH3?tag=yourstore-20",
"primaryImage": "https://m.media-amazon.com/images/I/81iH+3VYNzL.jpg",
"primaryImageWidth": 2070,
"primaryImageHeight": 1725,
"imageCount": 6,
"imageUrls": [
"https://m.media-amazon.com/images/I/81iH+3VYNzL.jpg",
"https://m.media-amazon.com/images/I/41s9j3RlkwL.jpg"
],
"images": [
{
"variant": "MAIN",
"hiRes": { "url": "https://m.media-amazon.com/images/I/81iH+3VYNzL.jpg", "width": 2070, "height": 1725 },
"lowRes": { "url": "https://m.media-amazon.com/images/I/41s9j3RlkwL.jpg", "width": 500, "height": 417 }
}
],
"category": "Home & Kitchen",
"productType": "AIR_FRYER",
"glProductGroup": "kitchen",
"categoryId": "289913",
"dealBadgeLabel": "31% off",
"dealBadgeMessage": "Limited time deal",
"dealId": "54d4baef",
"dealType": "BEST_DEAL",
"currencyCode": "USD",
"isDeal": true,
"scrapedAt": "2026-07-25T14:03:11Z"
}

Every one of the 33 keys above is present on every row β€” missing data comes back null (categoryId when Amazon omits it, affiliateLink and postText when you don't configure them), never as a dropped key, so downstream code doesn't need a presence check.

How do you filter and target specific deals?

This Actor has one real content filter and one quality gate, plus a volume control β€” there's no category or price-range parameter, because Amazon's Today's Deals feed doesn't expose one to filter on server-side.

titleKeywords is a client-side filter, not a search. Amazon's deals API has no text-search parameter, so this Actor collects the feed first and then keeps only rows whose title contains at least one of your words, case-insensitive. That means a run always pulls from the same underlying curated feed β€” you're narrowing what reaches your dataset, not asking Amazon for a different result set. If none of today's live deals match your words, you get zero rows and a log line saying so, not an error.

skipNonDealRows is the quality gate. Amazon's deals carousel mixes in promotional slots with a title and an ASIN but no price, discount or deal window β€” not deals at all. Leave the default true and they're dropped before they reach your dataset. Set it false to see every row Amazon returned, flagged by isDeal, useful for auditing what the raw feed actually contains.

maxDeals is the volume control, capped at Amazon's own 500-deal ceiling on this feed.

Three examples:

{ "titleKeywords": ["headphones", "earbuds"], "maxDeals": 50 }

A focused pull for one newsletter section β€” only audio deals, capped small.

{ "maxDeals": 500, "skipNonDealRows": true }

A full daily sweep of every real deal on the feed, for a market-research run.

{ "maxDeals": 30, "skipNonDealRows": false }

An audit run that keeps the carousel filler too, so you can inspect isDeal and see exactly what Amazon mixes into the feed.

How does it work?

The Actor first loads Amazon's public deals page (falling back to the Gold Box page) and pulls a CSRF token straight out of the HTML. That token, plus a fixed USD/amazon.com header set, authorizes calls to Amazon's own internal promotions API β€” the same one the deals page itself calls β€” requesting an expand set that includes title, links, images, category, price and deal-badge sub-entities for each result.

Paging uses startIndex, the only cursor parameter this endpoint accepts. Each response is scanned for new ASINs, deduplicated against everything already collected, and appended until maxDeals is reached or Amazon's own 500-item ceiling is hit. Every nested entity is checked for its declared type before anything is read out of it, because the API can answer an unavailable field with an HTTP 200 and a node shaped like the real thing but carrying an error body instead β€” so a structural quirk degrades one field rather than silently corrupting the row.

Only publicly visible deal data is collected. No login, cookie or Amazon account is used at any point.

ScraperWhat it extracts
Amazon ASIN Scraper & Seller ListingEvery merchant on a listing, buy box winner and hijacker check
Amazon Product Scraper With Keyword Rank TrackingSearch-result rank position, organic vs. sponsored, per keyword
Amazon Brand Research ScraperBrand-level seller mapping and share roll-ups for a keyword market
Alibaba Scraper By Price, MOQ & Supplier FilterB2B listings filtered to a price range and supplier bar
Apartments.com Scraper & Floor Plan UnitsProperty listings with unit-level rent, beds, baths and availability
Booking.com Scraper With Property Contact LeadsHotel listings with an outreach-ready contact lead per property

Integrations

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

Calling it from Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<YOUR_USERNAME>/amazon-todays-deals-scraper-affiliate-link-builder").call(run_input={
"maxDeals": 100,
"titleKeywords": ["kitchen"],
"associateTag": "yourstore-20",
})
for deal in client.dataset(run["defaultDatasetId"]).iterate_items():
print(deal["title"], deal["priceToPay"], deal["affiliateLink"])

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

Export to spreadsheets or CRM

Export the dataset as CSV directly from the Apify Console or API, and map title, priceToPay, basisPrice, savingsPercentageValue, affiliateLink and postText straight into columns for a Google Sheets deal tracker or a content-calendar spreadsheet β€” no transformation step required.

Scraping Amazon's publicly visible Today's Deals page is broadly treated as permissible, since this Actor reads only what any anonymous visitor already sees β€” no login, no cookie, no account.

The records returned β€” prices, discounts, product titles, categories and deal windows β€” are business and product data, not personal data, so the obligations that apply are Amazon's terms of service and database-rights rules around systematic reuse of a compiled feed, not GDPR or a similar personal-data regime.

The affiliate links this Actor builds are also compliance-aware by design: the Amazon Associates Operating Agreement requires links to be uncloaked, and every affiliateLink this Actor returns is a plain amazon.com URL with your tag appended as a query parameter β€” no shortener, no redirect hop. Only your own associateTag, supplied by you at run time, is ever applied.

Consult legal counsel for commercial applications involving bulk storage of personal data.

❓ FAQ

What happens when a deal ends or its window closes?

dealState carries Amazon's own status string for the deal, and dealEndTime gives you the exact close time. Because Amazon rotates the Today's Deals feed continuously, the right way to know whether a deal is still live is to re-run the Actor rather than trust an older dataset β€” a deal that appeared in yesterday's run may simply not be on today's feed at all.

What if no deals match my titleKeywords filter?

You get an empty dataset for that run, with no error. titleKeywords filters after collection, since Amazon's deals API has no text-search parameter β€” if none of today's live deal titles contain your words, zero rows are pushed. Try broader or fewer keywords, or run once with titleKeywords empty to see what's currently on the feed before narrowing.

Can I get the product's full image set along with each deal?

Yes. Every row carries images[] with hi-res and low-res URLs plus pixel width and height for every photo Amazon has on that product β€” 2 to 19 photos per product, not just one hero shot. imageSize controls which resolution(s) populate the flat imageUrls column, and maxImagesPerProduct caps how many photos are included, in Amazon's own order.

How accurate is the price and discount data?

The Actor returns pricing exactly as Amazon's promotions API reports it at request time. Deal prices and windows change during the day as Amazon rotates the feed, so for anything time-sensitive, re-run close to when you plan to publish and check dealEndTime before you post.

How many deals can I get per run?

Up to 500 β€” maxDeals accepts 1 to 500 with a default of 50. Amazon's Today's Deals surface itself is capped at 500 for this window; a request above that is collected as 500 and the run log says so.

No. Rows are only billed on the row_result charged event when isDeal is true. With the default skipNonDealRows on, filler rows never reach the dataset at all. Turn it off to inspect them and they're still written but never charged β€” filter on isDeal to isolate real deals from filler in that dataset.

Yes. It's callable as a standard HTTP endpoint through the Apify API, so LangChain, CrewAI, n8n or a hand-written tool definition can invoke it and receive typed JSON with postText, affiliateLink and imageUrls ready to hand to a downstream posting step.

How does it compare to other Amazon deals scrapers?

Checked on the Apify Store on 25 July 2026: piotrv1001/amazon-todays-deals-scraper documents a compact field set β€” title, prices, savings, deal window, one image β€” plus a domain selector for 13 regional Amazon sites, and no affiliate-link or caption functionality. api-empire/amazon-todays-deals-scraper and scraper-engine/amazon-todays-deals-scraper document a similar deal field set plus ratings and category, sold on flat monthly pricing rather than pay-per-event. None of the three documents building an Associates-compliant uncloaked affiliate link, rendering a ready-to-post caption, or returning a product's full multi-resolution image set β€” the three things this Actor is built around.

Can I use this without an Amazon Associates account or Amazon developer API key?

Yes. No PA-API key, no Amazon developer account, and no Amazon login of any kind is needed to run it. associateTag is optional β€” supply your own Associates ID only if you want tagged links; without one, the Actor still returns every deal row, just with affiliateLink as null.

Conclusion

Amazon Today's Deals Scraper & Affiliate Link Builder turns Amazon's Today's Deals feed into rows you can publish without editing them by hand β€” priced, discounted, tagged with your own Associates link, captioned, and photographed. It's built for deal bloggers, newsletter operators and affiliate publishers who need today's discounts on a schedule, not a one-off scrape. The differentiator is the compliance-aware link and caption building most Amazon deal scrapers leave to you. Start it from the Apify Console or call it through the Apify API with your own associateTag and postTemplate to see it on your next run.

πŸ’¬ Your feedback

Found a bug, or need a field that's in Amazon's promotions API but not yet in the output? Open an issue on the Actor's Issues tab β€” reports that include the input JSON and an affected ASIN are the fastest to reproduce and fix.