To get Amazon India product data, call the SellerMagnet API with marketplaceId=A21TJRUUN4KGV: the request goes to amazon.in and prices come back in INR. Unlike most non-US/UK/EU marketplaces, amazon.in is one of only 11 stores with full history support, so price history, sales estimates and the ASIN converter all answer with real data. What is different on amazon.in is that Amazon has no first-party selling account there, so amazonPrice is always null and shareBuyBox is always true, on every ASIN.
Key Takeaways
- amazon.in is marketplace A21TJRUUN4KGV, priced in INR, and is one of only 11 marketplaces with price history, sales estimate and ASIN converter support.
- Amazon has no first-party seller account on amazon.in, so
amazonPriceis always null andshareBuyBoxis always true in the statistics response, for every product. - On /amazon-product-offers,
buyBox.sellerIdcan never be "Amazon" for amazon.in. - amazon.in has its own bestseller category tree; it does not borrow another marketplace's IDs.
- Comparing amazon.in with amazon.de costs 2 credits per ASIN for offers, plus 1 credit per store for a statistics check.
What is different about the Amazon India API?
The request format is identical to every other store: GET, query parameters, the key in the X-Api-Key header. What changes are the currency and a handful of fields tied to Amazon not selling on amazon.in itself. The API resolves the amazon.in domain directly and reads prices in INR, so the decimal values you get back are plain numbers in that currency.
| Item | amazon.in |
|---|---|
| Marketplace ID | A21TJRUUN4KGV |
| Store | amazon.in |
| Currency | INR (Indian Rupee) |
| Default postcode | 110001 |
| Amazon's own seller ID | none (no first-party seller on amazon.in) |
| Bestseller category tree | amazon.in's own tree |
| History endpoints | answer (full price history) |
The amazon.in entry of /amazon-get-marketplaces (data is keyed by marketplace ID)
{
"A21TJRUUN4KGV": {
"marketplace_domain": "amazon.in",
"marketplace_name": "Amazon IN",
"currency_code": "INR",
"currency_name": "Indian Rupee",
"currency_symbol": "₹",
"geo_location": "110001"
}
}
Does the Amazon India API support price history?
Yes. The three history endpoints (statistics, sales estimate, ASIN converter) read from a data source that covers 11 marketplaces, and amazon.in is one of them, alongside amazon.com, amazon.co.uk, amazon.de, amazon.fr, amazon.co.jp, amazon.ca, amazon.it, amazon.es, amazon.com.mx and amazon.com.br. Every other marketplace, Ireland and Sweden included, gets a free 400 instead. So a price-tracking build that otherwise skips history for most EU/APAC stores can still track amazon.in in full.

Why is amazonPrice always null on amazon.in?
amazonPrice in the statistics response is read by looking up Amazon's own seller ID for that marketplace in the offer history. amazon.in has no first-party Amazon seller account (a former joint venture, Cloudtail, sells there as an ordinary third party), so the backend has no ID to look up and amazonPrice is always null, independent of the product. The same gap makes shareBuyBox always true: that field reports whether Amazon did NOT hold the Buy Box recently, and since Amazon is never a seller there, that condition is trivially always met. On /amazon-product-offers, this also means buyBox.sellerId can never read "Amazon" for amazon.in; the Buy Box always belongs to a real third-party or FBA seller.
How do I compare amazon.in with amazon.de in Python?
The script below reads the statistics answer for one ASIN on both stores to show the amazonPrice/shareBuyBox difference, 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.
in_vs_de.py - the same ASINs on amazon.in and amazon.de
"""Amazon India (amazon.in) product check: history + offers on amazon.in, next to amazon.de.
amazon.in is marketplace A21TJRUUN4KGV, priced in INR. Unlike most other non-core stores, amazon.in is one of
the 11 marketplaces with full price-history support (statistics, estimated sales, the ASIN converter all
answer it with real data, not a free 400). What is different on amazon.in is amazonPrice and shareBuyBox:
Amazon has no first-party seller account on amazon.in (a former joint venture, Cloudtail, sold as an ordinary
third party), so amazonPrice is always null and shareBuyBox is always true, on every ASIN, independent of who
actually holds the Buy Box. amazon.de behaves normally: it has a first-party Amazon seller ID, so amazonPrice
is populated when Amazon holds or held the Buy Box and shareBuyBox can be false.
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 = {"IN": "A21TJRUUN4KGV", "DE": "A1PA6795UKMFR9"} # amazon.in (INR), amazon.de (EUR)
HISTORY_MARKETS = {"ATVPDKIKX0DER", "A2EUQ1WTGCTBG2", "A1AM78C64UM0Y8", "A2Q3Y263D00KWC", "A1F83G8C2ARO7P",
"A1PA6795UKMFR9", "A13V1IB3VIYZZH", "APJ6JRA9NG5V4", "A1RKKUPIHCS9HS", "A21TJRUUN4KGV",
"A1VC38T7YXB528"} # the 11 marketplaces with full statistics, estimated sales, converter
ASINS = ["B0CL61F39H", "B0IEONLY01", "B0NOOFFER1", "not-an-asin"]
MAX_FAILED = 3 # 502/503 are billed on every attempt: stop after 3 calls that keep failing
def history_allowed(marketplace_id):
return marketplace_id in HISTORY_MARKETS
def amazon_price_info(data):
"""(amazonPrice minor units or None, shareBuyBox) from a statistics answer."""
return data.get("amazonPrice"), data.get("shareBuyBox")
def featured(data):
"""(price, currency, holder, unique sellers) from one offers answer; price None when nothing is featured."""
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 {}).get("code", "")
if data.get("buyBoxSuppressed") or not box.get("totalPrice"):
return None, currency, "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, holder, sellers # buyBox.totalPrice is not rounded upstream
def main():
session = new_session()
failed = 0
for code, marketplace in MARKETS.items():
note = "history endpoints answer" if history_allowed(marketplace) else \
"history endpoints skipped (free 400)"
print(f"{code} {marketplace}: {note}")
print("\nstatistics: amazonPrice / shareBuyBox")
for code, marketplace in MARKETS.items():
try:
stats = get_with_retry(session, "amazon-product-statistics", asin="B0CL61F39H", marketplaceId=marketplace)
except ApiError as err:
if err.status in (401, 403): # key or credits: every other call fails the same way
print(f"stopped: {err}")
return
print(f"{code:<5} error {err}")
continue
price, share = amazon_price_info(stats)
shown = "null (no first-party seller)" if price is None else f"{price / 100:.2f}"
print(f"{code:<5} amazonPrice={shown:<32} shareBuyBox={share}")
print(f"\n{'asin':<11} {'store':<5} {'featured':>10} {'cur':<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} {'-':>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): # key or credits: every other call fails the same way
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} {'-':>7} {label}")
failed += err.status >= 500
continue
except (requests.ConnectionError, requests.Timeout) as err:
print(f"{asin:<11} {code:<5} {'-':>10} {'-':<4} {'-':>7} error {type(err).__name__}")
failed += 1
continue
price, currency, holder, sellers = featured(data)
shown = f"{price:.2f}" if price is not None else "-"
print(f"{asin:<11} {code:<5} {shown:>10} {currency:<4} {sellers:>7} {holder}")
if __name__ == "__main__":
main()
Output (illustrative data: two stores, a billed 404, a retried 502 and a skipped input)
IN A21TJRUUN4KGV: history endpoints answer
DE A1PA6795UKMFR9: history endpoints answer
statistics: amazonPrice / shareBuyBox
IN amazonPrice=null (no first-party seller) shareBuyBox=True
DE amazonPrice=2299.00 shareBuyBox=False
asin store featured cur sellers holder / note
B0CL61F39H IN 2499.00 INR 2 FBA seller A1INSELLER01X
B0CL61F39H DE 229.99 EUR 3 Amazon (A3JWKAKR8XB7XF)
B0IEONLY01 IN 999.00 INR 1 FBM seller A3INSELLER03Z
B0IEONLY01 DE - - - not listed in this store (billed 404)
B0NOOFFER1 IN - 0 no featured offer
B0NOOFFER1 DE 15.99 EUR 1 FBM seller A4DESELLER04
not-an-asin - - - - skipped: not an ASIN (offers would bill it)
calls= 9
- sellers counts distinct seller IDs: the offers list can show the same seller twice (different delivery date or condition), so
len(offers)overcounts. - amazonPrice=null / shareBuyBox=true on amazon.in is not a data gap: the backend never has an Amazon seller ID to match for that marketplace, so this is the answer on every ASIN.
- not listed in this store (billed 404): the offers endpoint answers an unknown ASIN with 404 "Invalid product" and charges the credit. The ASIN may well exist on the other store.
- no featured offer with 0 sellers is a listing without offers on that page, not an error. Confirm a stock-out with a second check before acting on it.

Does amazon.in use its own bestseller category tree?
Yes. amazon.ie borrows the UK category tree because it has none of its own in the catalogue; amazon.in is not aliased that way, so category_id for amazon.in must come from amazon.in's own tree (category explorer). An ID from another marketplace's tree fails with "Invalid CategoryId", a billed 400.
What does an amazon.in check cost?
1 credit per request, as on every store. The comparison script costs 2 credits for the statistics check and 2 credits per ASIN for offers (one call per store), plus each billed retry: a 502 or 503 is charged on every attempt, a 500 without Retry-After is refunded. The 404 for an ASIN that a store does not have is billed; an invalid marketplace ID is free. The example run made 9 calls: 2 statistics checks, 6 offers calls 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 India marketplace ID?
A21TJRUUN4KGV. Pass it as marketplaceId and the request goes to amazon.in, with prices in INR. A country code like "IN" or a domain like "amazon.in" is rejected with a free 400 Invalid marketplaceId.
Does the Amazon India API return price history?
Yes. amazon.in is one of only 11 marketplaces with full price-history support, so /amazon-product-statistics, the sales estimate and the ASIN converter all answer it with real data, unlike most other marketplaces outside the US/UK/EU core.
Why is amazonPrice always null on amazon.in?
Amazon has no first-party seller account on amazon.in (a former joint venture, Cloudtail, sold there as an ordinary third party), so the backend has no Amazon seller ID to look up for that store and amazonPrice stays null on every call, regardless of the product.
What does shareBuyBox mean on amazon.in?
It is always true. shareBuyBox reports whether Amazon itself did NOT hold the Buy Box recently; since Amazon is never a seller on amazon.in, that condition is always met.
Does amazon.in use its own bestseller category tree?
Yes. Unlike amazon.ie, which borrows the UK category tree, amazon.in has its own tree in the catalogue, so category IDs from other marketplaces are rejected with a billed 400.
Bottom line: use A21TJRUUN4KGV for amazon.in, expect INR and full history support, but never expect amazonPrice to be populated there. 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.