Home / Blog / Amazon Brazil Product API: BRL Prices, Full History, Listing Age

Amazon Brazil Product API: BRL Prices, Full History, Listing Age

Get Amazon Brazil product data with an API: marketplace ID A2Q3Y263D00KWC queries amazon.com.br and returns prices in BRL. Unlike amazon.se or amazon.com.au, amazon.com.br has full price history. This guide covers the three price formats, why lookup's listedSinceDate is usually null there, and a tested Python script that checks Brazilian ASINs.

November 03, 2026
6 min read
SellerMagnet Team
Share & Bookmark
Terminal running a Python script that checks Brazilian ASINs on amazon.com.br: prices in reais, listing dates from statistics and Amazon's own seller ID A1ZZFT5FULY4LN

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.

amazon.com.br at a glance.
Itemamazon.com.br
Marketplace IDA2Q3Y263D00KWC
Storeamazon.com.br
CurrencyBRL, currencySymbol "R$" (Brazilian Real)
Default postcode70040-904 (used when geo_location is not sent)
Amazon's own seller IDA1ZZFT5FULY4LN
History endpointsanswer: statistics, estimated sales, ASIN converter
listedSinceDate (lookup)usually null: amazon.com.br's date label is not recognised
Bestseller category treeamazon.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".

Terminal-theme table of the SellerMagnet API endpoints that answer for amazon.com.br and what each call costs
Every listed endpoint answers on amazon.com.br, the three history endpoints included.

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.

Where the Buy Box price of one amazon.com.br product appears.
EndpointFieldUnitExample
/amazon-product-lookupproductInfo.buyBoxInfo.pricedecimal reais, item only1299.0 or "N/A"
/amazon-product-offersbuyBox.totalPricedecimal reais, incl. shipping1299.0 (round it)
/amazon-product-statisticsbuyBoxPriceinteger centavos, incl. shipping129900 or "N/A"
/amazon-product-statisticsstats.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 shareBuyBox false: 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.
Terminal-theme sequence of the three calls the script makes for one amazon.com.br ASIN, and the single billed call when lookup answers 404
Three billed calls per ASIN; a 404 on lookup ends the row after one.

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.

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