Home / Blog / Compare Amazon Prices Across Marketplaces: One ASIN, Nine EU Stores, One Table

Compare Amazon Prices Across Marketplaces: One ASIN, Nine EU Stores, One Table

Compare an Amazon product's price across amazon.de, .fr, .it, .es, .nl, .com.be, .ie, .se and .pl with one API call per marketplace: convert currencies, strip VAT, handle ASINs that do not exist everywhere, and find the real price gap.

September 22, 2026
4 min read
SellerMagnet Team
Share & Bookmark
Blueprint flow from one ASIN through lookups on nine Amazon marketplaces to one VAT-adjusted price table

To compare an Amazon product's price across marketplaces, request the same ASIN once per marketplace from /api/amazon-product-lookup and read buyBoxInfo.price and currencyCode from each answer. Nine EU stores cost nine credits. The raw numbers are not comparable yet: convert them to one currency with your own exchange rates and remove each country's VAT, and only then rank them. The Python below does all of it and handles ASINs that are not listed everywhere.

Key Takeaways

  • One lookup per marketplace and ASIN, one credit each; there is no multi-marketplace request.
  • Prices come back in the marketplace currency: EUR on seven of the nine EU stores, SEK on amazon.se and PLN on amazon.pl.
  • Shelf prices include VAT, and the standard rate runs from 19 % in Germany to 25 % in Sweden, so compare net prices.
  • An ASIN missing on a marketplace returns a billed 404 - record it once instead of retrying.
  • "N/A" instead of a price means no offer is featured there; treat it as unknown, not as zero.

Which Amazon marketplaces can I compare?

The API accepts 23 marketplace IDs; the nine EU storefronts below are where cross-border comparison matters most, because a shopper or a reseller can buy from any of them. Amazon often uses the same ASIN across European stores, but not always - a product can be missing or listed under a different ASIN in one country. The full ID list is in the marketplace IDs guide.

EU Amazon marketplaces, their IDs, currencies and standard VAT rates (September 2026).
StoremarketplaceIdCurrencyStandard VAT
amazon.deA1PA6795UKMFR9EUR19 %
amazon.frA13V1IB3VIYZZHEUR20 %
amazon.itAPJ6JRA9NG5V4EUR22 %
amazon.esA1RKKUPIHCS9HSEUR21 %
amazon.nlA1805IZSGTT6HSEUR21 %
amazon.com.beAMEN7PMS3EDWLEUR21 %
amazon.ieA28R8C7NBKEWEAEUR23 %
amazon.seA2NODRKZP88ZB9SEK25 %
amazon.plA1C3SOZRARQ6R3PLN23 %

Standard rates only

The VAT column is each country's standard rate. Books, food and some other categories use reduced rates, so set the rate per product category if your catalogue includes them.

How do I fetch one ASIN's price on every marketplace?

Loop over the marketplace IDs and keep three outcomes apart: a price, no featured offer or no readable price ("N/A"), and not listed (404). new_session(), ApiError and the retry wrapper for 429, 500, 502 and 503 come from the Python quickstart.

compare.py - one ASIN across nine EU marketplaces

from concurrent.futures import ThreadPoolExecutor

import threading

import requests

from retry import get_with_retry
from sellermagnet import ApiError, new_session

MARKETS = {  # marketplaceId: (store, standard VAT rate)
    "A1PA6795UKMFR9": ("amazon.de", 0.19), "A13V1IB3VIYZZH": ("amazon.fr", 0.20),
    "APJ6JRA9NG5V4": ("amazon.it", 0.22), "A1RKKUPIHCS9HS": ("amazon.es", 0.21),
    "A1805IZSGTT6HS": ("amazon.nl", 0.21), "AMEN7PMS3EDWL": ("amazon.com.be", 0.21),
    "A28R8C7NBKEWEA": ("amazon.ie", 0.23), "A2NODRKZP88ZB9": ("amazon.se", 0.25),
    "A1C3SOZRARQ6R3": ("amazon.pl", 0.23),
}
EUR_RATE = {"EUR": 1.0, "SEK": 11.0, "PLN": 4.25}  # your own rates: currency units per 1 EUR
_local = threading.local()


def session():
    if not hasattr(_local, "session"):
        _local.session = new_session()
    return _local.session


def price_on(marketplace_id: str, asin: str) -> dict:
    store, vat = MARKETS[marketplace_id]
    row = {"store": store, "gross": None, "currency": None, "net_eur": None, "status": "ok"}
    try:
        info = get_with_retry(session(), "amazon-product-lookup", asin=asin, marketplaceId=marketplace_id)["productInfo"]
    except ApiError as err:
        row["status"] = "not listed" if err.status == 404 else f"error {err.status}"
        return row
    except requests.RequestException as err:
        row["status"] = type(err).__name__
        return row
    price, currency = info["buyBoxInfo"].get("price"), info["buyBoxInfo"].get("currencyCode")
    if not isinstance(price, (int, float)):
        row["status"] = "no featured offer or no readable price"
        return row
    row.update(gross=price, currency=currency, net_eur=round(price / EUR_RATE[currency] / (1 + vat), 2))
    return row


def compare(asin: str) -> list[dict]:
    with ThreadPoolExecutor(max_workers=5) as pool:
        rows = list(pool.map(lambda m: price_on(m, asin), MARKETS))
    priced = sorted((r for r in rows if r["net_eur"] is not None), key=lambda r: r["net_eur"])
    return priced + [r for r in rows if r["net_eur"] is None]


for r in compare("B0CLTBHXWQ"):
    print(f'{r["store"]:<14} {r["gross"] or "":>9} {r["currency"] or "":<4} {r["net_eur"] or "":>8}  {r["status"]}')

The two fields the comparison needs, from a lookup on amazon.se (example values)

{
  "success": true,
  "data": {
    "productInfo": {
      "asin": "B0CLTBHXWQ",
      "marketplaceId": "A2NODRKZP88ZB9",
      "buyBoxInfo": {"price": 5490.0, "currencyCode": "SEK", "currencySymbol": "kr",
                     "sellerId": "Amazon", "amazonSellerId": "ANU9KP01APNAG"},
      "link": "https://www.amazon.se/dp/B0CLTBHXWQ"
    }
  }
}

Why do gross prices mislead?

Each lookup returns the price a shopper in that store's own country sees, so it includes that country's VAT - and the standard rates differ by six percentage points. In the example, amazon.it shows 469.99 EUR and amazon.de 449.99 EUR - a 20-euro gap. Net of VAT the Italian price is 385.24 EUR and the German one 378.14 EUR, so most of the visible gap is tax. For most EU distance sales to consumers, VAT follows the delivery country, and Amazon recalculates it at checkout when the delivery address changes. A buyer pays roughly the net price plus their own country's VAT: the amazon.nl offer at 371.07 EUR net comes to about 441.57 EUR for a buyer in Germany. That is why net prices are the numbers to rank.

Blueprint bar chart of one product's price net of VAT in euros on nine Amazon EU marketplaces
Illustrative prices: the 20-euro gross gap between amazon.it and amazon.de shrinks to 7 euros net.

Two more things change the landed cost. buyBoxInfo.price is the featured offer's item price without shipping; for price plus shipping per offer, call the offers endpoint and use totalPrice. And the exchange rate is yours to choose - the API returns each marketplace's own currency and does no conversion. Finally, not every offer ships to every country, so check delivery to your address before treating the cheapest store as buyable.

Blueprint table of nine EU Amazon marketplaces with currency, standard VAT rate and example net price
The inputs of the comparison: currency, VAT and the resulting net price.

Can I run the comparison from the command line?

Yes. A shell loop with curl and jq prints the gross price and currency per store; the VAT and currency step is easier in Python or a spreadsheet.

Gross price per EU store with curl and jq (nine credits)

ASIN=B0CLTBHXWQ
for M in A1PA6795UKMFR9 A13V1IB3VIYZZH APJ6JRA9NG5V4 A1RKKUPIHCS9HS A1805IZSGTT6HS \
         AMEN7PMS3EDWL A28R8C7NBKEWEA A2NODRKZP88ZB9 A1C3SOZRARQ6R3; do
  curl -sG "https://sellermagnet-api.com/api/amazon-product-lookup" \
    -H "X-Api-Key: $SELLERMAGNET_API_KEY" --max-time 120 \
    --data-urlencode "asin=$ASIN" --data-urlencode "marketplaceId=$M" \
    | jq -r --arg m "$M" 'if .success then [$m, .data.productInfo.buyBoxInfo.price,
        .data.productInfo.buyBoxInfo.currencyCode] else [$m, "-", .message] end | @tsv'
done

How many credits does a price comparison cost?

One credit per ASIN and marketplace, whatever the answer - a price, "N/A" or a 404. Comparing 200 ASINs across nine stores once a week is 1,800 credits a week. Cache the 404s: a product that is not listed on amazon.pl today rarely appears tomorrow, so re-check missing combinations monthly rather than on every run. For larger catalogues, the bulk lookup guide covers pacing and concurrency.

Frequently Asked Questions

Can one request return prices for several marketplaces?

No. Each lookup takes one ASIN and one marketplaceId and costs one credit, so nine stores are nine requests. Run them in parallel with a small thread pool.

Does the API convert currencies?

No. Every price is in the marketplace's own currency with its currencyCode beside it. Apply your own exchange rates, from the source your accounting uses.

Why remove VAT before comparing?

EU shelf prices include VAT, and standard rates range from 19 % in Germany to 25 % in Sweden. Without removing it, tax differences look like price differences; for a reseller who reclaims VAT, net is the real cost.

What if the ASIN does not exist on a marketplace?

The lookup returns 404, which is billed. Record the combination as not listed and re-check it occasionally instead of on every run.

Is the lookup price the landed price?

No. buyBoxInfo.price is the featured offer's item price. For price plus shipping per offer, use the offers endpoint and its totalPrice field.

Bottom line: nine lookups, your exchange rates and each country's VAT turn nine shelf prices into one honest ranking. The product lookup page lists every field, and a free account includes 150 credits - enough for 16 full nine-store comparisons.

Ready to Extract Amazon Data at Scale?

Start building with SellerMagnet API today. Real-time product data, competitive pricing, and review analytics at your fingertips.

150 free API credits • No credit card required • Cancel anytime