Home / Blog / Amazon Canada Product API: Full History Coverage, CAD Pricing, No Gaps

Amazon Canada Product API: Full History Coverage, CAD Pricing, No Gaps

Get Amazon Canada product data with an API: marketplace ID A2EUQ1WTGCTBG2 queries amazon.ca and returns CAD prices through currencySymbol "C$". Unlike amazon.ie and amazon.se covered earlier in this series, amazon.ca has full endpoint coverage, including price history. A tested Python script compares amazon.ca with amazon.com side by side.

November 02, 2026
5 min read
SellerMagnet Team
Share & Bookmark
Terminal running a Python script that compares the same ASIN on amazon.ca in CAD and amazon.com in USD, both with full price history

To get Amazon Canada product data, call the SellerMagnet API with marketplaceId=A2EUQ1WTGCTBG2: the request goes to amazon.ca and prices come back in CAD, shown with currencySymbol "C$". Unlike amazon.ie and amazon.se covered earlier in this series, every endpoint answers on amazon.ca, including price history, estimated sales and the ASIN/EAN converter - there is no free-400 gap to work around here.

Key Takeaways

  • amazon.ca is marketplace A2EUQ1WTGCTBG2 and is priced in CAD, shown as currencySymbol "C$".
  • All ten endpoints answer on amazon.ca: it is one of 11 marketplaces with full price/rank history, estimated sales and ASIN/EAN converter coverage.
  • Amazon's own first-party offers on amazon.ca carry seller ID A3DWYIK6Y9EEQB, not a shared "Amazon" ID across stores.
  • amazon.ca parses prices like amazon.com (comma-thousands, dot-decimal) and matches the English "Date First Available" label, so listedSinceDate works normally.
  • amazon.ca has its own bestseller category tree; it is not aliased to another marketplace.

What is different about the Amazon Canada API?

The request format is the same as for every other store: GET, query parameters, the key in the X-Api-Key header. What changes are a few values and one lookup field's content, not its availability. The API resolves the amazon.ca domain itself and reads prices in Canadian-format dollars, with a currencySymbol of "C$" so a reader can tell it apart from a plain "$" US price at a glance.

amazon.ca at a glance.
Itemamazon.ca
Marketplace IDA2EUQ1WTGCTBG2
Storeamazon.ca
CurrencyCAD (currencySymbol "C$", not plain "$")
Default postcodeK1A 0A1
Number formatsame as amazon.com: comma thousands, dot decimal
listedSinceDatepopulated normally (the English label matches)
Bestseller category treeamazon.ca's own tree
History endpointsfull coverage, no free 400

The amazon.ca entry of /amazon-get-marketplaces (data is keyed by marketplace ID)

{
  "A2EUQ1WTGCTBG2": {
    "marketplace_domain": "amazon.ca",
    "marketplace_name": "Amazon CA",
    "currency_code": "CAD",
    "currency_name": "Canadian Dollar",
    "currency_symbol": "C$",
    "geo_location": "K1A 0A1"
  }
}

Which endpoints work on amazon.ca?

All ten. Six endpoints only check that the marketplace ID is valid and answer on every store; the three history endpoints read a data source covering 11 marketplaces, and amazon.ca is one of them. That is the opposite of amazon.ie and amazon.se in earlier posts in this series, where those three return a free 400 "This endpoint is not available for the requested marketplace" with no data.

Terminal-theme table of every SellerMagnet API endpoint answering for amazon.ca and what each costs
All nine listed endpoints (plus /amazon-get-marketplaces) answer on amazon.ca.

How do I compare amazon.ca with amazon.com in Python?

The script below reads listedSinceDate and a price-history point count for one ASIN on both stores, then reads the live offers of three ASINs on each store side by side. It skips anything that is not a 10-character ASIN before paying, because the offers endpoint bills a malformed ASIN like any other request, and it stops the whole run on a 401/403 instead of looping. It uses sellermagnet.py (ApiError, new_session) and retry.py (get_with_retry) from the Python quickstart.

canada_vs_us.py - amazon.ca vs amazon.com, both full-history marketplaces

"""Amazon Canada (amazon.ca) check: unlike several marketplaces earlier in this series, amazon.ca has full
endpoint coverage - including the history endpoints that return a free 400 on most other marketplaces.

Behaviour this relies on (re-checked 2026-11-01):
- marketplaceId A2EUQ1WTGCTBG2 = amazon.ca, priced in CAD (currencySymbol "C$" in the response, not plain
  "$"), default postcode K1A 0A1.
- amazon.ca is one of 11 marketplaces with full price/rank history, estimated sales and ASIN/EAN converter
  coverage; every other endpoint answers it too, so none of the ten endpoints return a free 400 for
  marketplace coverage here.
- Amazon's own first-party offers on amazon.ca carry seller ID A3DWYIK6Y9EEQB, not a shared "Amazon" ID.
- amazon.ca parses prices the same way as amazon.com (comma-thousands, dot-decimal), and the English "Date
  First Available" label matches normally, so productInfo.listedSinceDate is populated like on amazon.com,
  unlike amazon.se (no matching phrase) in an earlier post in this series.

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

MARKETS = {"CA": "A2EUQ1WTGCTBG2", "US": "ATVPDKIKX0DER"}   # both full-history marketplaces
FIRST_PARTY = {"A2EUQ1WTGCTBG2": "A3DWYIK6Y9EEQB", "ATVPDKIKX0DER": "ATVPDKIKX0DER"}
ASINS = ["B0CL61F39H", "B0CAONLY01", "B0NOOFFER1", "not-an-asin"]
MAX_FAILED = 3   # 502/503 are billed on every attempt: stop after 3 calls that keep failing


def product_info(session, asin, marketplace_id):
    """productInfo directly (not through lookup()): lookup() drops listedSinceDate and currencySymbol."""
    from sellermagnet import get   # the quickstart's low-level helper, used by lookup() internally
    return get(session, "amazon-product-lookup", asin=asin, marketplaceId=marketplace_id)["productInfo"]


def history_check(session, asin, marketplace_id):
    """One /amazon-product-statistics call. amazon.ca answers this (unlike amazon.se/amazon.ie earlier in
    this series); returns the number of buy-box price points on record, or None if there is no history yet."""
    from sellermagnet import get
    data = get(session, "amazon-product-statistics", asin=asin, marketplaceId=marketplace_id)
    series = (data.get("stats") or {}).get("buyBoxPriceHistory") or []
    return len(series)


def featured(data):
    """(price, currency symbol, currency code, holder, unique sellers) from one offers answer."""
    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
    currency = data.get("currency") or {}
    if data.get("buyBoxSuppressed") or not box.get("totalPrice"):
        return None, currency.get("symbol", ""), currency.get("code", ""), "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), currency.get("symbol", ""), currency.get("code", ""), holder, sellers


def main():
    session = new_session()
    failed = 0

    print("lookup: listedSinceDate and price history coverage")
    for code, marketplace in MARKETS.items():
        try:
            info = product_info(session, "B0CL61F39H", marketplace)
        except ApiError as err:
            if err.status in (401, 403):
                print(f"stopped: {err}")
                return
            print(f"{code:<5} error {err}")
            continue
        since = info.get("listedSinceDate") or "null"
        points = history_check(session, "B0CL61F39H", marketplace)
        print(f"{code:<5} listedSinceDate={since}  history points={points}")

    print(f"\n{'asin':<11} {'store':<5} {'featured':>10} {'sym':<4} {'code':<4} {'sellers':>7}  holder / note")
    for raw in ASINS:
        asin = raw.strip().upper()
        if not re.fullmatch(r"[A-Z0-9]{10}", asin):
            print(f"{raw:<11} {'-':<5} {'-':>10} {'-':<4} {'-':<4} {'-':>7}  skipped: not an ASIN (offers would bill it)")
            continue
        for code, marketplace in MARKETS.items():
            if failed >= MAX_FAILED:
                print(f"stopped after {MAX_FAILED} failed calls")
                return
            try:
                data = get_with_retry(session, "amazon-product-offers", asin=asin, marketplaceId=marketplace)
            except ApiError as err:
                if err.status in (401, 403):
                    print(f"stopped: {err}")
                    return
                label = "not listed in this store (billed 404)" if err.status == 404 else f"error {err}"
                print(f"{asin:<11} {code:<5} {'-':>10} {'-':<4} {'-':<4} {'-':>7}  {label}")
                failed += err.status >= 500
                continue
            except (requests.ConnectionError, requests.Timeout) as err:
                print(f"{asin:<11} {code:<5} {'-':>10} {'-':<4} {'-':<4} {'-':>7}  error {type(err).__name__}")
                failed += 1
                continue
            price, symbol, ccode, holder, sellers = featured(data)
            shown = f"{price:.2f}" if price is not None else "-"
            print(f"{asin:<11} {code:<5} {shown:>10} {symbol:<4} {ccode:<4} {sellers:>7}  {holder}")


if __name__ == "__main__":
    main()

Output (illustrative data: two stores, a billed 404, a retried 502 and a skipped input)

lookup: listedSinceDate and price history coverage
CA    listedSinceDate=2024-06-02  history points=14
US    listedSinceDate=2024-01-15  history points=21

asin        store   featured sym  code sellers  holder / note
B0CL61F39H  CA         59.99 C$   CAD        2  Amazon (A3DWYIK6Y9EEQB)
B0CL61F39H  US         54.99 $    USD        2  Amazon (ATVPDKIKX0DER)
B0CAONLY01  CA         24.99 C$   CAD        1  FBM seller A2CASELLER02
B0CAONLY01  US             - -    -          -  not listed in this store (billed 404)
B0NOOFFER1  CA             -                 0  no featured offer
B0NOOFFER1  US         12.50 $    USD        1  FBM seller A2USSELLER02
not-an-asin -              - -    -          -  skipped: not an ASIN (offers would bill it)

calls= 11
  • history points=14 vs 21 confirms both stores answer /amazon-product-statistics with real data; a marketplace without coverage would return a free 400 here instead of a number.
  • C$ vs $ on the same script output is the whole point: read currencyCode, never guess from the symbol alone, and note that amazon.ca's own symbol already tells the two apart in the response, unlike code fields that can repeat across marketplaces.
  • A1CASELLER01 appears twice on the CA offers (different delivery date); sellers counts distinct seller IDs, so it still shows 2, not 3.
  • B0CAONLY01 is a billed 404 on US: the offers endpoint answers an unknown ASIN with 404 "Invalid product" and charges the credit, even though it exists on amazon.ca.

What seller ID does Amazon use as a first-party seller on amazon.ca?

A3DWYIK6Y9EEQB. Every marketplace has its own first-party Amazon seller ID: amazon.com uses ATVPDKIKX0DER, amazon.ca uses A3DWYIK6Y9EEQB, and so on. A Buy Box held by "sellerId": "Amazon" carries the right marketplace-specific ID in amazonSellerId; comparing that value against the wrong store's ID will never match, even for a genuine Amazon-fulfilled offer.

Terminal-theme sequence of lookup and statistics calls on amazon.ca and amazon.com, both answering with full data
Both stores answer lookup and statistics; the CA response carries its own first-party seller ID and currency symbol.

What does an amazon.ca check cost?

1 credit per request, as on every store, including the history endpoints that are free on amazon.ie and amazon.se. The comparison script costs 4 credits per ASIN checked across both stores (lookup, statistics and offers), plus each billed retry: a 502 or 503 is charged on every attempt, a 500 without Retry-After is refunded. The example run made 11 calls: 2 lookups, 2 statistics checks, 6 offers checks for three ASINs and 1 retried 502. For the whole picture across stores, see API marketplace coverage and the marketplace IDs list.

Frequently Asked Questions

What is the Amazon Canada marketplace ID?

A2EUQ1WTGCTBG2. Pass it as marketplaceId and the request goes to amazon.ca, with prices in CAD. A country code like "CA" or a domain like "amazon.ca" is rejected with a free 400 Invalid marketplaceId.

Does the Amazon Canada API support price history?

Yes. amazon.ca is one of the 11 marketplaces with full /amazon-product-statistics, estimated sales and ASIN/EAN converter coverage, unlike amazon.ie and amazon.se covered earlier in this series, which return a free 400 on those three endpoints.

Is Amazon Canada's price shown in "$" the same as US dollars?

No. The response's currencySymbol for amazon.ca is "C$", not plain "$", and currencyCode is "CAD". Always read currencyCode when comparing or summing prices across marketplaces; never assume a bare "$" means USD.

What seller ID does Amazon itself use on amazon.ca?

A3DWYIK6Y9EEQB. It is not shared with amazon.com (ATVPDKIKX0DER) or any other store: a first-party Amazon offer on amazon.ca carries this ID in buyBox.amazonSellerId.

Does amazon.ca use its own bestseller category tree?

Yes. Category IDs must come from amazon.ca's own tree; an ID from another marketplace's tree, a US one for example, fails with "Invalid CategoryId", a billed 400.

Bottom line: use A2EUQ1WTGCTBG2 for amazon.ca, expect CAD with its own "C$" symbol, and every endpoint - including price history - answers without a gap to code around. To compare prices across more stores, see comparing Amazon prices across marketplaces; the offers endpoint page lists every field, and 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