Amazon Price Scraper: Prices by ASIN on Any Marketplace
Scrape Amazon prices by ASIN on amazon.com, .co.uk and .de: the URL pattern, the fields you get, residential cost math and the 'cannot be dispatched' trap.
Published · Updated · By Omar Eldeeb
An Amazon price scraper by ASIN loads https://www.amazon.<marketplace>/dp/<ASIN> for each product and returns the price, currency, was-price, stock, seller and rating as fields. Load each marketplace from its own country, or Amazon may hide the price behind a "cannot be dispatched" message. Outside amazon.com, expect some pages to need residential proxies.
This guide shows a Python script that prices one ASIN on three marketplaces through an Apify actor, the fields in a real row, what non-US marketplaces cost, and three traps: ASINs that differ by country, delivery-location blocks, and Prime-only prices. All output is from runs on 2026-10-20.
The URL pattern and the marketplaces
An ASIN is Amazon's 10-character product id. The shortest stable product URL is /dp/<ASIN> on the marketplace's domain:
https://www.amazon.com/dp/B0DBTV5QF5https://www.amazon.co.uk/dp/B0DXDTX47Whttps://www.amazon.de/dp/B0DXDTX47W
The E-commerce Product Scraper Pro actor accepts 24 Amazon storefronts. Its supported-sites table lists amazon.com and amazon.de as supported, and the other 22 (including amazon.co.uk, amazon.ca, amazon.fr, amazon.it, amazon.com.mx and amazon.com.br) as best-effort. In the actor's latest cloud tests before release, amazon.de delivered 84 % and amazon.co.uk 95 % of deliverable products. Amazon sometimes serves empty pages or captchas, so expect some variation from run to run.
Python: one ASIN, three marketplaces
import os
from apify_client import ApifyClient
ASINS = ["B0DXDTX47W"] # add more ASINs here
MARKETS = ["amazon.com", "amazon.co.uk", "amazon.de"]
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("constructive_calm/ecommerce-product-scraper-pro").call(run_input={
"detailsUrls": [{"url": f"https://www.{m}/dp/{a}"} for a in ASINS for m in MARKETS],
"maxProductResults": len(ASINS) * len(MARKETS),
})
for p in client.dataset(run["defaultDatasetId"]).iterate_items():
asin = (p.get("additionalProperties") or {}).get("asin") or p.get("sku")
print(f"{p['site']:<10} {asin} {p['price']} {p['currency']} was {p['originalPrice']} "
f"{p['availability']} seller={p['seller']} {p['rating']}* ({p['reviewCount']}) via {p['tierUsed']}")
# One status row per input: blocked, not-found, or delivered with a note (e.g. "cannot deliver")
for s in client.dataset(run["storageIds"]["datasets"]["status"]).iterate_items():
print(f"{s['site']:<10} {s['outcome']:<9} {s['errorDescription'] or ''}")Output on 2026-10-20 (pip install apify-client, APIFY_TOKEN set to your Apify API token):
amazon-us B0DBTV5QF5 9.99 USD was None InStock seller=AnkerDirect 4.7* (6781) via datacenter
amazon-gb B0DXDTX47W 9.98 GBP was 13.99 InStock seller=AnkerDirect UK 4.7* (7402) via residential
amazon-de B0DXDTX47W 10.95 EUR was 18.17 InStock seller=AnkerDirect DE 4.8* (7503) via residential
amazon-us ok The store now lists this product under https://www.amazon.com/dp/B0DBTV5QF5 (your URL has ID B0DXDTX47W).
amazon-gb ok
amazon-de ok Three things in that output are easy to miss:
- The US store answered with a different ASIN. amazon.com served B0DXDTX47W as B0DBTV5QF5, and the status row says so. Key your data on the ASIN in the row, not the one you sent.
- Each price is in its market's currency. Don't compare £9.98 with €10.95 without converting.
- The UK and German pages came over residential connections. amazon.com was reached from a datacenter. That difference drives the cost (see below).
An earlier run the same morning used ASIN B088NRLMPV. amazon.com and amazon.co.uk returned it, while amazon.de answered with a page that wasn't a product page, reported as not-found. An ASIN that exists in one marketplace doesn't always exist in another.
What's in an Amazon row
A real amazon.com row from 2026-10-20, trimmed:
{
"url": "https://www.amazon.com/dp/B088NRLMPV",
"name": "Anker USB C to USB C Cable, 60W Fast Charging Cable (2-Pack, 6 ft, Black)",
"price": 9.99,
"currency": "USD",
"currencyRaw": "$",
"originalPrice": null,
"unitPrice": 5,
"unitPriceUnit": "count",
"inStock": true,
"stockQty": 1,
"availability": "LimitedAvailability",
"seller": "AnkerDirect",
"rating": 4.7,
"reviewCount": 90039,
"additionalProperties": {
"asin": "B088NRLMPV",
"parentAsin": "B0DRYBKGR2",
"productDetails": { "Brand": "Anker", "Best Sellers Rank": "#1 in USB Cables", "UPC": "194644034061" },
"availabilityText": "In Stock Only 1 left in stock - order soon."
},
"variantCount": 12,
"site": "amazon-us",
"tierUsed": "datacenter"
}| Field | What it is on Amazon |
|---|---|
price, currency, currencyRaw |
The buy-box price as a number, the ISO currency code, and the symbol as printed |
originalPrice |
The struck-through was-price, when the page shows one. It's Amazon's claim, not a price history |
unitPrice, unitPriceUnit |
Price per count, ounce or meter when the page prints one |
inStock, stockQty, availability |
Stock flag, the number from "Only 1 left", and the availability class |
seller |
The buy-box seller ("AnkerDirect"). Sellers' own pages are a separate input (sellerUrls) |
rating, reviewCount |
Star rating and number of ratings |
additionalProperties |
ASIN, parent ASIN, bullet points, the product-details table (with Best Sellers Rank) |
variants[] |
Sibling ASINs with their size and color, but no prices (see scraping product variants) |
The product page also carries the top 8–13 reviews; scraping product reviews covers what you can and can't get there.
What it costs: datacenter vs residential
Pay per event, from the actor's pricing table, on Apify's FREE plan tier and on GOLD:
| Event | FREE | GOLD |
|---|---|---|
| Actor start (per run, 1 GB) | $0.005 | $0.005 |
| Product scraped | $0.0048 | $0.0008 |
| Residential proxy traffic, per MB | $0.018 | $0.014 |
amazon.com pages were reached over datacenter connections in the actor's tests, so they have no traffic fee. Non-US storefronts often need residential proxies. The actor's measured traffic was 0.3–0.5 MB per delivered amazon.co.uk product, and 0–0.5 MB on amazon.de. Billed MB are 89 % of the measured traffic, and only for items that delivered.
Worked examples, using the table:
- 100 amazon.com products: 100 × $0.0008 + $0.005 = $0.085 on GOLD; 100 × $0.0048 + $0.005 = $0.485 on FREE.
- 100 amazon.co.uk products: 30–50 MB measured, billed as 27–45 MB. On GOLD: $0.08 + 27–45 × $0.014 + $0.005 ≈ $0.46–$0.71. On FREE: $0.48 + 27–45 × $0.018 + $0.005 ≈ $0.97–$1.30.
- The run above: 3 products, 2 of them residential, billed 1 MB. On FREE: 3 × $0.0048 + 1 × $0.018 + $0.005 = $0.0374.
Blocked or empty pages cost nothing: a product that never delivers has no product event and no traffic fee. Apify's free plan includes $5 of usage every month, with no credit card required. There's no free trial inside the actor.
"Cannot be dispatched to your location"
Amazon decides what to show by the visitor's delivery location. When an amazon.de or amazon.co.uk page is loaded from a US IP address, Amazon can replace the buy box with a message that the item can't be dispatched to your location ("…kann nicht an den von dir ausgewählten Zustellungsort versendet werden" on amazon.de). The page loads fine, but it has no price.
How to avoid wrong rows:
- Load each marketplace from its own country. The actor's
proxyCountrydefaults to Auto, which uses each marketplace's own country (amazon.de → Germany). Leave it on Auto for Amazon, or set it to the marketplace's country. Don't pin a German store to a US exit to "see US prices"; you'll get no-ship pages. - Treat a price of
nullas "unknown", never as zero. If Amazon still says it can't deliver when checked from inside the country, the actor retries on another route and then delivers the product without a price. Its status row then reads, for a German page: "Amazon says it cannot deliver this item in DE (checked from a residential exit in that country): delivered without a price." - Check the status dataset after every run. The script above prints it. A run can succeed and still contain rows without a price.
Prime-only prices, coupons and other prices you won't see
A scraper that doesn't sign in sees the signed-out page. That has consequences:
- Prime-exclusive prices (for example during Prime Big Deal Days) are offered to members. They aren't the
pricein a signed-out row. See the Prime Day price tracker for how to handle member-only events. - Clip-on coupons and Subscribe & Save discounts are typically shown next to the price, not taken off it.
- The buy-box price is one offer. Other sellers may sell the same ASIN for less. The row's
sellertells you whose offer it is.
Holiday season: start the baseline before the sale
For Black Friday (Friday, November 27, 2026) and Cyber Monday (November 30), the useful question is whether a deal is below the price the product actually sold at in the weeks before, not below its originalPrice. Schedule the same ASIN list daily on Apify from early November with monitorMode: true. Each row then gets previousPrice, priceChange and a changeType such as price-down. With onlyChanges: true, unchanged products aren't written and are billed at the lower "product checked" price ($0.0012 FREE, $0.0002 GOLD). The holiday sales calendar lists the 2026–2027 dates, and Amazon price history without Keepa shows how to keep and chart the history.
Related guides
Do it without code
The free e-commerce price tracker builder takes Amazon product URLs (or a keyword with Amazon as the marketplace) and a proxy country, and produces a ready-to-run input for the actor, with a fixed example of the output. It doesn't fetch Amazon from your browser.
Disclosure: I built the actor and this site.
Sources: actor runs on 2026-10-20 (the output above), the actor's README (supported-sites table, residential traffic measurements, pricing table and worked examples), and our cloud test runs from October 2026.
Quick answers
How do I get the price of an Amazon product from its ASIN?
Build the product URL as https://www.amazon.<marketplace>/dp/<ASIN> (for example https://www.amazon.co.uk/dp/B0DXDTX47W) and scrape that page, or pass the URL to a scraper that returns the price, currency and was-price as fields. The ASIN is the 10-character code in the URL and in the product details table.
Is an Amazon ASIN the same in every country?
Often, but not always. In our 2026-10-20 runs, ASIN B0DXDTX47W was the same Anker cable on amazon.co.uk and amazon.de, while amazon.com served it under B0DBTV5QF5, and B088NRLMPV had no product page at all on amazon.de. Check each marketplace's result rather than assuming.
Why does an Amazon page say the item cannot be dispatched to my location?
Amazon decides delivery by the visitor's location. When a page is loaded from outside the marketplace's country, Amazon can show a 'cannot be dispatched to your selected delivery location' message instead of a buy box, and the price disappears. Load each marketplace from its own country.
Does scraping Amazon show Prime member prices?
No. A scraper that isn't signed in sees what a signed-out visitor sees. Prices Amazon offers only to Prime members are not the price in the scraped row.
Can I scrape Amazon prices without Keepa?
Yes. Scrape the product pages on a schedule and keep each run's prices; that builds your own history from the day you start. Keepa and camelcamelcamel already have years of history, which a new scraper can't recreate.