To build on the Amazon UK product API, call the SellerMagnet API with marketplaceId=A1F83G8C2ARO7P: the request goes to amazon.co.uk and prices come back in GBP. Unlike the recent marketplace guides for stores such as amazon.se, amazon.nl and amazon.ae, amazon.co.uk is one of the 11 marketplaces with full price history support, so /amazon-product-statistics, estimated sales and the ASIN converter return real data here, not a free 400. Every endpoint below answers on amazon.co.uk.
Key Takeaways
- amazon.co.uk is marketplace A1F83G8C2ARO7P and is priced in GBP.
- amazon.co.uk is one of the 11 marketplaces with full price history: statistics, estimated sales and the ASIN converter all return real data, the headline difference from the recent free-400 marketplace guides (amazon.se, amazon.nl, amazon.ae).
- Amazon's first-party seller ID on amazon.co.uk is A3P5ROKL5A1OLE.
- The default delivery postcode is SW1A 1AA; amazon.co.uk has its own 47-top-level category tree, which amazon.ie borrows for its own bestsellers.
- Every endpoint used in this guide (lookup, offers, statistics, bestsellers, search) answers on amazon.co.uk for 1 credit each.
What is the Amazon UK product API marketplace ID?
A1F83G8C2ARO7P. The request format is the same as for every other store: GET, query parameters, the key in the X-Api-Key header. What changes is this one value and the currency: amazon.co.uk prices come back in GBP, not USD or EUR. A country code such as "UK" or "GB", or a domain such as "amazon.co.uk", is not a valid marketplaceId and is rejected with a free 400 before any credit is charged.
| Item | amazon.co.uk |
|---|---|
| Marketplace ID | A1F83G8C2ARO7P |
| Store | amazon.co.uk |
| Currency | GBP (British Pound) |
| Default postcode | SW1A 1AA |
| Price history (statistics) | real data, one of 11 covered marketplaces |
| Estimated sales / ASIN converter | real data, same 11 marketplaces |
| First-party seller ID | A3P5ROKL5A1OLE |
| Bestseller category tree | amazon.co.uk's own tree, 47 top-level categories |
The amazon.co.uk entry of /amazon-get-marketplaces (data is keyed by marketplace ID)
{
"A1F83G8C2ARO7P": {
"currency_code": "GBP",
"currency_name": "Great Britain Pound",
"currency_symbol": "£",
"geo_location": "SW1A 1AA",
"marketplace_domain": "amazon.co.uk",
"marketplace_name": "Amazon UK"
}
}
Does the API return price history for amazon.co.uk?
Yes, and that is what sets amazon.co.uk apart from most of the stores covered in this blog's recent marketplace guides. /amazon-product-statistics, /amazon-product-search-estimated-sells and the ASIN converter read from a history source that covers only 11 marketplaces; amazon.co.uk is one of them, next to amazon.com, amazon.de, amazon.fr, amazon.co.jp, amazon.ca, amazon.it, amazon.es, amazon.in, amazon.com.mx and amazon.com.br. Every other marketplace, including amazon.se, amazon.nl, amazon.ae, amazon.sa, amazon.eg, amazon.co.za, amazon.sg, amazon.com.au, amazon.pl, amazon.com.be, amazon.com.tr and amazon.ie, gets the free 400 "This endpoint is not available for the requested marketplace. Supported: amazon.com, .ca, .com.mx, .com.br, .co.uk, .de, .fr, .it, .es, .in and .co.jp." on those three endpoints. The script below calls statistics on amazon.co.uk and amazon.se side by side to show the difference directly.

How do I check lookup, offers, statistics, bestsellers and search in Python?
The script below walks all five endpoints on amazon.co.uk: it reads statistics on amazon.co.uk and amazon.se to show the history gate by contrast, looks up three ASINs and their live offers, resolves a bestsellers category, and runs one keyword search. It skips anything that is not a 10-character ASIN before paying, because /amazon-product-offers bills a malformed ASIN like any other request, reports a timeout or a failed call per row instead of losing the run, and 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.
uk_guide.py - lookup, offers, statistics, bestsellers and search on amazon.co.uk
"""Amazon UK (amazon.co.uk) product data walk-through: lookup, offers, statistics, bestsellers, search.
amazon.co.uk is marketplace A1F83G8C2ARO7P, priced in GBP. Unlike the recent marketplace guides for stores
such as amazon.se, amazon.nl or amazon.ae, amazon.co.uk is one of the 11 marketplaces with full price-history
support, so /amazon-product-statistics (and estimated sales, the ASIN converter) answer it with real history
data instead of the free 400 "This endpoint is not available for the requested marketplace. Supported: ...".
The script shows that by calling statistics on amazon.co.uk and on amazon.se side by side: the UK call returns
real series, the SE call gets the free 400 before any credit is charged.
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
UK = "A1F83G8C2ARO7P" # amazon.co.uk, GBP
SE = "A2NODRKZP88ZB9" # amazon.se, used only to show the history gate by contrast
UK_POSTCODE = "SW1A 1AA" # amazon.co.uk's default postcode; geo_location asks for it (best effort)
ASINS = ["B0CL61F39H", "B0UKNOFIND", "not-an-asin"]
MAX_FAILED = 3 # 502/503 are billed on every attempt: stop after 3 calls that keep failing
NETWORK = (requests.ConnectionError, requests.Timeout)
class Stop(Exception):
"""401/403: the key or the credits are gone, so every further call would fail the same way."""
def call(session, endpoint, **params):
"""get_with_retry (retries 429/502/503, a 500 once) on amazon.co.uk unless another marketplaceId is given."""
params.setdefault("marketplaceId", UK)
try:
return get_with_retry(session, endpoint, **params)
except ApiError as err:
if err.status in (401, 403):
raise Stop(str(err)) from None
raise
def history_coverage(session):
"""One /amazon-product-statistics call per store: UK answers, SE gets the free 400 (no credit on SE)."""
for code, marketplace in (("UK", UK), ("SE", SE)):
try:
data = call(session, "amazon-product-statistics", asin="B0CL61F39H", marketplaceId=marketplace)
except ApiError as err:
label = "free 400, no history here" if err.status == 400 else "error"
print(f"{code:<4} {label}: {err}")
continue
except NETWORK as err:
print(f"{code:<4} error {type(err).__name__}")
continue
history = (data.get("stats") or {}).get("salesRankHistory") or []
points = [rank for _, rank in history if rank != -1] # -1 = no rank recorded at that time
since = (data.get("listedSince") or "-")[:10] # "YYYY-MM-DD HH:MM:SS" or null
print(f"{code:<4} statistics OK, {len(points)} salesRankHistory points, listedSince {since}")
def featured_offer(data):
"""(price, 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
if data.get("buyBoxSuppressed") or not box.get("totalPrice"):
return None, "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), holder, sellers
def product_walk(session):
print(f"\n{'asin':<12} {'price GBP':>9} {'rank':>8} {'listedSince':<11} holder / note")
failed = 0
for raw in ASINS:
asin = raw.strip().upper()
if not re.fullmatch(r"[A-Z0-9]{10}", asin):
print(f"{raw:<12} {'-':>9} {'-':>8} {'-':<11} skipped: not an ASIN (offers would bill it)")
continue
if failed >= MAX_FAILED:
print(f"stopped after {MAX_FAILED} failed calls")
return
try: # the raw lookup answer: productInfo.listedSinceDate is not in the quickstart's trimmed lookup()
info = call(session, "amazon-product-lookup", asin=asin)["productInfo"]
except ApiError as err:
note = "not found (billed 404)" if err.status == 404 else f"error {err}"
print(f"{asin:<12} {'-':>9} {'-':>8} {'-':<11} {note}")
failed += err.status >= 500
continue
except NETWORK as err:
print(f"{asin:<12} {'-':>9} {'-':>8} {'-':<11} error {type(err).__name__}")
failed += 1
continue
rank = ((info.get("bestsellerRanks") or {}).get("main_category") or {}).get("rank") or "-"
listed = info.get("listedSinceDate") or "-" # YYYY-MM-DD or null
try:
offers = call(session, "amazon-product-offers", asin=asin, geo_location=UK_POSTCODE)
except ApiError as err:
note = "no offers page (billed 404)" if err.status == 404 else f"error {err}"
print(f"{asin:<12} {'-':>9} {rank:>8} {listed:<11} {note}")
failed += err.status >= 500
continue
except NETWORK as err:
print(f"{asin:<12} {'-':>9} {rank:>8} {listed:<11} error {type(err).__name__}")
failed += 1
continue
price, holder, sellers = featured_offer(offers)
shown = f"{price:.2f}" if price is not None else "-"
print(f"{asin:<12} {shown:>9} {rank:>8} {listed:<11} {holder} ({sellers} sellers)")
def bestsellers_top(session, category_id, count=5):
"""category_id: an ID from the UK tree (static/data/UK.json) or a category name. A name that fits several
categories or none, and an ID from another marketplace's tree, are free 400s: the category is resolved before
any credit is taken, and for a name the 400 body's `candidates` field lists the closest categories."""
try:
data = call(session, "amazon-bestsellers", category_id=category_id, count=count)
except ApiError as err:
if err.status == 400: # count is 5, so the billed "Count Max: 50" 400 cannot happen: this is the free one
print(f"bestsellers({category_id!r}): free 400, {err}")
else:
print(f"bestsellers({category_id!r}): error {err}")
return
except NETWORK as err:
print(f"bestsellers({category_id!r}): error {type(err).__name__}")
return
rows = data.get("bestsellers") or []
if not rows:
print(f"bestsellers({category_id!r}): 0 results on the page (billed like any 200)")
return
print(f"\nbestsellers({category_id!r}), top {len(rows)}:")
for r in rows:
p = r.get("price") or {}
price = f"{p['price']:.2f} {p.get('currency_code', '')}" if isinstance(p.get("price"), (int, float)) else "-"
print(f" #{r.get('rank')} {r.get('productTitle', '')[:55]:<55} {price}")
def search_top(session, query, count=5):
try:
data = call(session, "amazon-search", q=query, count=count)
except ApiError as err:
print(f"search({query!r}): error {err}")
return
except NETWORK as err:
print(f"search({query!r}): error {type(err).__name__}")
return
rows = data.get("searchResults") or []
print(f"\nsearch({query!r}), {len(rows)} results:")
for r in rows:
price = (r.get("listingPrice") or {}).get("price") or {}
tag = "sponsored" if r.get("sponsored") else "organic"
print(f" #{r.get('position')} {r.get('productTitle', '')[:50]:<50} "
f"{price.get('currency_symbol', '')}{price.get('total', '-')} ({tag})")
def main():
session = new_session()
try:
history_coverage(session)
product_walk(session)
bestsellers_top(session, "kitchen")
bestsellers_top(session, "not-a-real-category") # unknown name: free 400, no rows
search_top(session, "electric kettle")
except Stop as err:
print(f"stopped: {err}")
if __name__ == "__main__":
main()
Output (illustrative data: real history on UK, the free 400 on SE, a billed 404, an unknown category name and a skipped input)
UK statistics OK, 3 salesRankHistory points, listedSince 2021-03-11
SE free 400, no history here: 400: This endpoint is not available for the requested marketplace. Supported: amazon.com, .ca, .com.mx, .com.br, .co.uk, .de, .fr, .it, .es, .in and .co.jp.
asin price GBP rank listedSince holder / note
B0CL61F39H 409.00 412 2021-03-11 FBA seller A2UKSELLER02Y (3 sellers)
B0UKNOFIND - - - not found (billed 404)
not-an-asin - - - skipped: not an ASIN (offers would bill it)
bestsellers('kitchen'), top 2:
#1 Russell Hobbs 20150 Honeycomb Kettle 24.99 GBP
#2 Breville Curve Kettle 32.50 GBP
bestsellers('not-a-real-category'): free 400, 400: No category named 'not-a-real-category' on amazon.co.uk. Pass a category ID or a category name as Amazon shows it in that marketplace's language.
search('electric kettle'), 2 results:
#1 Russell Hobbs Kettle £24.99 (organic)
#2 Breville Curve Kettle £32.50 (sponsored)
- statistics real on UK, free 400 on SE confirms amazon.co.uk needs none of the workarounds the free-400 marketplace guides describe.
- sellers counts distinct seller IDs: the offers list can show the same seller twice (different delivery date or condition), so
len(offers)overcounts. - not found (billed 404): an unknown ASIN is charged on /amazon-product-lookup, the same as on every other store.
- bestsellers free 400: an unknown category name costs nothing; the message names the problem and the 400 body's
candidatesfield (not printed by the script) lists the closest categories, so fix the name before retrying.

Does amazon.co.uk have its own bestseller category tree?
Yes, and it is one of the larger ones: 47 top-level categories, with short English slugs such as kitchen for "Home & Kitchen" or electronics for "Electronics & Photo". amazon.ie has no category tree of its own, so its /amazon-bestsellers calls resolve against this same amazon.co.uk tree. A numeric ID from a different marketplace's tree, a German one for example, is a free 400 "Invalid CategoryId": the category is checked before any credit is taken. /amazon-bestsellers also accepts a category name instead of an ID. A name that matches several categories ("kettles" matches 3 on amazon.co.uk) or none is a free 400 too, and its body carries a candidates list of the closest categories; the "not-a-real-category" call in the output above is that free 400 for an unknown name.
What does an amazon.co.uk check cost?
1 credit per request, as on every store. The guide script above makes 2 statistics calls (1 billed on UK, 0 on the free-400 SE check), up to 2 calls per ASIN (lookup plus offers, with a billed retry on a 502/503), 2 bestsellers calls (1 billed, 1 free 400) and 1 search call. A 502 or 503 is charged on every attempt; a 500 without Retry-After is refunded and retried once. Invalid marketplace IDs, bestseller categories that do not resolve and the history endpoints' free-400 gate on other stores cost nothing. For the full picture across stores, see API marketplace coverage and the marketplace IDs list.
Frequently Asked Questions
What is the Amazon UK marketplace ID for the API?
A1F83G8C2ARO7P. Pass it as marketplaceId and the request goes to amazon.co.uk, with prices in GBP. A country code like "UK" or "GB", or a domain like "amazon.co.uk", is rejected with a free 400 Invalid marketplaceId.
Does the Amazon product API return price history for amazon.co.uk?
Yes. amazon.co.uk is one of the 11 marketplaces with full price history support, so /amazon-product-statistics, estimated sales and the ASIN converter all return real data, unlike amazon.se, amazon.nl, amazon.ae and most other non-core stores, which get a free 400.
What is Amazon's first-party seller ID on amazon.co.uk?
A3P5ROKL5A1OLE. A Buy Box held by that ID, or shown as the generic "Amazon" seller, means Amazon itself is the featured seller on that listing, not a third party.
What is the default postcode for Amazon UK API requests?
SW1A 1AA. Omit geo_location and the request asks Amazon for SW1A 1AA (best effort); pass geo_location on /amazon-product-offers or /amazon-search to ask for a different delivery postcode instead (best effort as well).
Can I pass a category name instead of a category ID for amazon.co.uk bestsellers?
Yes. /amazon-bestsellers accepts a category ID (e.g. "kitchen") or a category name. A name that matches several categories, or none, is a free 400 before any credit is spent, and the 400 body's candidates field lists the closest categories to pick from.
Does amazon.ie use the amazon.co.uk category tree?
Yes, the other way round from this post's main story: amazon.ie has no category tree of its own, so its /amazon-bestsellers calls resolve against amazon.co.uk's tree, the one this post measures at 47 top-level categories.
Bottom line: use A1F83G8C2ARO7P for amazon.co.uk, expect GBP, and trust the history endpoints here the same way you would on amazon.com or amazon.de, since amazon.co.uk is one of the 11 covered marketplaces, not one of the free-400 stores. To compare amazon.co.uk with another store, see comparing Amazon prices across marketplaces; the offers endpoint page lists every field, and a free account includes 150 credits.