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.
| Item | amazon.ca |
|---|---|
| Marketplace ID | A2EUQ1WTGCTBG2 |
| Store | amazon.ca |
| Currency | CAD (currencySymbol "C$", not plain "$") |
| Default postcode | K1A 0A1 |
| Number format | same as amazon.com: comma thousands, dot decimal |
| listedSinceDate | populated normally (the English label matches) |
| Bestseller category tree | amazon.ca's own tree |
| History endpoints | full 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.

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-statisticswith 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, unlikecodefields that can repeat across marketplaces. A1CASELLER01appears twice on the CA offers (different delivery date);sellerscounts distinct seller IDs, so it still shows 2, not 3.B0CAONLY01is 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.

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.