To get Amazon Brazil product data, call the SellerMagnet API with marketplaceId=A2Q3Y263D00KWC: requests go to amazon.com.br and prices come back in BRL. Every endpoint answers on this store, including price history, estimated sales and the ASIN converter. Two details trip up most Brazilian integrations: history prices arrive as integer centavos, and lookup's listedSinceDate is usually null, so the listing date has to come from statistics.
Key Takeaways
- amazon.com.br is marketplace A2Q3Y263D00KWC, priced in BRL with currencySymbol "R$".
- All ten endpoints answer on amazon.com.br: it is one of 11 marketplaces with price history, estimated sales and the ASIN converter.
- With free delivery, the same Buy Box reads 1299.0 on lookup and offers but 129900 (centavos) on statistics.
- lookup's listedSinceDate is usually null on amazon.com.br; statistics data.listedSince gives the first listing date on record instead.
- Amazon sells first-party on amazon.com.br as seller A1ZZFT5FULY4LN, which statistics uses for shareBuyBox and amazonPrice.
Amazon Brazil 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. Until 18 Sep 2026 the API's marketplace data labelled amazon.com.br as USD, so check the currency label on responses stored before that date. Product pages on amazon.com.br print prices with Brazilian separators (R$ 4.091,55), but the API already returns plain numbers such as 4091.55. Amazon's own product API for the store, the Creators API, requires enrollment in the Associates program for that marketplace and at least 10 qualifying sales in the past 30 days; this API needs only an API key.
| Item | amazon.com.br |
|---|---|
| Marketplace ID | A2Q3Y263D00KWC |
| Store | amazon.com.br |
| Currency | BRL, currencySymbol "R$" (Brazilian Real) |
| Default postcode | 70040-904 (used when geo_location is not sent) |
| Amazon's own seller ID | A1ZZFT5FULY4LN |
| History endpoints | answer: statistics, estimated sales, ASIN converter |
| listedSinceDate (lookup) | usually null: amazon.com.br's date label is not recognised |
| Bestseller category tree | amazon.com.br's own tree, names in Portuguese |
The amazon.com.br entry of /amazon-get-marketplaces (data is keyed by marketplace ID)
{
"A2Q3Y263D00KWC": {
"marketplace_domain": "amazon.com.br",
"marketplace_name": "Amazon BR",
"currency_code": "BRL",
"currency_name": "Brazilian Real",
"currency_symbol": "R$",
"geo_location": "70040-904"
}
}
Which endpoints answer on amazon.com.br?
All ten. 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.com.br is one of them, next to amazon.com, amazon.ca and amazon.com.mx. That makes Brazil different from stores such as amazon.se or amazon.com.au, where statistics, estimated sales and the converter return a free 400 "This endpoint is not available for the requested marketplace".

Three price formats for one Brazilian product
A product that sells for R$ 1.299,00 with free delivery comes back in three different 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 centavos. Mixing them without converting turns a stable price into a 100x jump. On an offer with paid delivery, lookup's item price and the other two differ by the shipping cost as well.
| Endpoint | Field | Unit | Example |
|---|---|---|---|
| /amazon-product-lookup | productInfo.buyBoxInfo.price | decimal reais, item only | 1299.0 or "N/A" |
| /amazon-product-offers | buyBox.totalPrice | decimal reais, incl. shipping | 1299.0 (round it) |
| /amazon-product-statistics | buyBoxPrice | integer centavos, incl. shipping | 129900 or "N/A" |
| /amazon-product-statistics | stats.buyBoxPriceHistory | [date, centavos] pairs | ["2026-10-01", 129900] |
Why is listedSinceDate null on amazon.com.br?
On amazon.com.br product pages the date row reads "Disponível para compra desde" (available to buy since). The lookup endpoint recognises the Portuguese label "Data de lançamento", but not this one, so productInfo.listedSinceDate is usually null for Brazilian products even when the page shows a date. Do not read that null as a new or unknown listing. Because amazon.com.br has history coverage, the statistics response carries listedSince ("YYYY-MM-DD HH:MM:SS" in UTC, or null when no date is on record) and trackingSince ("YYYY-MM-DD", or the string "N/A"). Both come from the price history, so they can differ from the date Amazon prints on the page. The Date First Available guide explains what the date means.
Check Brazilian ASINs in Python
The script below makes three calls per ASIN: lookup for the item price and listedSinceDate, statistics for the Buy Box price in centavos, shareBuyBox and listedSince, and offers for the live featured offer and the number of distinct sellers. It drops anything that is not a 10-character ASIN and every duplicate before paying, skips statistics and offers after a billed 404 on lookup, and stops the run on a 401 or 403. It uses sellermagnet.py (ApiError, new_session) and retry.py (get_with_retry) from the Python quickstart.
brazil_check.py: price, listing age and Amazon's presence for amazon.com.br ASINs
"""Amazon Brazil (amazon.com.br) product check: price, listing age and Amazon's own presence per ASIN.
marketplaceId A2Q3Y263D00KWC = amazon.com.br, priced in BRL. Three calls per ASIN, three price formats:
/amazon-product-lookup productInfo.buyBoxInfo.price decimal reais, item price only ("N/A" = none)
/amazon-product-offers buyBox.totalPrice decimal reais incl. shipping, not rounded
/amazon-product-statistics buyBoxPrice integer centavos incl. shipping ("N/A" = none)
amazon.com.br is one of the 11 marketplaces with price history, so statistics answers here. Its product pages
label the listing date "Disponível para compra desde", a label lookup does not recognise, so listedSinceDate is
usually null on amazon.com.br: the script falls back to the listedSince date from statistics.
Helpers: sellermagnet.py and retry.py from https://sellermagnet-api.com/blog/amazon-product-api-python
"""
import re
import requests
from retry import get_with_retry
from sellermagnet import ApiError, new_session
BR = "A2Q3Y263D00KWC" # amazon.com.br
ASINS = ["B0CL61F39H", "B0BRFBM001", " b0cl61f39h", "B0BRGONE01", "B0BRNOBOX1", "4.00638E+12"]
MAX_FAILED = 3 # 502/503 are billed on every attempt: stop after 3 calls that keep failing
class Stop(Exception):
"""401/403: the key or the credits are gone, so every further call would fail the same way."""
def brl(value):
"""1299.9 -> 'R$ 1.299,90'. Brazilian separators for the report only: the API sends plain numbers."""
if value is None:
return "-"
return "R$ " + f"{value:,.2f}".replace(",", "_").replace(".", ",").replace("_", ".")
def fetch(session, endpoint, asin):
"""(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, asin=asin, marketplaceId=BR), None
except ApiError as err:
if err.status in (401, 403):
raise Stop(str(err))
if err.status == 404:
return None, "billed 404" # charged, and retrying a missing product only buys another 404
return None, f"error {err.status}"
except (requests.ConnectionError, requests.Timeout) as err:
return None, f"error {type(err).__name__}"
def lookup_summary(data):
"""(item price, listedSinceDate) from productInfo; the price is the string "N/A" without a featured offer."""
info = data["productInfo"]
price = (info.get("buyBoxInfo") or {}).get("price")
return (price if isinstance(price, (int, float)) else None), info.get("listedSinceDate")
def offers_summary(data):
"""(featured total, holder, unique sellers). A listing without offers is {} + [], not an error."""
box, offers = data.get("buyBox") or {}, data.get("offers") or []
sellers = len({o.get("sellerId") for o in offers if o.get("sellerId")}) # a seller can be listed twice
if data.get("buyBoxSuppressed") or not box.get("totalPrice"):
return None, "no featured offer", sellers
if box.get("sellerId") == "Amazon":
holder = f"Amazon ({box.get('amazonSellerId') or 'no first-party ID'})"
else:
holder = f"{box.get('fulfillmentType', '?')} seller {box.get('sellerId', '?')}"
return round(box["totalPrice"], 2), holder, sellers # buyBox.totalPrice is not rounded upstream
def stats_summary(data):
"""(Buy Box price in reais, Amazon held the Buy Box in the last 30 days, listedSince YYYY-MM-DD)."""
cents = data.get("buyBoxPrice")
price = cents / 100 if isinstance(cents, int) and not isinstance(cents, bool) else None # centavos
share = data.get("shareBuyBox") # True = Amazon itself did NOT hold the Buy Box in the last 30 days
amazon = "?" if share is None else ("no" if share else "yes")
return price, amazon, (data.get("listedSince") or "")[:10] or None
def check(session, asin):
"""One report row for one ASIN; returns (row, failed) where failed counts calls that ended in an error."""
look, note = fetch(session, "amazon-product-lookup", asin)
if look is None:
why = "not on amazon.com.br (billed 404), 2 calls saved" if note == "billed 404" else f"lookup {note}"
return f"{asin:<11} {why}", note.startswith("error")
item, listed = lookup_summary(look)
stats, s_note = fetch(session, "amazon-product-statistics", asin)
offers, o_note = fetch(session, "amazon-product-offers", asin)
s_price, amazon, s_listed = stats_summary(stats) if stats else (None, "?", None)
total, holder, sellers = offers_summary(offers) if offers else (None, f"offers {o_note}", "-")
if listed:
since = f"{listed} lookup"
elif s_listed:
since = f"{s_listed} stats" # lookup's label match failed, statistics still knows the date
else:
since = "unknown"
if s_note:
holder += f", statistics {s_note}"
row = (f"{asin:<11} {brl(item):>12} {brl(total):>12} {brl(s_price):>12} {sellers!s:>7} {amazon:<6} "
f"{since:<17} {holder}")
return row, sum(n is not None and n.startswith("error") for n in (s_note, o_note))
def main():
session = new_session()
print(f"amazon.com.br ({BR}): lookup + statistics + offers, 1 credit each per ASIN\n")
print(f"{'asin':<11} {'lookup item':>12} {'featured':>12} {'stats box':>12} {'sellers':>7} {'amz30d':<6} "
f"{'listed since':<17} holder / note")
seen, failed = set(), 0
for raw in ASINS:
asin = raw.strip().upper()
if not re.fullmatch(r"[A-Z0-9]{10}", asin):
print(f"{raw.strip():<11} skipped: not an ASIN (lookup and offers would still bill it)")
continue
if asin in seen:
print(f"{asin:<11} skipped: duplicate (a second check bills 3 more credits)")
continue
seen.add(asin)
if failed >= MAX_FAILED:
print(f"stopped after {failed} failed calls")
return
try:
row, bad = check(session, asin)
except Stop as err:
print(f"stopped: {err}")
return
failed += bad
print(row)
if __name__ == "__main__":
main()
Output (illustrative data: a retried 502, a billed 404, a duplicate and a spreadsheet number skipped)
amazon.com.br (A2Q3Y263D00KWC): lookup + statistics + offers, 1 credit each per ASIN
asin lookup item featured stats box sellers amz30d listed since holder / note
B0CL61F39H R$ 1.299,00 R$ 1.299,00 R$ 1.299,00 3 yes 2023-10-04 stats Amazon (A1ZZFT5FULY4LN)
B0BRFBM001 R$ 89,90 R$ 103,80 R$ 103,80 2 no 2025-02-20 stats FBM seller A3BRSELLER03
B0CL61F39H skipped: duplicate (a second check bills 3 more credits)
B0BRGONE01 not on amazon.com.br (billed 404), 2 calls saved
B0BRNOBOX1 - - - 0 ? unknown no featured offer
4.00638E+12 skipped: not an ASIN (lookup and offers would still bill it)
- R$ 89,90 vs R$ 103,80 on B0BRFBM001: lookup shows the item price, offers and statistics include R$ 13,90 shipping. Compare like with like.
- amz30d yes comes from
shareBuyBoxfalse: Amazon (A1ZZFT5FULY4LN) held the Buy Box at some point in the last 30 days. ? means the holder history could not be read, not "no". - listed since ... stats marks the fallback: lookup returned null, statistics had a date on record.
- B0BRNOBOX1 has no featured offer after a retried 502 (billed twice), and statistics returned buyBoxPrice "N/A": the row shows dashes, never R$ 0,00.
- 4.00638E+12 is a barcode mangled by a spreadsheet. Lookup and offers do not validate the ASIN format and would bill it, so the script skips it for free.

Credits per amazon.com.br check
1 credit per request, the same as on every store. The script spends 3 credits per ASIN, or 1 when lookup answers a billed 404. 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 11 calls for 4 unique ASINs: 3 full checks, 1 lookup 404 and 1 retried 502, so 11 credits. Gate errors such as a missing parameter cost nothing. Plans and credit packs are on the pricing page.
Which category IDs work for amazon.com.br bestsellers?
Only IDs from amazon.com.br's own tree. It holds 12,221 distinct categories, 40 of them top-level, with Portuguese names (electronics is "Eletrônicos", hpc is "Saúde e Cuidados Pessoais"). Top-level slugs such as electronics or beauty also exist on amazon.com, but the two trees share no numeric ID: a US browse node sent to amazon.com.br is the billed 400 "Invalid CategoryId". Browse the tree in the category explorer; the category ID guide shows how to validate an ID before paying.
Frequently Asked Questions
What is the Amazon Brazil marketplace ID?
A2Q3Y263D00KWC. Pass it as marketplaceId and the request goes to amazon.com.br with prices in BRL. A country code like "BR" or a domain like "amazon.com.br" is rejected with a free 400 Invalid marketplaceId.
Does the Amazon Brazil API include price history?
Yes. amazon.com.br is one of the 11 marketplaces where /amazon-product-statistics, estimated sales and the ASIN converter answer. History prices come back as integer centavos, so divide by 100 before showing reais.
Why is listedSinceDate null for Brazilian products?
amazon.com.br labels the date "Disponível para compra desde", which the lookup endpoint does not recognise, so the field is usually null there. Use data.listedSince from /amazon-product-statistics, the first listing date in the price history; it is null only when none is on record.
What seller ID does Amazon itself use on amazon.com.br?
A1ZZFT5FULY4LN. An offers Buy Box held by Amazon shows sellerId "Amazon" with this ID in amazonSellerId, and statistics uses it for shareBuyBox and amazonPrice on amazon.com.br.
Do US category IDs work for amazon.com.br bestsellers?
No. The two trees share no numeric category ID, so a US browse node is a billed 400 "Invalid CategoryId" on amazon.com.br. Take IDs from the Brazilian tree; top-level slugs such as electronics exist in both.
Bottom line: use A2Q3Y263D00KWC for amazon.com.br, divide statistics prices by 100, round the offers Buy Box, and take the listing date from statistics when lookup returns null. For the other stores, see the marketplace IDs list and endpoint coverage by marketplace; a free account includes 150 credits.