To get Amazon France product data, call the SellerMagnet API with marketplaceId=A13V1IB3VIYZZH: requests go to amazon.fr and prices come back in EUR. Every endpoint answers on this store, including price history, estimated sales and the EAN to ASIN converter. That is the headline difference to the recent amazon.co.za and amazon.com.be marketplace guides: those two stores get a free 400 on the three history endpoints, amazon.fr answers all three with real data. Two details matter for French integrations: history prices arrive as integer euro cents, and titles, bullets and category names come back in French.
Key Takeaways
- amazon.fr is marketplace A13V1IB3VIYZZH, priced in EUR; requests ask amazon.fr for postcode 75001 (best effort).
- All nine endpoints below answer on amazon.fr (plus /amazon-get-marketplaces, which has no marketplace gate at all): it is one of 11 marketplaces with price history, estimated sales and the ASIN converter, unlike amazon.co.za or amazon.com.be.
- With free delivery, the same Buy Box reads 24.99 on lookup and offers but 2499 (euro cents) on statistics.
- Amazon sells first-party on amazon.fr as seller A1X6FK5RDHNB96, which statistics uses for amazonPrice and shareBuyBox.
- Bestsellers take French category names such as Moulins à café; an ambiguous or unknown name is a free 400.
Amazon France product API at a glance
Requests look the same as on any other store: GET, query parameters, the key in the X-Api-Key header. What changes are the values below. Lookup, offers and search ask amazon.fr for postcode 75001 (best effort; offers and search take another one in geo_location), and on an EU store the price a buyer pays includes VAT. amazon.fr prints prices with French separators (1 299,99 €), but the API returns plain numbers such as 1299.99. Amazon's own APIs for amazon.fr depend on your account type: the Selling Partner API's catalog calls are for sellers, and the Creators API is for Associates with at least 10 qualifying sales in the past 30 days. This API needs only an API key.
| Item | amazon.fr |
|---|---|
| Marketplace ID | A13V1IB3VIYZZH |
| Store | amazon.fr |
| Currency | EUR, currencySymbol "€" (Euro) |
| Default postcode | asks amazon.fr for 75001 (Paris 1er), best effort |
| Amazon's own seller ID | A1X6FK5RDHNB96 |
| History endpoints | answer: statistics, estimated sales, ASIN converter |
| listedSinceDate (lookup) | filled from the details row whose label starts "Date de mise en" |
| Page language | French: titles, bullets and category names |
| Bestseller category tree | amazon.fr's own: 48 top-level, about 27,000 categories |
The amazon.fr entry of /amazon-get-marketplaces (data is keyed by marketplace ID)
{
"A13V1IB3VIYZZH": {
"currency_code": "EUR",
"currency_name": "Euro",
"currency_symbol": "€",
"geo_location": "75001",
"marketplace_domain": "amazon.fr",
"marketplace_name": "Amazon FR"
}
}
Does amazon.fr have price history in the API?
Yes. Lookup, offers, search, bestsellers, deals and seller feedback only check that the marketplace ID is valid and answer on all 23 stores. The three history endpoints cover 11 marketplaces, and amazon.fr is one of them, next to amazon.de, amazon.co.uk, amazon.it and amazon.es. That is the main difference to stores such as amazon.com.be, amazon.co.za, amazon.pl or amazon.se, where statistics, estimated sales and the converter return a free 400 "This endpoint is not available for the requested marketplace". On amazon.fr each of them costs 1 credit and returns data: the Buy Box price and its history, the holder history with Amazon's own seller ID, a monthly sales estimate, and the ASIN behind a barcode.

How do amazon.fr prices come back?
In three shapes, depending on the endpoint. Lookup reports the featured item price without shipping, offers adds shipping and does not round the Buy Box total, and statistics counts in euro cents. A product that sells for 24,99 € with free delivery therefore reads 24.99, 24.99 and 2499. Mixing them without converting turns a stable price into a 100x jump; on an offer with paid delivery, lookup's item price also differs from the other two by the shipping cost.
| Endpoint | Field | Unit | Example |
|---|---|---|---|
| /amazon-product-lookup | productInfo.buyBoxInfo.price | decimal euros, item only | 24.99 or "N/A" |
| /amazon-product-offers | buyBox.totalPrice | decimal euros, incl. shipping | 24.99 (round it) |
| /amazon-product-statistics | buyBoxPrice | integer euro cents, incl. shipping | 2499 or "N/A" |
| /amazon-product-statistics | stats.buyBoxPriceHistory | [date, cents] pairs | ["2026-10-01", 2499] |
| /amazon-search | listingPrice.price.total | string, two decimals | "24.99" |
Check a French supplier list by EAN in Python
French wholesale lists identify products by EAN, not ASIN, and that is where the history endpoints on amazon.fr pay off. The script below reads a supplier CSV as a French Excel saves it (semicolons, decimal commas, a UTF-8 BOM), converts each EAN to an ASIN, reads the Buy Box and Amazon's presence from statistics, and adds a monthly sales estimate. It checks the EAN check digit, the price cell and duplicates before paying, skips the estimate when nobody holds the Buy Box, and stops on a 401 or 403. It uses sellermagnet.py (ApiError, new_session) and retry.py (get_with_retry) from the Python quickstart.
france_ean_check.py: Buy Box, Amazon's presence and a sales estimate per EAN on amazon.fr
"""Amazon France (amazon.fr): check a French supplier list by EAN with the three history endpoints.
marketplaceId A13V1IB3VIYZZH = amazon.fr, priced in EUR. amazon.fr is one of the 11 marketplaces with price
history (the recent amazon.co.za and amazon.com.be marketplace posts covered stores WITHOUT it), so the
converter, statistics and estimated sales answer it with data. Per EAN, at most 3 credits:
/amazon-asin-converter ean-to-asin: the ASIN amazon.fr lists for the barcode (first match only)
/amazon-product-statistics buyBoxPrice in euro cents incl. shipping ("N/A" = nobody holds it) and
shareBuyBox (False = Amazon itself held the Buy Box in the last 30 days)
/amazon-product-search-estimated-sells estimated_monthly_sales: a model estimate, not a measurement
The list is a CSV saved by a French Excel: semicolons, decimal commas ("12,50") and EANs that Excel may have
turned into 3.30123E+12. Every value is checked before a credit is spent.
Helpers: sellermagnet.py and retry.py from https://sellermagnet-api.com/blog/amazon-product-api-python
"""
import csv
import re
import requests
from retry import get_with_retry
from sellermagnet import ApiError, new_session
MARKET = "A13V1IB3VIYZZH" # amazon.fr
SUPPLIER_CSV = "fournisseur.csv" # Excel: save as CSV UTF-8 with semicolons
COLUMNS = ["EAN", "Article", "PA HT"]
MAX_FAILED = 3 # 502/503 are billed on every attempt: stop after 3 calls that keep failing
class Stop(Exception):
"""401/403 (key or credits gone) or a marketplace without history: every further call fails the same way."""
def ean_ok(code):
"""GS1 check digit of an EAN-8, UPC-12, EAN-13 or GTIN-14: a typo fails here, not as a billed 400 or 404."""
if not re.fullmatch(r"\d{8}|\d{12,14}", code):
return False
body, check = [int(d) for d in code[:-1]], int(code[-1])
total = sum(d * (3 if i % 2 == 0 else 1) for i, d in enumerate(reversed(body)))
return (10 - total % 10) % 10 == check
def euro(text):
"""French price cell -> float: "12,50" and "1 249,00" work; "1.249" is ambiguous -> None."""
s = re.sub(r"[\s\u00a0\u202f€]", "", text) # French thousands: space, no-break or narrow no-break space
if re.fullmatch(r"\d{1,3}(\.\d{3})*,\d{1,2}|\d+,\d{1,2}", s):
return float(s.replace(".", "").replace(",", "."))
if re.fullmatch(r"\d+(\.\d{1,2})?", s):
return float(s)
return None
def eur(value):
"""1249.0 -> '1 249,00 €': French separators for the report (the API sends plain numbers)."""
if value is None:
return "-"
return f"{value:,.2f}".replace(",", " ").replace(".", ",") + " €"
def fetch(session, endpoint, **params):
"""(data, None) on success, (None, note) on a per-row error. get_with_retry retries 429/502/503, 500 once."""
try:
return get_with_retry(session, endpoint, marketplaceId=MARKET, **params), None
except ApiError as err:
if err.status in (401, 403):
raise Stop(str(err))
if err.status == 400 and "not available for the requested marketplace" in str(err):
raise Stop("no history endpoints on this marketplace (free 400)")
if err.status == 404:
return None, "billed 404" # charged, and a retry would only buy another 404
return None, f"error {err.status}"
except (requests.ConnectionError, requests.Timeout) as err:
return None, f"error {type(err).__name__}"
def read_rows(path):
with open(path, newline="", encoding="utf-8-sig") as fh: # utf-8-sig: Excel writes a BOM
reader = csv.DictReader(fh, delimiter=";")
if reader.fieldnames != COLUMNS:
raise Stop(f"header {reader.fieldnames} is not {COLUMNS}: fix the file, nothing was sent")
return list(reader)
def check(session, asin):
"""(Buy Box price in euros or None, Amazon held it in the last 30 days, estimate or None, note, failed calls)."""
stats, note = fetch(session, "amazon-product-statistics", asin=asin)
if stats is None:
return None, "?", None, f"statistics {note}", note.startswith("error")
cents = stats.get("buyBoxPrice")
box = cents / 100 if isinstance(cents, int) and not isinstance(cents, bool) and cents > 0 else None # cents
share = stats.get("shareBuyBox") # True = Amazon did NOT hold the Buy Box in the last 30 days
amazon = "?" if share is None else ("no" if share else "yes")
if box is None:
return None, amazon, None, "nobody holds the Buy Box, estimate skipped", False
est, e_note = fetch(session, "amazon-product-search-estimated-sells", asin=asin)
if est is None:
return box, amazon, None, f"estimate {e_note}", e_note.startswith("error")
return box, amazon, est.get("estimated_monthly_sales"), "", False
def main():
session = new_session()
try:
rows = read_rows(SUPPLIER_CSV)
except Stop as err:
print(f"stopped: {err}")
return
print(f"amazon.fr ({MARKET}): converter + statistics + estimated sales, at most 3 credits per EAN\n")
print(f"{'ean':<13} {'asin':<10} {'PA HT':>10} {'Buy Box':>10} {'x PA':>5} {'amz30d':<6} {'est/mo':>6} note")
seen_ean, seen_asin, failed = set(), {}, 0
for row in rows:
raw = (row["EAN"] or "").strip()
cost = euro(row["PA HT"] or "")
if "E+" in raw.upper():
print(f"{raw:<13} skipped: Excel turned the EAN into a number, the last digits are lost")
continue
if not ean_ok(raw):
print(f"{raw:<13} skipped: not a valid EAN (check digit), the converter would bill it")
continue
if cost is None or cost <= 0:
print(f"{raw:<13} skipped: purchase price {row['PA HT']!r} is ambiguous or not a euro amount")
continue
if raw in seen_ean:
print(f"{raw:<13} skipped: duplicate row (a second check bills up to 3 more credits)")
continue
seen_ean.add(raw)
if failed >= MAX_FAILED:
print(f"stopped after {failed} failed calls")
return
try:
conv, note = fetch(session, "amazon-asin-converter", asin=raw, conversion_direction="ean-to-asin")
if conv is None:
failed += note.startswith("error")
why = "no match on amazon.fr (billed 404)" if note == "billed 404" else f"converter {note}"
print(f"{raw:<13} {'-':<10} {eur(cost):>10} {why}")
continue
asin = conv.get("asin")
if not asin:
print(f"{raw:<13} {'-':<10} {eur(cost):>10} converter returned no ASIN")
continue
if asin in seen_asin:
print(f"{raw:<13} {asin:<10} {eur(cost):>10} same ASIN as {seen_asin[asin]}, not checked twice")
continue
seen_asin[asin] = raw
box, amazon, est, note, bad = check(session, asin)
except Stop as err:
print(f"stopped: {err}")
return
failed += bad
mult = f"{box / cost:.1f}".replace(".", ",") if box else "-" # Buy Box / purchase price
print(f"{raw:<13} {asin:<10} {eur(cost):>10} {eur(box):>10} {mult:>5} {amazon:<6} "
f"{est if est is not None else '-':>6} {note}".rstrip())
if __name__ == "__main__":
main()
Output (illustrative data: two retried/refunded errors, a billed 404, a duplicate, two EANs for one ASIN and three rows skipped before paying)
amazon.fr (A13V1IB3VIYZZH): converter + statistics + estimated sales, at most 3 credits per EAN
ean asin PA HT Buy Box x PA amz30d est/mo note
3301234500012 B0FRROBOT1 89,90 € 89,90 € 1,0 no 210
3301234500029 B0FRBOUIL2 24,50 € 24,50 € 1,0 yes 150
3.30123E+12 skipped: Excel turned the EAN into a number, the last digits are lost
3301234500036 B0FRGRILL3 15,00 € - - ? - nobody holds the Buy Box, estimate skipped
3301234500036 skipped: duplicate row (a second check bills up to 3 more credits)
3301234500043 - 22,00 € no match on amazon.fr (billed 404)
3301234500050 B0FRROBOT1 3,20 € same ASIN as 3301234500012, not checked twice
3301234500067 B0FRCHARG4 7,50 € 19,90 € 2,7 ? 40
33012345000AB skipped: not a valid EAN (check digit), the converter would bill it
3301234500081 skipped: purchase price '1.249' is ambiguous or not a euro amount
- x PA divides the Buy Box by the net purchase price (PA HT). The Buy Box is what a buyer pays, VAT and shipping included, and Amazon's fees still come off it, so read it as a first filter, not a margin.
- amz30d no on the first row comes from
shareBuyBoxtrue: Amazon (A1X6FK5RDHNB96) did NOT hold the Buy Box in the last 30 days there; yes on the second row means it did. ? means the holder history could not be read, not "no". - 3301234500050 is a second EAN whose converter lookup points at the same ASIN as 3301234500012, which happens when one listing carries several EANs. The script pays for the conversion and reuses the first row instead of buying statistics twice.
- 3.30123E+12 is an EAN that Excel stored as a number; the last digits are gone, so the script skips it rather than paying for a guess. Format the EAN column as text before you export.
- est/mo is a model estimate of monthly units, not a measurement. Treat 210, 150 and 40 as an order of magnitude.

Credits per EAN on amazon.fr
1 credit per request, the same as on every store. The script spends 3 credits for a full row, 2 when nobody holds the Buy Box (the estimate is skipped), and 1 when the converter answers a billed 404 or the ASIN was already checked. Skipped rows cost nothing. Retries add up: a 502 or 503 is charged on every attempt (get_with_retry makes up to 4), while a 500 without Retry-After is refunded every time. The example run made 16 calls for the 10 rows it read: 1 full row needed 2 retried 502s before its statistics call succeeded (3 billed statistics attempts), 1 full row needed a refunded 500 retried once (2 attempts), 1 row had no Buy Box, 1 converter 404, 1 repeated ASIN, and 4 rows were skipped before paying (an Excel-truncated EAN, a duplicate, an invalid check digit and an ambiguous price), so 15 credits (the refunded 500 costs nothing) for 6 EANs actually sent. Gate errors such as a missing parameter cost nothing. Plans and credit packs are on the pricing page. For a deeper supplier analysis, see the wholesale price list guide and UPC and EAN to ASIN.
Can I use French category names for amazon.fr bestsellers?
Yes. category_id on /amazon-bestsellers takes a numeric browse node, a top-level slug such as electronics or toys, or a category name as amazon.fr shows it, in French. amazon.fr's tree has about 27,000 categories, 48 of them top-level (the slug electronics is the top-level "High-Tech", computers is "Informatique"). A name match adds resolved_category to the response, with the ID, name and path the API used. A name that fits several categories or none, and an unknown numeric ID, get a free 400; a name error lists the closest matches when there are any. An English name such as "dog food" finds nothing on amazon.fr. Check the path before you trust the list. The tree is amazon.fr's own, not borrowed from another store (only amazon.ie reuses the UK tree). The category explorer shows the tree.
The resolved_category field of /amazon-bestsellers with category_id=Moulins à café on amazon.fr
{
"resolved_category": {
"category_id": "57861031",
"name": "Moulins à café",
"path": "Cuisine & Maison > Café, thé et expresso > Moulins à café"
}
}
French page text: what the API normalises and what stays French
amazon.fr answers in French, so productInfo.title, bulletPoints, lookup's category names and the bestseller tree come back in French. Some fields are normalised for you: offer conditions such as "Neuf" or "Occasion - Comme neuf" arrive as "New" and "Used - Like New", delivery words like "demain" become a deliveryDate, and search flags sponsored results (shown as "Sponsorisé" on amazon.fr) with sponsored: true. Lookup's listedSinceDate works on amazon.fr: the shared date-label list matches French phrasing for "date first available" and returns a plain YYYY-MM-DD date, unlike stores whose date label the lookup does not recognise. That date is when the listing was created, not necessarily when it first shipped.
Frequently Asked Questions
What is the Amazon France marketplace ID?
A13V1IB3VIYZZH. Pass it as marketplaceId and the request goes to amazon.fr with prices in EUR. A country code like "FR" or a domain like "amazon.fr" is rejected with a free 400 Invalid marketplaceId.
Does the Amazon France API include price history?
Yes. amazon.fr is one of the 11 marketplaces where /amazon-product-statistics, estimated sales and the ASIN converter answer with data, 1 credit each. The recent amazon.co.za and amazon.com.be guides covered marketplaces where those three calls return a free 400 instead; amazon.fr is not one of them. History prices come back as integer euro cents, so divide by 100.
Can I look up amazon.fr products by EAN?
Yes. Call /amazon-asin-converter with conversion_direction=ean-to-asin and the barcode in asin. It returns the first matching ASIN. An unknown barcode is a billed 404, so check the EAN's check digit before you send it.
What seller ID does Amazon itself use on amazon.fr?
A1X6FK5RDHNB96. An offers Buy Box held by Amazon shows sellerId "Amazon" with this ID in amazonSellerId, and statistics uses it for amazonPrice and shareBuyBox on amazon.fr.
Do bestseller category names have to be French on amazon.fr?
Yes. A name is matched against amazon.fr's French tree, so "Moulins à café" works and "dog food" gets a free 400 with no match. Top-level slugs such as electronics and numeric IDs work as well.
Bottom line: use A13V1IB3VIYZZH for amazon.fr, divide statistics prices by 100, round the offers Buy Box, and send French category names. Because amazon.fr has history coverage, unlike the recent amazon.co.za and amazon.com.be guides, a barcode list becomes Buy Box, Amazon presence and a sales estimate in three calls per EAN. For the other stores, see the marketplace IDs list and endpoint coverage by marketplace; a free account includes 150 credits.