Home / Blog / Amazon UAE Product API: amazon.ae Data in AED, No Default Postcode

Amazon UAE Product API: amazon.ae Data in AED, No Default Postcode

Get Amazon UAE product data with an API: marketplace ID A2VIGQ35RCS4UG queries amazon.ae and returns AED prices. What amazon.ae's missing default postcode means for shipping prices, which endpoints answer, and a tested Python script that checks the same ASINs on amazon.ae and amazon.sa.

November 03, 2026
6 min read
SellerMagnet Team
Share & Bookmark
Editor window showing the amazon.ae entry of the marketplace list, with an empty geo_location highlighted

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.
  • listedSinceDate is 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.

amazon.ae at a glance.
Itemamazon.ae
Marketplace IDA2VIGQ35RCS4UG
Storeamazon.ae
CurrencyAED (UAE Dirham), symbol written right to left
Default postcodenone (geo_location is an empty string)
listedSinceDatealways null (no Arabic date label matched)
Bestseller category treeamazon.ae's own: 29 top-level categories
Amazon's own seller IDA2KKU8J8O8784X
History endpointsfree 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.

Terminal-theme sequence: the marketplace list shows an empty geo_location for amazon.ae, then an offers call without geo_location returns delivery figures for Amazon's default location
amazon.ae has no default postcode: without geo_location, delivery figures follow Amazon's default location.

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.

Terminal-theme table of which SellerMagnet API endpoints answer for amazon.ae and what each costs
Six endpoints answer on amazon.ae; the three history endpoints return a free 400.

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 ship column there is for Amazon's default location. The item column 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 in amazonSellerId.
  • 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.

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