Amazon Buy Box + Offers Agent avatar

Amazon Buy Box + Offers Agent

Pricing

from $20.00 / 1,000 asin checks

Go to Apify Store
Amazon Buy Box + Offers Agent

Amazon Buy Box + Offers Agent

Check Amazon ASINs for the Buy Box winner, stock, and landed-cost offers. Returns structured JSON. Failed checks are never billed.

Pricing

from $20.00 / 1,000 asin checks

Rating

0.0

(0)

Developer

Buzzi Data

Buzzi Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

Categories

Share

Check Amazon ASINs for the Buy Box winner, stock, and competing offers with landed cost (item plus shipping). Pass ASINs or /dp/ URLs and get one structured JSON snapshot per marketplace × ASIN. Failed checks are written with a typed error (BLOCKED, RATE_LIMIT, PARSE, NETWORK) and are never billed.

Why use it

  • MAP and pricing teams who need the live Buy Box seller, not just a list price.
  • Third-party sellers tracking whether Amazon or another seller holds the box.
  • Agents and MCP clients that want one structured record per ASIN instead of HTML.

Each run can take ASINs or product URLs (/dp/, /gp/product/, /gp/aw/d/, ?asin=), snapshot amazon.com, amazon.co.uk, and amazon.de, and pull competing offers from Amazon’s All Offers Display with price plus shipping.

What data you get

One dataset item per marketplace × ASIN. Download JSON, CSV, or Excel from the run, or read items from the default dataset API.

FieldWhat you get
asin, marketplace, urlIdentity of the check
title, brand, imageProduct facts
buyBoxWinning offer: sellerName, sellerId, isAmazon, fulfilledBy, price
inStock, availabilityTextBest-effort stock. availabilityText is visible copy only
cannotShiptrue when Amazon will not ship to the selected postal code
offers[]Landed-cost rows (price, shipping, landedPrice, seller, condition)
lowestOfferCheapest landed offer among offers
scrapedAtISO-8601 timestamp
oktrue only when the snapshot parsed
error, errorDescriptionTyped failure. null on success

Error codes

CodeMeaning
BLOCKEDCAPTCHA, robot check, or automated-access interstitial
RATE_LIMITHTTP 429/503 or throttle copy
PARSEHTML loaded but title or Buy Box could not be extracted, or the ASIN was missing from input
NETWORKTimeouts, DNS, connection errors, other 4xx/5xx

How to run

  1. Add ASINs and/or Amazon product URLs. At least one parseable ASIN is required.
  2. Keep marketplace com for amazon.com, or add co.uk / de. Extra marketplaces in alsoCheckMarketplaces each produce their own row.
  3. Leave postalCode as 92618 (Irvine, CA) for a US deliver-to example, or set a local postcode for UK or Germany.
  4. Leave proxyGroup as UNBLOCKER unless you need sticky residential IPs.
  5. Run the Actor on the Apify platform. Free-plan proxy only works from a platform run, not from a laptop.
{
"asins": ["B014I8SSD0", "B004U3Y8OM"],
"marketplace": "com",
"includeAllOffers": true,
"maxOffers": 20,
"postalCode": "92618",
"proxyGroup": "UNBLOCKER",
"dryRun": true
}

Set dryRun to true when you want dataset items without billing.

Proxy and deliver-to

Amazon.com blocks datacenter and AUTO Apify Proxy groups. Unblocker is the Amazon.com default on Free and paid Apify. Residential US is the fallback when you need sticky IPs so the deliver-to ZIP holds, or when the account has no Unblocker units.

SettingDefaultWhy
Apify ProxyOnRequired for production. Free-plan proxy only works from Actors on the platform
proxyGroupUNBLOCKERProduction default. Unblocker plus ZIP 92618 is the recommended amazon.com path. Residential alone is more likely to hit RATE_LIMIT
CountryOmitted on Unblocker. US on residentialCountry targeting shrinks the Unblocker pool. Residential US plus California (CA) matches ZIP 92618
Concurrency1Higher parallelism burns proxy budget and raises RATE_LIMIT
postalCode92618Location cookies and Amazon’s address-change request run before /dp/

Empty API input ({} or { "useApifyProxy": true }) defaults to Unblocker. The Console proxy widget may still show RESIDENTIAL. Set proxyGroup to UNBLOCKER. Do not put UNBLOCKER under apifyProxyGroups. Set useApifyProxy: false only for local debugging.

Residential fallback

Use proxyGroup: RESIDENTIAL when you need sticky US IPs so deliver-to cookies hold across home, address-change, product page, and offers, or if the account has no Unblocker units.

Unblocker (default)Residential (fallback)
SelectproxyGroup: "UNBLOCKER"proxyGroup: "RESIDENTIAL"
Sticky IPNo. Location cookies may not holdYes, about 30 minutes
Country / CAOmittedForced US, plus CA
Billing10 Unblocker units per successful requestResidential GB
Free planSeparate Unblocker unit allotment (often large on Free)About 20 GB/month residential credit
{ "asins": ["B014I8SSD0"], "proxyGroup": "RESIDENTIAL", "dryRun": true }

If your account has Unblocker units, you can also pick Unblocker on the proxy widget. Setting proxyGroup to UNBLOCKER is enough.

Watch Proxy usage. Each ASIN fetches home, address-change, the product page, and optional offers. Requests are HTML only (no images or JavaScript). CAPTCHA retries download HTML again. Unblocker bills those hops in units, so one ASIN can use several successful requests before retries.

Why postalCode matters

Buy Box, shipping eligibility, and landed price are location-specific. If deliver-to is unset, or the proxy IP geolocates somewhere the item cannot ship, the page often still has title, brand, and image, but:

  • buyBox is missing
  • availability becomes “This item cannot be shipped to your selected delivery location…”

The Actor sets Amazon’s deliver-to location before fetching product pages. Default 92618 is Irvine, CA, an example US ZIP. Use a local postcode for co.uk and de.

Input

See the Input tab for the full form. Non-obvious fields:

FieldTypeDefaultNotes
asinsstring[]10-character ASINs
productUrlsstring[]Amazon URLs. ASIN is extracted from /dp/ and related paths
marketplacecom | co.uk | decomPrimary storefront
alsoCheckMarketplacessame enum[][]Extra storefronts. Each pair is its own output row
includeAllOffersbooleantrueFetch All Offers Display and return competing offers
maxOffersinteger20Cap per snapshot (1–50)
postalCodestring92618Deliver-to ZIP or postal code. Alias: zipCode
proxyGroupRESIDENTIAL | UNBLOCKERUNBLOCKERAmazon.com default. Select RESIDENTIAL as a sticky-IP fallback
proxyCountryUS | GB | DEUSUsed when the proxy widget has no country and the group is residential. amazon.com needs US. Ignored for Unblocker
monitorModebooleanfalseReserved. Always a one-shot snapshot
dryRunbooleanfalseWrite items, do not bill
proxyConfigurationproxyWidget may show RESIDENTIAL + USproxyGroup (default UNBLOCKER) overrides this

Output

One dataset item per marketplace × ASIN. Successful rows include Buy Box, stock, and landed-cost offers. Failed rows stay in the dataset with a typed error so you can retry only those ASINs.

Example success shape:

{
"asin": "B014I8SSD0",
"marketplace": "com",
"url": "https://www.amazon.com/dp/B014I8SSD0",
"title": "Amazon Basics HDMI Cable, 6ft, 4K@60Hz",
"brand": "Amazon Basics",
"buyBox": {
"sellerName": "Amazon.com",
"sellerId": "ATVPDKIKX0DER",
"isAmazon": true,
"fulfilledBy": "Amazon",
"price": { "value": 4.8, "currency": "USD" }
},
"inStock": true,
"cannotShip": false,
"availabilityText": "In Stock",
"offers": [
{
"sellerName": "Amazon.com",
"isAmazon": true,
"fulfilledBy": "Amazon",
"price": { "value": 4.8, "currency": "USD" },
"shipping": { "value": 0, "currency": "USD", "isFree": true },
"landedPrice": { "value": 4.8, "currency": "USD" }
}
],
"lowestOffer": {
"sellerName": "Amazon.com",
"landedPrice": { "value": 4.8, "currency": "USD" }
},
"ok": true,
"error": null,
"scrapedAt": "2026-09-09T00:00:00.000Z"
}

Field names match the table in What data you get. offers is populated when includeAllOffers is true and All Offers Display parsed.

Pricing

You pay asin_check only when a snapshot succeeds (ok: true). Failed checks (BLOCKED, RATE_LIMIT, PARSE, NETWORK) are written to the dataset and are never billed. Invalid input that never becomes a snapshot is not billed either.

Store price is about $0.02 per successful asin_check. Apify may also record a platform start event on each run.

Set dryRun: true to write dataset items without billing. Use that for a first run, CI, or local tests.

MCP and agents

Each dataset item is a JSON object with ok, a typed error, and nested buyBox / offers. Point an MCP client at the default dataset ({{links.apiDefaultDatasetUrl}}/items) or run the Actor via the Apify MCP server and read items directly. Failed checks stay in the dataset, so an agent can retry only BLOCKED or RATE_LIMIT without paying for those attempts.

Default proxyGroup is UNBLOCKER. You can omit it or pass proxyGroup: "UNBLOCKER" explicitly. Do not put UNBLOCKER under apifyProxyGroups. Use proxyGroup: "RESIDENTIAL" for the sticky-IP fallback.

Risks and limitations

  • Amazon terms. Scraping Amazon storefronts may violate Amazon’s terms. Use this Actor only where you have a lawful basis. This is not an official Amazon API.
  • Blocking. Datacenter IPs are frequently challenged. The Actor defaults to Apify Unblocker (residential US is a fallback) and retries CAPTCHA or throttle pages with a new session before writing BLOCKED or RATE_LIMIT. It does not execute JavaScript. Some Buy Box layouts that hydrate late will surface as PARSE.
  • Selector drift. Amazon A/B-tests #buybox, #merchantInfoFeature_feature_div, #tabular-buybox, and All Offers Display markup. Parsers can miss a new layout until they are updated.
  • Stock is heuristic. inStock is derived from availability copy (In Stock, Currently unavailable, Auf Lager, and similar), not warehouse quantity.
  • Deliver-to is required for a real Buy Box. Default ZIP is 92618 (Irvine, CA), an example US deliver-to. A missing or out-of-area location is modeled as cannotShip: true with inStock: false. Product identity is still returned when it parsed. Tax and Prime benefits are not modeled. Shipping is parsed from offers or delivery strings when present. Missing shipping is treated as 0.
  • Monitor mode is reserved. The Actor always returns a one-shot snapshot. It does not store previous winners or emit change events.

Local development

Requires Node.js 20+ and the Apify CLI.

npm install
npm test
apify run --input-file=test/input.sample.json

The sample input sets dryRun: true. Without Apify Proxy credentials, Amazon will often return BLOCKED or RATE_LIMIT after retries. That is expected locally: the Actor still writes a typed error item and does not bill.

License

Apache-2.0