Amazon ASIN Scraper & Seller Listing avatar

Amazon ASIN Scraper & Seller Listing

Pricing

Pay per usage

Go to Apify Store
Amazon ASIN Scraper & Seller Listing

Amazon ASIN Scraper & Seller Listing

Amazon ASIN Scraper quickly extracts product data using ASINs. Get titles, prices, ratings, reviews, variations, images, features, seller info, and stock details. Ideal for research, monitoring, and product analytics with clean, structured JSON output.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

0

Monthly active users

3 days ago

Last modified

Share

Amazon ASIN Scraper — Buy Box, Seller Offers and Hijacker Data

Amazon ASIN Scraper pulls the full product record for a list of ASINs plus every merchant competing for the buy box, read live from Amazon's All-Offers-Display panel: seller ID, feedback percentage, FBA status, ships-from and price for each offer, the isolated buy-box winner, the price gap to the cheapest merchant, and — when you supply your own allow-list — exactly which sellers on the listing are not authorized. Built for brand-protection teams, repricers and e-commerce agencies who need seller-level detail an ordinary product scraper does not return. Works logged out, no Amazon account required.

What is Amazon ASIN Scraper?

Amazon ASIN Scraper is an Apify Actor that takes a list of ASINs or product URLs and returns, per ASIN, the standard product record (title, price, rating, images, variants, bestseller rank) plus an offers[] array built by paging through Amazon's offer panel. It runs entirely logged out — no Amazon account, cookie or seller credential is used.

It does not return individual customer review text. Amazon serves no review widget on the product page or any of its review surfaces when the request is unauthenticated, so reviewsCount and starsBreakdown are returned but individual review bodies are not — that field was removed from the output entirely rather than shipped as a column that is always empty.

  • Give it ASINs directly, or paste full /dp/ or /gp/product/ URLs — both are accepted and reduced to the ASIN automatically
  • Every competing offer comes back with the seller's ID, name, feedback percentage, rating count, FBA flag and ships-from location
  • The buy-box winner is isolated from the rest of the offer list, with the price gap to the cheapest competing offer computed for you
  • Supply your own list of authorized seller IDs or storefront names and every other seller on the listing is flagged in unauthorizedSellers[]
  • Filter the offer list by condition (new / used / all), set the delivery postcode and language, and pick a storefront domain and exit country to match
  • Export as JSON, CSV or Excel, or read the dataset straight through the Apify API

What Amazon offer data is publicly available to scrape?

Everything this Actor returns is visible to any anonymous visitor who opens the listing and expands the offer panel. What sits behind Amazon's own Seller Central or Advertising accounts is seller contact information and account-level analytics, not the offer panel itself.

Data categoryPublicly available (what this Actor reads)Behind a Seller Central / Advertising account
Product title, price, images, variants, bestseller rank✅ Public
Star rating and the rating histogram✅ Public
Every offer on the panel: seller ID, seller name, feedback %, FBA flag, ships-from, price✅ Public
Buy-box winner and the price gap to the lowest offer✅ Public (computed from the public panel)
A+ content, brand story, product comparison modules✅ Public
Individual customer review text❌ Not served logged out on any surfaceOnly via the review pages themselves, when rendered
Seller email, phone, VAT/registration numberAmazon Seller Central account
Sales history, advertising spend, account healthAmazon Seller Central / Ads account

Amazon ASIN Scraper only returns what the offer panel already shows a logged-out visitor. Nothing behind a seller login.

What data can I extract with Amazon ASIN Scraper?

Every ASIN is one dataset row carrying the full product record. Fields group into product identity, price and delivery, ratings, media, variants, merchant/bestseller context, page health, and — the reason this build exists — the offer list and buy-box intelligence.

Product identity and page context

FieldDescription
asinThe ASIN as supplied (or extracted from a pasted URL)
originalAsinSame value as asin, kept for parity with the base scraper's output shape
titleProduct title
url/gp/product/{asin} listing URL
unNormalizedProductUrl/dp/{asin} URL, with ?language= appended when language is set
inputThe /dp/{asin} URL that was actually requested
breadCrumbsCategory breadcrumb trail, joined with >
positionSequential counter, incremented as each ASIN finishes processing (reflects completion order under concurrency, not necessarily input order)

Price, availability and delivery

FieldDescription
price{value, currency} — the listing's own current price, null if the page has no price of its own
listPrice{value, currency} — the struck-through reference price, null if none or identical to price
priceRangeText price range shown on multi-variant listings
shippingPrice{value, currency} — shipping cost shown on the product page itself
inStockBoolean stock flag
inStockTextRaw availability text the flag was read from
conditionItem condition of the primary listing (e.g. New)
deliveryPrimary delivery promise text
fastestDeliveryFastest delivery promise text, when a faster option is shown
returnPolicyReturn policy text
supportProduct support message text

Ratings and questions

FieldDescription
starsAverage star rating
starsBreakdown{"5star": 0.57, "4star": 0.29, ...} — share of ratings per star bucket, read from the histogram
reviewsCountTotal rating count
answeredQuestionsCount from the "Ask a question" link, when present
hasReviewstrue when reviewsCount is a positive number
reviewsLink/product-reviews/{asin} URL

Brand and media

FieldDescription
brandBrand or storefront name
authorAuthor name, on books
thumbnailImagePrimary image URL
galleryThumbnailsThumbnail image URLs
highResolutionImagesFull-resolution image URLs
videosCountCount of product videos detected
aPlusContent{title, rawText, rawImages, rawVideos, modules} — A+ module content, null when absent
brandStory{title, image, items} — brand-story carousel content, null when absent

aPlusContent, brandStory, galleryThumbnails and highResolutionImages are all forced empty/null when includeRichMedia is false — everything else in the record is unaffected.

Description, specs and variants

FieldDescription
descriptionProduct description text
bookDescriptionBook/editorial description, only populated when description is empty
featuresBullet-point feature list
attributes[{key, value}] — the technical-details table
productOverview[{key, value}] — the "Product overview" mini-table, when present
importantInformation"Important information" section text
sustainabilityFeatures{summary, certifications}, null when the listing carries no Climate Pledge Friendly content
variantAsinsASINs of sibling variants (size/color/style)
variantDetails[{name, thumbnail, images, asin, price}] per variant
variantAttributes[{key, value}] — the twister's own selected attribute labels
productComparison{products: [{asin, title, thumbnail, price, stars, reviewsCount}]} — Amazon's own comparison table, when shown

Merchant page context, bestsellers and badges

FieldDescription
seller{name, id, url, reviewsCount, averageRating} for the page's byline merchant — null when nothing was found (not an all-null placeholder)
shipsFrom"Ships from" text read from the tabular buy box
visitStoreLinkAbsolute URL to the seller's storefront
bestsellerRanks[{rank, category, url, categoryNodeId}] — every rank shown, not just the top one
topBestsellerRankbestsellerRanks[0].rank, flattened for the dataset table
topBestsellerCategorybestsellerRanks[0].category, flattened for the dataset table
isAmazonChoiceBoolean Amazon's Choice badge flag
amazonChoiceTextBadge text, e.g. Amazon's Choice for "wireless earbuds"
monthlyPurchaseVolumeSocial-proof text, e.g. "500+ bought in past month"
locationTextDelivery location shown in the page's nav bar
loadedCountryCodeTwo-letter delivery country the page actually rendered for
aiReviewsSummary{text, keywords} — Amazon's AI-generated review summary and per-aspect sentiment, when the widget is present

Page health

FieldDescription
pageHealthyfalse when the page rendered in a degraded state (e.g. an unqualified buy box, or the detail sections never loaded)
pageHealthNoteReason code: unqualified_buy_box_no_price, unqualified_buy_box, or detail_sections_missing

Offers, buy box and the hijacker check

This is the group that makes the record a competitive-offer monitor rather than a plain product scraper, and every field in it comes from the same offer panel, paged and de-duplicated.

FieldDescription
offersArray of offer objects — see the structure below
offerCountOffers actually returned in this row (≤ maxOffersPerAsin)
totalOfferCountAmazon's own reported offer count for the listing, read once from the unfiltered first page — independent of maxOffersPerAsin and offerCondition
offersStatusok, not_listed (HTTP 404 — no offer panel on this storefront), failed, parse_failed, or skipped (when maxOffersPerAsin is 0)
buyBoxSeller{id, name, url, positivePercent, ratingCount, isAmazon, isAmazonFulfilled, shipsFrom}null when the listing has no featured offer
buyBoxSellerName, buyBoxSellerId, buyBoxPositivePercent, buyBoxIsFba, buyBoxIsAmazonFlat mirrors of buyBoxSeller, present because the Apify dataset table cannot address nested keys as columns
buyBoxPrice{value, currency} — the buy-box offer's price
buyBoxIsAuthorizedWhether the buy-box seller is on your authorizedSellers list — null when no list was supplied
lowestOfferPrice{value, currency} — the cheapest priced offer among the ones returned
lowestOfferSellerName of the seller holding the lowest offer
priceGapToLowestbuyBoxPrice.value − lowestOfferPrice.value, rounded to 2 decimals — null if either side is missing
priceGapToLowestPercentThe same gap as a percentage of the buy-box price
unauthorizedSellers[{sellerId, sellerName, sellerPositivePercent, price, condition, isBuyBoxWinner}] — every offer that failed the allow-list check
unauthorizedSellerCountunauthorizedSellers.lengthnull when no allow-list was supplied
unauthorizedSellerNamesComma-joined names/IDs from unauthorizedSellers, for a single-column view
hasUnauthorizedSellertrue/false once an allow-list is supplied, null when it is not — false is never returned as a fabricated all-clear

Each entry in offers[]:

FieldDescription
sellerIdMerchant ID, parsed from the seller= query parameter on the seller link
sellerNameSeller storefront name
sellerUrlAbsolute URL to the seller's storefront
sellerPositivePercentFeedback percentage, e.g. 100
sellerRatingSeller star rating out of 5
sellerRatingCountNumber of seller ratings behind that score
isAmazonSellertrue when the offer is sold by Amazon itself
isAmazonFulfilledFBA flag, parsed from the offer's isAmazonFulfilled= marker; inferred true when shipsFrom starts with "Amazon" and the marker is absent
shipsFromShips-from location text
conditionThis offer's condition heading, e.g. Used - Very Good
price{value, currency}
shippingPrice{value, currency}, null when shipping is free or not shown
isPrimeBoolean Prime-eligibility flag
isBuyBoxWinnertrue for the single pinned/featured offer, false for every other row

Locale, condition and page-health fields

Targeting on this Actor happens mostly on the way in, not by filtering an output list, because each run is scoped to the ASINs you supply rather than a search result. offerCondition narrows offers[] to new or used before it is written — used/renewed/collectible/refurbished are all treated as one grade. amazonDomain, proxyCountry, language and zipCode together decide which storefront, currency and delivery promises the page renders with. On the output side, pageHealthy and offersStatus are the two fields worth filtering a run on before trusting the rest of a row — a false/non-ok row means the page rendered in a degraded state or the offer panel could not be reached, not that the listing genuinely has no data.

🤖 Add-on: Need more Amazon data?

Amazon Brand Research Scraper, Amazon Product Scraper With Keyword Rank Tracking and Amazon Today's Deals Scraper & Affiliate Link Builder cover the catalogue, ranking and deals side of Amazon from the same account — useful alongside this Actor when the job extends past a fixed ASIN list.

Why not build an Amazon buy-box monitor yourself?

Amazon's official Product Advertising API (PA-API) is built for affiliates, not competitive monitoring: it requires an active Associates account with qualifying sales activity to keep working, and it does not expose the multi-seller offer list this Actor returns — no per-seller feedback percentage, no FBA flag, no buy-box-versus-lowest-offer gap. If your use case is generating affiliate links from a catalogue you already have Associates access to, PA-API is the supported route. If your use case is watching who else is selling on your listing, PA-API has no endpoint for that at all, which is the actual reason a scraper exists for this job rather than a documentation gap.

Building the offer side yourself means reverse-engineering the panel Amazon actually serves. The legacy /gp/offer-listing/{ASIN} path now redirects, and the AJAX endpoint documented by older scrapers 404s — the live surface is a different auto-load fragment, requested with XHR headers and a /dp/{ASIN} referer on the same session cookies as the product page, or offer prices come back priced in the exit IP's currency instead of the storefront's. Inside that panel, the visible price for each offer is not readable from .a-offscreen any more — it now renders blank, and the real digits live in aria-hidden spans split across four separate elements that have to be reassembled. And the panel is paginated 10 offers at a time, so a listing with 80 competing merchants takes eight separate requests to read in full.

Use the official PA-API for affiliate link generation against your own Associates account. Use Amazon ASIN Scraper when you need to see the competing offers on a listing at all.

How to use Amazon ASIN Scraper

Amazon ASIN Scraper runs on Apify. Start it from the Apify Console or call it through the Apify API.

  1. Open Amazon ASIN Scraper on Apify and click Try for free
  2. Paste one or more ASINs, or full /dp/ or /gp/product/ URLs, into ASINs or product URLs — this is the only required input
  3. Set Storefront domain and Exit country to match — a mismatched pair gets served a robot-check page instead of the real listing
  4. Optionally paste your known-good merchant IDs or storefront names into Authorized seller IDs or names to turn on the hijacker check
  5. Click Start, then export the dataset as JSON, CSV or Excel, or read it through the Apify API

How to scale to bulk ASIN monitoring

asins is a list — paste as many ASINs or product URLs as you need, one per line. Each is fetched independently under its own concurrency slot, so a run of 200 ASINs does not wait on any single slow listing. Set maxOffersPerAsin to 0 on a run where you only need the product record (title, price, rating) and not the competitive offer list — that halves the requests per ASIN, since the offers request is skipped entirely.

What can you do with Amazon buy-box and offer data?

  • 🚨 A brand-protection manager monitoring a catalogue of ASINs supplies the brand's authorized reseller IDs in authorizedSellers, schedules a daily run, and filters the dataset for hasUnauthorizedSeller: true to get same-day alerts on new hijackers.
  • 🏢 An e-commerce agency running buy-box audits for several clients keeps one input file of ASINs per client, sets offerCondition: "new", and reports buyBoxSellerName and priceGapToLowestPercent back as a weekly competitive snapshot.
  • 📊 A pricing or repricing team pulls offers[] for their own ASINs to see the full competitive price ladder — not just the featured price — and reacts before a competitor's undercut reaches the buy box.
  • 🤖 An AI engineer building a marketplace-monitoring agent indexes offers, buyBoxSeller and unauthorizedSellers per ASIN so an agent tool can answer "who is undercutting us on this listing right now" against live data instead of a stale export.

How does Amazon ASIN Scraper handle blocking?

Amazon's block page is a 200 status carrying an HTML shell rather than the real listing, so the Actor checks the response body against known markers (captcha, robot check, /errors/validateCaptcha, and the automated-access warning text) rather than trusting the status code alone. A healthy /dp/ page runs 1–2.3 MB; anything under roughly 50 KB is treated as a block shell and retried with a fresh proxy session rather than parsed and returned as a thin, broken record.

When proxyCountry is set to US, each response is additionally checked for US delivery markers (deliveryCountry, the nav-bar location text, the USD currency flag) before it is accepted, with extra retries budgeted specifically for that verification. useCaptchaSolver — labelled Hardened retry mode in the input — does not call or bill any third-party CAPTCHA service; toggling it on raises the retry ceiling from 3 attempts to 6 on storefronts that keep blocking. Every retry backs off exponentially with jitter, and each retry after the first rotates to a fresh proxy session rather than reusing the one that just got blocked.

⚠️ maxOffersPerAsin accepts values up to 300 in the input schema, but the offer panel is paged 10 offers at a time and paging is capped at 20 pages internally — so the practical ceiling on any single ASIN is 200 offers, even if you request more. totalOfferCount always reports Amazon's real total regardless of this cap, so you can tell whether you saw the full list.

⬇️ Input

ParameterRequiredTypeDescriptionExample Value
asins✅ YesarrayOne ASIN per line, e.g. B07GBZ4Q68. Full /dp/ and /gp/product/ URLs are also accepted and reduced to their ASIN automatically. Every ASIN costs one product request plus one offers request.["B07GBZ4Q68", "B0CJ4V4TRP"]
amazonDomainNostringThe marketplace to read the listing and its offers from. Default "amazon.com"."amazon.co.uk"
maxOffersPerAsinNointegerUpper bound on offers returned per listing. The pinned buy-box offer is always the first entry. Set 0 to skip the offers request entirely and run as a plain product scraper. Minimum 0, maximum 300, default 30.50
offerConditionNostringRestrict offers[] by item condition, read from each offer's heading. Enum: "all" (All conditions), "new" (New only), "used" (Used / renewed / collectible only). Default "all"."new"
authorizedSellersNoarrayMerchant IDs (the seller= value in an Amazon seller link) and/or exact storefront names. Matching is case-insensitive and either field can match. Leave empty and hasUnauthorizedSeller is returned as null.["A1J8OBDYLWZ573", "Essentialsmerchant"]
treatAmazonAsAuthorizedNobooleanWhen the allow-list is in use, decides whether offers sold directly by Amazon are exempt from the unauthorized check. Only has an effect when authorizedSellers is non-empty. Default true.true
languageNostringSent as ?language=… and in Accept-Language. Leave on auto to take the storefront's own default. Enum: "" (Auto), "en", "en_US", "en_GB", "de", "fr", "es", "it", "nl", "pl", "pt", "pt_BR", "sv", "tr", "cs", "da", "ja", "zh_CN", "zh_TW", "hi". Default "en"."de"
zipCodeNostringOptional destination postcode (10001, SW1A 1AA). The delivery cookie is primed before scraping so offer prices and delivery promises reflect that address. Leave blank to use whatever location the exit IP resolves to. Default ""."10001"
proxyCountryNostringResidential exit location for every request. Match this to your storefront — a US exit against a non-US Amazon domain is served a robot-check shell. Enum: "AUTO_SELECT_PROXY_COUNTRY", "US", "GB", "DE", "FR", "ES", "IT", "CA", "AU", "JP", "IN", "BR", "MX", "NL", "PL", "TR", "SE", "AE". Default "AUTO_SELECT_PROXY_COUNTRY"."US"
includeRichMediaNobooleanA+ modules, brand-story cards and the full image gallery dominate the size of each record; a seller-monitoring run rarely reads them. Turn off for a much smaller dataset — core product fields, ranks, ratings and all offer fields are unaffected. Default true.false
useCaptchaSolverNobooleanHardened retry mode. No third-party CAPTCHA solver is used or billed for. On: raises the retry ceiling from 3 to 6, with a fresh proxy session on every retry. Slower, worth it only on storefronts that block hard. Default false.false
proxyConfigurationNoobjectFull override: Apify proxy groups (Residential recommended for Amazon) or your own proxy URLs. Most runs should leave this untouched.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}

Common pitfall: proxyCountry and amazonDomain have to agree. A US residential exit against amazon.co.uk, or vice versa, gets served a robot-check shell rather than the real page — this is the single most common cause of a run coming back with pageHealthy: false on every row.

Example input

{
"asins": ["B07GBZ4Q68", "B0CJ4V4TRP", "B07KQWR72Z"],
"amazonDomain": "amazon.com",
"maxOffersPerAsin": 30,
"offerCondition": "new",
"authorizedSellers": ["A1J8OBDYLWZ573", "Essentialsmerchant"],
"treatAmazonAsAuthorized": true,
"proxyCountry": "US",
"includeRichMedia": false
}

⬆️ Output

Typed, normalized JSON — one row per ASIN, written to the dataset as each one finishes. The keyed-by-ASIN result is also stored under OUTPUT in the run's default key-value store. Export as JSON, CSV or Excel, or read the dataset through the Apify API.

Only successful, non-empty rows are charged under the row_result event. A row is pushed but not charged when the fetch failed, when the HTML could not be parsed, or when the result is empty (no title, no price and no offers) — each of those carries an error field (fetch_failed, parse_error: …, or empty_result) so the failure is visible in the dataset rather than silently dropped. Filter clean, billed rows with item.get("error") is None.

Example output

{
"asin": "1250301696",
"originalAsin": "1250301696",
"title": "The Silent Patient",
"url": "https://www.amazon.com/gp/product/1250301696?smid=",
"unNormalizedProductUrl": "https://www.amazon.com/dp/1250301696",
"input": "https://www.amazon.com/dp/1250301696",
"breadCrumbs": "Books > Literature & Fiction > Genre Fiction",
"position": 1,
"price": { "value": 28.99, "currency": "$" },
"listPrice": null,
"priceRange": null,
"shippingPrice": null,
"inStock": true,
"inStockText": "In Stock",
"condition": "New",
"delivery": "FREE delivery",
"fastestDelivery": "Or fastest delivery Tomorrow",
"returnPolicy": "Returnable until Jan 31, 2027",
"support": null,
"stars": 4.5,
"starsBreakdown": { "5star": 0.57, "4star": 0.29, "3star": 0.11, "2star": 0.02, "1star": 0.01 },
"reviewsCount": 84213,
"answeredQuestions": null,
"hasReviews": true,
"reviewsLink": "https://www.amazon.com/product-reviews/1250301696",
"brand": "Celadon Books",
"author": "Alex Michaelides",
"thumbnailImage": "https://m.media-amazon.com/images/I/81JAftTeHzL._SY425_.jpg",
"galleryThumbnails": ["https://m.media-amazon.com/images/I/81JAftTeHzL._SL75_.jpg"],
"highResolutionImages": ["https://m.media-amazon.com/images/I/81JAftTeHzL._SL1500_.jpg"],
"videosCount": 0,
"aPlusContent": null,
"brandStory": null,
"description": "The Silent Patient is a shocking psychological thriller...",
"bookDescription": null,
"features": ["Instant #1 New York Times bestseller", "A Read With Jenna Book Club pick"],
"attributes": [{ "key": "Publisher", "value": "Celadon Books" }],
"productOverview": [],
"importantInformation": null,
"sustainabilityFeatures": null,
"variantAsins": [],
"variantDetails": [],
"variantAttributes": [],
"productComparison": null,
"seller": { "name": "Essentialsmerchant", "id": "AR6XG8XBD2ANX", "url": "https://www.amazon.com/sp?seller=AR6XG8XBD2ANX", "reviewsCount": 403, "averageRating": 5.0 },
"shipsFrom": "Amazon.com",
"visitStoreLink": "https://www.amazon.com/sp?seller=AR6XG8XBD2ANX",
"bestsellerRanks": [
{ "rank": 6, "category": "Murder Thrillers", "categoryNodeId": "9536065011", "url": "https://www.amazon.com/gp/bestsellers/books/9536065011/" }
],
"topBestsellerRank": 6,
"topBestsellerCategory": "Murder Thrillers",
"isAmazonChoice": false,
"amazonChoiceText": null,
"monthlyPurchaseVolume": "1K+ bought in past month",
"locationText": "Deliver to New York 10001",
"loadedCountryCode": "US",
"aiReviewsSummary": null,
"pageHealthy": true,
"pageHealthNote": null,
"offers": [
{
"sellerId": "AR6XG8XBD2ANX",
"sellerName": "Essentialsmerchant",
"sellerUrl": "https://www.amazon.com/sp?seller=AR6XG8XBD2ANX",
"sellerPositivePercent": 100,
"sellerRating": 5.0,
"sellerRatingCount": 403,
"isAmazonSeller": false,
"isAmazonFulfilled": true,
"shipsFrom": "Amazon.com",
"condition": "New",
"price": { "value": 28.99, "currency": "$" },
"shippingPrice": null,
"isPrime": true,
"isBuyBoxWinner": true
},
{
"sellerId": "A2QVWT0ESGUXPH",
"sellerName": "ThriftBooks-Phoenix",
"sellerUrl": "https://www.amazon.com/sp?seller=A2QVWT0ESGUXPH",
"sellerPositivePercent": 88,
"sellerRating": 4.5,
"sellerRatingCount": 420813,
"isAmazonSeller": false,
"isAmazonFulfilled": false,
"shipsFrom": "ThriftBooks-Phoenix",
"condition": "Used - Very Good",
"price": { "value": 6.49, "currency": "$" },
"shippingPrice": { "value": 0.0, "currency": "$" },
"isPrime": false,
"isBuyBoxWinner": false
}
],
"offerCount": 2,
"totalOfferCount": 81,
"offersStatus": "ok",
"buyBoxSellerName": "Essentialsmerchant",
"buyBoxSellerId": "AR6XG8XBD2ANX",
"buyBoxPositivePercent": 100,
"buyBoxIsFba": true,
"buyBoxIsAmazon": false,
"buyBoxSeller": {
"id": "AR6XG8XBD2ANX",
"name": "Essentialsmerchant",
"url": "https://www.amazon.com/sp?seller=AR6XG8XBD2ANX",
"positivePercent": 100,
"ratingCount": 403,
"isAmazon": false,
"isAmazonFulfilled": true,
"shipsFrom": "Amazon.com"
},
"buyBoxPrice": { "value": 28.99, "currency": "$" },
"buyBoxIsAuthorized": true,
"lowestOfferPrice": { "value": 6.49, "currency": "$" },
"lowestOfferSeller": "ThriftBooks-Phoenix",
"priceGapToLowest": 22.5,
"priceGapToLowestPercent": 77.61,
"unauthorizedSellers": [
{
"sellerId": "A2QVWT0ESGUXPH",
"sellerName": "ThriftBooks-Phoenix",
"sellerPositivePercent": 88,
"price": { "value": 6.49, "currency": "$" },
"condition": "Used - Very Good",
"isBuyBoxWinner": false
}
],
"unauthorizedSellerCount": 1,
"unauthorizedSellerNames": "ThriftBooks-Phoenix",
"hasUnauthorizedSeller": true
}

How do you filter and target specific listings?

Because each run is scoped to a fixed ASIN list rather than a search, targeting happens through the input parameters rather than a post-run filter — get these four right and the rest of the record follows.

  1. Storefront and exit country must match. Set amazonDomain to the marketplace you actually want and proxyCountry to the matching residential exit. A mismatched pair is the single most common cause of a run coming back with pageHealthy: false on every row, because the exit IP gets served a robot-check shell instead of the real listing.
  2. Condition scoping. offerCondition: "new" is the right setting for hijacker and MAP monitoring — used, renewed and collectible listings are a separate problem with their own sellers. buyBoxSeller and the buy-box columns are always derived from the unfiltered offer set regardless of this setting, so a used filter never silently nulls the buy-box fields; only offers[], lowestOfferPrice and the price-gap columns are computed against the filtered subset.
  3. The allow-list decides what "unauthorized" means. authorizedSellers accepts merchant IDs and storefront names interchangeably, matched case-insensitively. treatAmazonAsAuthorized only matters once that list is non-empty — leave it on for retail-vendor listings where Amazon itself is expected to sell, turn it off if Amazon Retail appearing on your listing is itself the alert you want.
  4. Volume control. maxOffersPerAsin caps how deep the pagination goes (10 offers per request), and 0 skips the offers request entirely for a plain-product run. There is no volume control on the ASIN list itself — every ASIN you supply is processed.
{ "asins": ["B0CJ4V4TRP"], "amazonDomain": "amazon.de", "proxyCountry": "DE", "language": "de" }
{ "asins": ["B0CJ4V4TRP"], "offerCondition": "new", "authorizedSellers": ["A1J8OBDYLWZ573", "MyBrand Official"], "treatAmazonAsAuthorized": false }
{ "asins": ["B0CJ4V4TRP"], "maxOffersPerAsin": 0 }

How does it work?

Amazon ASIN Scraper requests /dp/{asin} for the product record, then walks the offer panel's own auto-load endpoint page by page — 10 offers per page — until it reaches maxOffersPerAsin or runs out of pages. The buy-box winner is captured from the unfiltered first page before offerCondition is applied, so a condition filter can never silently drop the buy-box columns even when it excludes the winning offer itself.

A response is only accepted as the real page once it clears three checks: no known block markers in the body, a byte size consistent with a genuine /dp/ render (not a ~4 KB robot-check shell returned with a 200 status), and — when proxyCountry is US — delivery-country markers confirming the page actually rendered for a US address. A degraded-but-technically-200 page (Amazon's "unqualified buy box" variant, or a page whose detail sections never loaded) is still returned, but flagged via pageHealthy and pageHealthNote rather than silently reported as a normal, priceless listing.

Only publicly visible offer-panel data is collected. No account, cookie or seller session is used.

Integrations

Amazon ASIN Scraper is an Apify Actor, so it works with anything that can call the Apify API or consume a dataset.

Calling Amazon ASIN Scraper from Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<YOUR_USERNAME>/amazon-asin-scraper-buy-box-sellers").call(run_input={
"asins": ["B07GBZ4Q68", "B0CJ4V4TRP"],
"offerCondition": "new",
"authorizedSellers": ["A1J8OBDYLWZ573"],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("error") is None and item.get("hasUnauthorizedSeller"):
print(item["asin"], item["buyBoxSellerName"], item["unauthorizedSellerNames"])

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 Console or via the API, and map asin, title, buyBoxSellerName, priceGapToLowest, hasUnauthorizedSeller and unauthorizedSellerNames straight into a Google Sheets or CRM column — those five are already flat values, not nested objects, so no transform step is needed before import.

Scraping publicly listed product and offer data is broadly treated as permissible where the data is accessible without authentication, and Amazon ASIN Scraper collects only what the offer panel already shows a logged-out visitor.

A listing's price, seller ID, storefront name and feedback percentage are commercial marketplace records, not personal data about a private individual — so the personal-data regimes that govern profile or reviewer scraping do not attach to this output the way they would to a social-profile scraper. What does apply is contractual and database-related: Amazon's terms of service, and any local database or unfair-competition rules covering systematic reuse of a compiled listing.

Consult legal counsel for commercial applications involving bulk storage or republication of extracted seller and pricing data.

❓ Frequently asked questions

What happens if an ASIN has zero third-party offers, or no buy box winner?

offers[] comes back with whatever the panel actually showed — for a listing with only Amazon's own offer, that is one entry. When there is no featured/pinned offer at all, Amazon renders "No featured offers available" and buyBoxSeller is returned as null rather than an arbitrary offer being promoted into that slot. priceGapToLowest and the percentage gap are null whenever either side of the comparison is missing.

Can I get the full seller offer list along with the product record?

Yes, by default. maxOffersPerAsin defaults to 30 and every field returned is documented in the Output section above — seller ID, feedback percentage, FBA flag, ships-from, condition and price on every offer. Set maxOffersPerAsin: 0 if you only want the product record and none of the offer requests.

How accurate is the seller and price data?

The Actor returns exactly what the offer panel shows at request time — no field is filled from a different product's page or a cached value. A dedicated fix in this build stops a documented bug where a listing with no price of its own returned a different ASIN's price pulled from a "customers also viewed" carousel; price now returns null in that case instead. Accuracy beyond that depends on how current Amazon's own render is, which changes constantly on a competitive listing.

How many offers and ASINs can I get per run?

Every ASIN costs one product request plus one offers request (unless maxOffersPerAsin is 0, which skips the offers request). Per ASIN, maxOffersPerAsin accepts up to 300, but the offer panel is paged 10 at a time and paging is capped at 20 pages internally, so the practical ceiling is 200 offers even if you request more — totalOfferCount always reports Amazon's real total so you know whether you saw everything. There is no cap on how many ASINs you can list in one run.

How does the authorized-sellers hijacker check work?

Supply merchant IDs and/or exact storefront names in authorizedSellers — matching is case-insensitive and either field can match. Every offer that is not on that list, and is not Amazon itself when treatAmazonAsAuthorized is on, lands in unauthorizedSellers[], with hasUnauthorizedSeller and buyBoxIsAuthorized as ready-made alert columns. Leave authorizedSellers empty and both of those come back null, not false — with nothing to compare against, false would read as a false all-clear.

Are failed or empty rows billed?

No. Fetch failures, parse errors, and rows with no title, price or offers are still pushed to the dataset — each carrying an error field so you can see what happened — but they are not charged under the row_result event. Filter for clean, billed rows with item.get("error") is None.

Does Amazon ASIN Scraper work with Claude, ChatGPT and AI agent frameworks?

Yes. It is callable as a standard HTTP endpoint through the Apify API, so any agent framework that can make a request — LangChain, CrewAI, n8n, a hand-written tool definition — can invoke it and receive typed JSON back with no parsing step.

How does Amazon ASIN Scraper compare to other Amazon buy-box and offer scrapers?

Checked on the Apify Store on 2026-07-26: xmiso_scrapers/amazon-sellers-leads-scraper-from-asin-list targets Amazon France and Germany specifically and documents business-registration fields (VAT number, phone, email, registered business name) that this Actor does not attempt to collect, but its README states a 100-ASIN cap per run. clearpath/amazon-buybox-api documents cross-run change tracking — priceChanged, buyboxWinnerChanged, isNewSeller — by diffing against a saved snapshot on scheduled runs, which this Actor does not do; it covers 8 domains at a flat $29/month rental. santhej/amazon-product-scraper covers search, product-detail and review modes but documents no per-offer seller list or buy-box comparison at all. What this Actor documents that the others do not: the allow-list hijacker check (authorizedSellersunauthorizedSellers[]), the buy-box-to-lowest-offer price gap computed against the unfiltered offer set, and pay-per-event pricing where failed or empty rows are pushed but not charged.

Can I use Amazon ASIN Scraper without an Amazon seller account or API key?

Yes. No Amazon account, cookie, seller credential or API key is required — the Actor reads only what a logged-out visitor sees. The one credential you need is your Apify token.

Does Amazon ASIN Scraper scrape customer review text?

No. Amazon serves no review widget on any surface when the request is logged out, so individual review bodies are not returned — the function that produced them was removed rather than shipped as a column that is always empty. reviewsCount, stars and the starsBreakdown histogram are returned; review text is not.

Scraper NameWhat it extracts
Amazon Brand Research ScraperAmazon catalogue and brand-level research data
Amazon Product Scraper With Keyword Rank TrackingProduct records with keyword-position tracking
Amazon Today's Deals Scraper & Affiliate Link BuilderToday's Deals listings with affiliate link generation

Conclusion

Amazon ASIN Scraper turns a list of ASINs into a competitive-offer feed: the full product record, every seller on the listing with their feedback score and FBA status, the isolated buy-box winner, the price gap to the cheapest merchant, and — for anyone running brand protection — an allow-list check that names exactly which sellers do not belong on the listing. Start a run from the Apify Console or call it through the Apify API with apify_client.

💬 Your feedback

Found a bug, or need an offer-panel field that Amazon renders but this Actor doesn't yet capture? Open an issue on the Actor's Issues tab. Reports that include the exact ASIN and storefront domain are the fastest to reproduce and fix.