To use the SellerMagnet API as an Amazon UAE product API, call it with marketplaceId=A2VIGQ35RCS4UG: the request goes to amazon.ae and prices come back in AED. Offers, product lookup, search, deals, bestsellers and seller feedback all answer for amazon.ae; price history, sales estimates and the ASIN converter return a free 400. One detail matters more than anywhere else: amazon.ae has no default postcode, so shipping prices and delivery dates follow Amazon's default location unless you send one.
Key Takeaways
- amazon.ae is marketplace A2VIGQ35RCS4UG and is priced in AED.
- amazon.ae is the only one of the 23 marketplaces without a default postcode, so no delivery location is set unless you pass
geo_location. - Compare item prices (
priceWithoutShipping) across runs; shipping and delivery dates depend on the location Amazon applies. - Six endpoints answer on amazon.ae; statistics, estimated sales and the converter return a free 400 and no data.
listedSinceDateis always null on amazon.ae, and titles can come back in Arabic, so key your data on the ASIN.
What is different about the Amazon UAE product 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, the endpoint coverage and the delivery location. Prices come back as plain decimal numbers in AED, so you never parse the right-to-left dirham symbol yourself; use currency_code when you display them.
| Item | amazon.ae |
|---|---|
| Marketplace ID | A2VIGQ35RCS4UG |
| Store | amazon.ae |
| Currency | AED (UAE Dirham), symbol written right to left |
| Default postcode | none (geo_location is an empty string) |
| listedSinceDate | always null (no Arabic date label matched) |
| Bestseller category tree | amazon.ae's own: 29 top-level categories |
| Amazon's own seller ID | A2KKU8J8O8784X |
| History endpoints | free 400, no data |
The amazon.ae entry of /amazon-get-marketplaces as sent (keyed by marketplace ID; the dirham symbol arrives JSON-escaped)
{
"A2VIGQ35RCS4UG": {
"currency_code": "AED",
"currency_name": "UAE Dirham",
"currency_symbol": "\u062f.\u0625",
"geo_location": "",
"marketplace_domain": "amazon.ae",
"marketplace_name": "Amazon AE"
}
}
What changes on amazon.ae without a default postcode?
Every other marketplace has a default delivery postcode that the API tries to set when you do not send geo_location: 12271 on amazon.sa, 10115 on amazon.de. For amazon.ae that value is an empty string, so the API sets no delivery location at all. The offers endpoint then returns shippingPrice, totalPrice and deliveryDate for whatever location Amazon uses by default, which is not a UAE address you chose. Product lookup takes no location parameter, so its buyBoxInfo.price on amazon.ae is read the same way.
The fix is simple. Compare priceWithoutShipping, which does not include the delivery charge, and treat shipping and delivery dates as indicative. The API sets a delivery location only by sending geo_location to Amazon as a postcode, and no value has been tested that amazon.ae accepts, so there is no reliable way to pin a UAE address; the search location guide explains how the location step works on the other stores.

Endpoint coverage on amazon.ae
Six of the ten endpoints only check that the marketplace ID is valid, so they answer on all 23 marketplaces, amazon.ae included. The three history endpoints cover only 11 marketplaces and turn every other one away before the credit is taken: amazon.ae gets a 400 with the message "This endpoint is not available for the requested marketplace" followed by the list of supported stores. That call costs nothing, but it returns no data either. amazon.sa is in the same position.

How do I check amazon.ae and amazon.sa in Python?
The script below reads the marketplace list once to show each store's currency and default postcode, then reads the live offers of three ASINs on amazon.ae and amazon.sa side by side, in AED and SAR with no currency conversion. It prints the item price and the shipping separately, skips anything that is not a 10-character ASIN before paying (the offers endpoint bills a malformed ASIN like any other request) and stops the whole run on a 401/403. It uses sellermagnet.py (ApiError, new_session) and retry.py (get_with_retry) from the Python quickstart.
ae_vs_sa.py - the same ASINs on amazon.ae and amazon.sa
"""Amazon UAE (amazon.ae) product check: the same ASINs on amazon.ae and amazon.sa, prices in AED and SAR.
amazon.ae is marketplace A2VIGQ35RCS4UG, priced in AED. Two things to know before you trust a number:
1. amazon.ae has no default postcode: /amazon-get-marketplaces lists its geo_location as "". Without a
geo_location of your own, no delivery location is set, so shippingPrice, totalPrice and deliveryDate are
whatever Amazon shows for its default location. The item price (priceWithoutShipping) does not include
delivery, so this script compares item prices and prints delivery separately.
2. amazon.ae is not one of the 11 marketplaces with price history: statistics, estimated sales and the ASIN
converter answer it with a free 400. The script never sends those calls for amazon.ae.
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 = {"AE": "A2VIGQ35RCS4UG", "SA": "A17E79C6D8DWNP"} # amazon.ae (AED), amazon.sa (SAR)
GEO = {"AE": None, "SA": None} # None = the store's default postcode (amazon.ae has none)
HISTORY_MARKETS = {"ATVPDKIKX0DER", "A2EUQ1WTGCTBG2", "A1AM78C64UM0Y8", "A2Q3Y263D00KWC", "A1F83G8C2ARO7P",
"A1PA6795UKMFR9", "A13V1IB3VIYZZH", "APJ6JRA9NG5V4", "A1RKKUPIHCS9HS", "A21TJRUUN4KGV",
"A1VC38T7YXB528"} # the 11 marketplaces with statistics, estimated sales, converter
ASINS = ["B0CL61F39H", "B0AEONLY01", "B0NOOFFER1", "not-an-asin"]
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 the problem, so every further call would fail the same way."""
def call(session, endpoint, **params):
try:
return get_with_retry(session, endpoint, **params)
except ApiError as err:
if err.status in (401, 403):
raise Stop(str(err)) from err
raise
def store_notes(session):
"""One /amazon-get-marketplaces call (1 credit): currency and default postcode per store, keyed by ID."""
stores = call(session, "amazon-get-marketplaces")
notes = {}
for code, marketplace in MARKETS.items():
entry = stores.get(marketplace)
if not entry:
print(f"{code} {marketplace}: not in the marketplace list, skipped")
continue
geo = GEO[code] or entry.get("geo_location") or ""
history = "history yes" if marketplace in HISTORY_MARKETS else "history: free 400, not called"
where = f"postcode {geo}" if geo else "no postcode: Amazon's default delivery location"
print(f"{code} {entry['marketplace_domain']:<10} {entry['currency_code']} {where}; {history}")
notes[code] = geo
return notes
def featured(data):
"""(item, shipping, currency, holder, unique sellers); item 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", "")
item = box.get("priceWithoutShipping") or 0.0
if data.get("buyBoxSuppressed") or item <= 0: # 0.0 = no readable price, never a real price
return None, 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(item, 2), round(box.get("shippingPrice") or 0.0, 2), currency, holder, sellers
def row(asin, code, item="-", ship="-", cur="-", sellers="-", note=""):
print(f"{asin:<11} {code:<5} {item:>9} {ship:>7} {cur:<4} {sellers:>7} {note}")
def main():
session = new_session()
try:
geo = store_notes(session)
except Stop as err:
print(f"stopped: {err}")
return
except (ApiError, requests.ConnectionError, requests.Timeout) as err:
print(f"marketplace list failed: {err}")
return
failed = 0
print()
row("asin", "store", "item", "ship", "cur", "sellers", "holder / note")
for raw in ASINS:
asin = raw.strip().upper()
if not re.fullmatch(r"[A-Z0-9]{10}", asin):
row(raw, "-", note="skipped: not an ASIN (offers would bill it)")
continue
for code, marketplace in MARKETS.items():
if code not in geo:
continue
if failed >= MAX_FAILED:
print(f"stopped after {MAX_FAILED} failed calls")
return
params = {"asin": asin, "marketplaceId": marketplace}
if GEO[code]: # omitted = the store's default postcode, if it has one
params["geo_location"] = GEO[code]
try:
data = call(session, "amazon-product-offers", **params)
except Stop as err:
print(f"stopped: {err}")
return
except ApiError as err:
note = "not listed in this store (billed 404)" if err.status == 404 else f"error {err}"
row(asin, code, note=note)
failed += err.status >= 500
continue
except (requests.ConnectionError, requests.Timeout) as err:
row(asin, code, note=f"error {type(err).__name__}")
failed += 1
continue
item, ship, cur, holder, sellers = featured(data)
if item is None:
row(asin, code, cur=cur or "-", sellers=sellers, note=holder)
continue
row(asin, code, f"{item:.2f}", f"{ship:.2f}", cur, sellers, holder)
if __name__ == "__main__":
main()
Output (illustrative data: two stores, a billed 404, a retried 502 and a skipped input)
AE amazon.ae AED no postcode: Amazon's default delivery location; history: free 400, not called
SA amazon.sa SAR postcode 12271; history: free 400, not called
asin store item ship cur sellers holder / note
B0CL61F39H AE 1199.00 0.00 AED 2 Amazon (A2KKU8J8O8784X)
B0CL61F39H SA 1249.00 0.00 SAR 3 FBA seller A1SASELLER01
B0AEONLY01 AE 89.00 12.50 AED 1 FBM seller A4AESELLER04
B0AEONLY01 SA - - - - not listed in this store (billed 404)
B0NOOFFER1 AE - - - 0 no featured offer
B0NOOFFER1 SA 49.00 0.00 SAR 1 Amazon (A2XPWB6MYN7ZDK)
not-an-asin - - - - - skipped: not an ASIN (offers would bill it)
calls= 8
- no postcode on the amazon.ae line comes straight from the marketplace list: the
shipcolumn there is for Amazon's default location. Theitemcolumn excludes delivery, but which offer is featured can itself depend on the shipping location, so compare the same seller's item price between runs. - sellers counts distinct seller IDs: the offers list can show the same seller twice (different delivery date or condition), so
len(offers)overcounts. - Amazon (A2KKU8J8O8784X) is Amazon itself on amazon.ae: the offer says
sellerId"Amazon" and carries the first-party ID inamazonSellerId. - 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.
Why is listedSinceDate always null on amazon.ae?
The API reads amazon.ae in Arabic, the same as amazon.sa and amazon.eg. productInfo.listedSinceDate is set by matching the page's "Date First Available" label against one phrase list shared by every marketplace, and that list has no Arabic entry. So listedSinceDate stays null for every amazon.ae product; it is a label-matching gap, not a sign that the listing is new. The Arabic page also means that title and category names can come back in Arabic: join and deduplicate your data on the ASIN, never on the title.
amazon.ae has its own bestseller category tree
Yes. amazon.ie borrows the UK category tree because it has none of its own; amazon.ae is not in that alias list and has its own tree with 29 top-level categories and 21,946 nodes in total. The names are in English, the top level uses slugs such as electronics, and deeper IDs are numeric (Electronics > Accessories is 12303744031). Take category_id from the category explorer; an ID from another marketplace's tree fails with "Invalid CategoryId", a billed 400.
Credit cost of an amazon.ae check
1 credit per request, as on every store. The script costs 1 credit for the marketplace list plus 2 credits per ASIN (one offers 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 and the history endpoints' amazon.ae 400 are free. The example run made 8 calls: 1 for the list, 6 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 UAE marketplace ID?
A2VIGQ35RCS4UG. Pass it as marketplaceId and the request goes to amazon.ae, with prices in AED. A country code like "AE" or a domain like "amazon.ae" is rejected with a free 400 Invalid marketplaceId.
Which delivery location does the API use for amazon.ae?
None of its own. amazon.ae has no default postcode, so the API sets no delivery location there and shipping prices and delivery dates are the ones Amazon shows the session by default. geo_location is sent as a postcode and no value has been tested that amazon.ae accepts, so compare item prices (priceWithoutShipping) and treat delivery figures as indicative.
Can I get Amazon UAE price history?
Not from this API. Statistics, estimated sales and the ASIN converter cover 11 marketplaces and answer amazon.ae with a free 400 and no data. Store your own offers snapshots if you need a history.
Why is listedSinceDate null on amazon.ae?
The API reads amazon.ae in Arabic, and the label list it uses to find "Date First Available" has no Arabic entry. The field stays null for every amazon.ae product, so a null there says nothing about the listing's age.
Which category IDs work for amazon.ae bestsellers?
Only IDs from amazon.ae's own tree: 29 top-level slugs such as electronics, and numeric IDs below them. An ID from another marketplace's tree is a billed 400 Invalid CategoryId.
Bottom line: use A2VIGQ35RCS4UG for amazon.ae, expect AED, compare item prices rather than shipping, keep history calls for the 11 covered stores, and never read a null listedSinceDate there as "unknown". The offers endpoint page lists every field, and a free account includes 150 credits.