To use the SellerMagnet API as an Amazon Turkey product API, call it with marketplaceId=A33AVAJ2PDY3EV: the request goes to amazon.com.tr and prices come back in TRY. Offers, product lookup, search, deals, bestsellers and seller feedback all answer for amazon.com.tr. Price history, sales estimates and the ASIN converter do not; they reject it with a free 400. So if you need a price history for Turkey, you record it yourself, one offers call per ASIN per day.
Key Takeaways
- amazon.com.tr is marketplace A33AVAJ2PDY3EV and is priced in TRY (Turkish Lira).
- Six endpoints answer on amazon.com.tr; statistics, estimated sales and the converter return a free 400 and no data.
listedSinceDatecomes back null on amazon.com.tr: the Turkish Date First Available label is not recognised, the same gap amazon.se has.- When Amazon itself holds the featured offer, the offers endpoint shows sellerId "Amazon" with amazonSellerId A1UNQM1SR2CHM.
- A daily snapshot of the offers endpoint costs 1 credit per ASIN and gives you the history the API does not keep for this store.
What is different about the Amazon Turkey 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 the marketplace values, the endpoint coverage and two fields that behave differently. The decimal prices you get back are plain numbers in TRY, so the period-thousands, comma-decimal format amazon.com.tr shows on its pages only matters if you parse a raw price string yourself.
| Item | amazon.com.tr |
|---|---|
| Marketplace ID | A33AVAJ2PDY3EV |
| Store | amazon.com.tr |
| Currency | TRY (Turkish Lira, symbol ₺) |
| Default geo_location (postcode) | 06690 |
| Amazon's own seller ID (offers) | A1UNQM1SR2CHM in amazonSellerId |
| listedSinceDate | null (Turkish label not recognised) |
| Price number format | period thousands, comma decimal: 1.299,99 |
| Bestseller category tree | amazon.com.tr's own tree, Turkish names |
| History endpoints | free 400, no data |
The amazon.com.tr entry of /amazon-get-marketplaces (data is keyed by marketplace ID)
{
"A33AVAJ2PDY3EV": {
"marketplace_domain": "amazon.com.tr",
"marketplace_name": "Amazon TR",
"currency_code": "TRY",
"currency_name": "Turkish Lira",
"currency_symbol": "₺",
"geo_location": "06690"
}
}
Which endpoints work on amazon.com.tr?
Six of the ten endpoints only check that the marketplace ID is valid, so they answer on all 23 marketplaces, amazon.com.tr included. The three history endpoints read a data source that covers only 11 marketplaces and turn every other one away before the credit is taken: amazon.com.tr 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. The full matrix for every store is in API marketplace coverage.

Why is listedSinceDate null on amazon.com.tr?
/amazon-product-lookup fills listedSinceDate from the Date First Available line of the product page, and it only recognises that line in English, German, Spanish, Italian, French, Portuguese, Dutch, Polish and Japanese. amazon.com.tr shows it in Turkish, so expect listedSinceDate: null for amazon.com.tr listings, the same as on amazon.se (see the Amazon Sweden guide). Treat the null as "unknown", never as "new listing". If you need a listing age, the first date an ASIN appears in your own snapshot file is a lower bound for how long it has been live, not the date it was created.
How do I build an amazon.com.tr price history in Python?
Run one offers call per ASIN per day and append what you read to a CSV file. The script below cleans the ASIN list first (a malformed ASIN is billed by the offers endpoint, so it never gets sent), reads the featured offer in TRY, and compares it with the last reading of the same ASIN. A failed call writes no row, so a bad day never overwrites the last good baseline, and a day without a featured offer is recorded as a gap that the next price is not compared across. It stops on a 401/403 and after three calls that keep failing. It uses sellermagnet.py (ApiError, new_session) and retry.py (get_with_retry) from the Python quickstart.
tr_snapshot.py - one featured-offer reading per ASIN per day on amazon.com.tr
"""Daily amazon.com.tr price snapshot: build your own TRY price history, one offers call per ASIN per run.
amazon.com.tr is marketplace A33AVAJ2PDY3EV, priced in TRY. The statistics, estimated sales and converter
endpoints answer it with a free 400, so there is no recorded history to download. This script records one
featured-offer reading per ASIN per run in a CSV file and compares it with the last reading of that ASIN.
A failed call writes no row, so a bad run never replaces the last good baseline.
Helpers: sellermagnet.py and retry.py from https://sellermagnet-api.com/blog/amazon-product-api-python
"""
import csv
import datetime as dt
import os
import re
import requests
from retry import get_with_retry
from sellermagnet import ApiError, new_session
MARKETPLACE = "A33AVAJ2PDY3EV" # amazon.com.tr, prices in TRY
AMAZON_TR = "A1UNQM1SR2CHM" # Amazon's own seller ID on amazon.com.tr (offers: amazonSellerId)
ASINS = ["B0CL61F39H", "B0TRSAMPL2", "B0TRSAMPL3", "b0trsampl2 ", "B0TRSAMPL4", "4.00638E+12"]
SNAPSHOTS = "tr_snapshots.csv"
FIELDS = ["date", "asin", "price_try", "holder", "fulfillment", "sellers"]
MOVE = 0.05 # flag a featured-price move of 5 % or more between two readings
MAX_FAILED = 3 # 502/503 are billed on every attempt: stop after 3 calls that keep failing
def clean_asins(raw_list):
"""Normalise, drop what is not an ASIN and drop repeats BEFORE paying: offers bills a malformed ASIN."""
seen, good, skipped = set(), [], []
for raw in raw_list:
asin = raw.strip().upper()
if not re.fullmatch(r"[A-Z0-9]{10}", asin):
skipped.append((raw, "not an ASIN")) # e.g. a barcode that Excel turned into 4.00638E+12
elif asin in seen:
skipped.append((raw, "duplicate"))
else:
seen.add(asin)
good.append(asin)
return good, skipped
def last_readings(path):
"""The newest row per ASIN from earlier runs (the file only ever holds successful readings)."""
last = {}
if os.path.exists(path):
with open(path, newline="", encoding="utf-8") as fh:
for row in csv.DictReader(fh):
last[row["asin"]] = row
return last
def reading(data):
"""One offers answer -> (price or None, holder, fulfillment, unique sellers)."""
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"): # {} or 0.0 is not a price
return None, "none", "", sellers
holder = "Amazon" if box.get("sellerId") == "Amazon" else box.get("sellerId", "?")
if holder == "Amazon" and box.get("amazonSellerId") not in (None, AMAZON_TR):
holder = f"Amazon ({box['amazonSellerId']})"
return round(box["totalPrice"], 2), holder, box.get("fulfillmentType", ""), sellers # totalPrice: not rounded
def compare(old, price, holder):
"""Plain-text change versus the last reading; a gap in the featured offer is never bridged."""
if old is None:
return "first reading" if price is not None else "first reading, no featured offer"
old_price = float(old["price_try"]) if old["price_try"] else None
notes = []
if price is None and old_price is None:
notes.append("still no featured offer")
elif price is None:
notes.append(f"no featured offer (was {old_price:.2f} on {old['date']})")
elif old_price is None:
notes.append(f"featured offer back, gap since {old['date']} (not compared)")
else:
change = (price - old_price) / old_price
flag = " <- move" if abs(change) >= MOVE else ""
notes.append(f"{change:+.1%} vs {old['date']}{flag}")
if old["holder"] != holder and price is not None and old_price is not None:
notes.append(f"holder {old['holder']} -> {holder}")
return ", ".join(notes)
def main(today=None, path=SNAPSHOTS):
today = today or dt.date.today().isoformat()
session = new_session()
asins, skipped = clean_asins(ASINS)
last = last_readings(path)
print(f"amazon.com.tr {MARKETPLACE} {today}: no history endpoints here (free 400), this file is the history")
for raw, why in skipped:
print(f"{raw.strip():<11} skipped: {why}, no call made")
rows, failed = [], 0
print(f"{'asin':<11} {'TRY':>9} {'holder':<14} {'ff':<3} {'sellers':>7} change")
for asin in asins:
if failed >= MAX_FAILED:
print(f"stopped after {MAX_FAILED} failed calls; earlier readings are kept")
break
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}")
break
note = "not listed on amazon.com.tr (billed 404)" if err.status == 404 else f"error {err}"
print(f"{asin:<11} {'-':>9} {'-':<14} {'-':<3} {'-':>7} {note}, no row written")
failed += err.status >= 500
continue
except (requests.ConnectionError, requests.Timeout) as err:
print(f"{asin:<11} {'-':>9} {'-':<14} {'-':<3} {'-':>7} error {type(err).__name__}, no row written")
failed += 1
continue
price, holder, ff, sellers = reading(data)
shown = f"{price:.2f}" if price is not None else "-"
change = compare(last.get(asin), price, holder)
print(f"{asin:<11} {shown:>9} {holder:<14} {ff or '-':<3} {sellers:>7} {change}")
rows.append({"date": today, "asin": asin, "price_try": "" if price is None else f"{price:.2f}",
"holder": holder, "fulfillment": ff, "sellers": sellers})
new_file = not os.path.exists(path)
with open(path, "a", newline="", encoding="utf-8") as fh:
writer = csv.DictWriter(fh, fieldnames=FIELDS)
if new_file:
writer.writeheader()
writer.writerows(rows)
print(f"{len(rows)} readings appended to {path}")
if __name__ == "__main__":
main()
Two daily runs (illustrative data: a 5.5 % move, a 503 that keeps failing, a gap, a billed 404 and two skipped inputs)
$ python3 tr_snapshot.py # run 1, 2026-11-02
amazon.com.tr A33AVAJ2PDY3EV 2026-11-02: no history endpoints here (free 400), this file is the history
b0trsampl2 skipped: duplicate, no call made
4.00638E+12 skipped: not an ASIN, no call made
asin TRY holder ff sellers change
B0CL61F39H 1249.00 Amazon FBA 2 first reading
B0TRSAMPL2 349.90 A1TRSHOP04 FBM 1 first reading
B0TRSAMPL3 - none - 0 first reading, no featured offer
B0TRSAMPL4 - - - - not listed on amazon.com.tr (billed 404), no row written
3 readings appended to tr_snapshots.csv
$ python3 tr_snapshot.py # run 2, 2026-11-03
amazon.com.tr A33AVAJ2PDY3EV 2026-11-03: no history endpoints here (free 400), this file is the history
b0trsampl2 skipped: duplicate, no call made
4.00638E+12 skipped: not an ASIN, no call made
asin TRY holder ff sellers change
B0CL61F39H 1179.90 A3TRSELLER9 FBA 2 -5.5% vs 2026-11-02 <- move, holder Amazon -> A3TRSELLER9
B0TRSAMPL2 - - - - error 503: Temporarily unavailable, no row written
B0TRSAMPL3 219.50 A2TRSTORE7 FBM 1 featured offer back, gap since 2026-11-02 (not compared)
B0TRSAMPL4 - - - - not listed on amazon.com.tr (billed 404), no row written
2 readings appended to tr_snapshots.csv
- -5.5% vs 2026-11-02 <- move: the featured price fell 5 % or more since the last reading, and a third-party seller took the featured offer from Amazon.
- error 503, no row written:
get_with_retrytried four times and every attempt was billed. No row was written, so tomorrow's run still compares with the 2 Nov reading. - featured offer back, gap since 2026-11-02 (not compared): on 2 Nov the listing had no featured offer. The new price is recorded, but not compared with an older price across the gap.
- sellers counts distinct seller IDs: the offers list can show the same seller twice (a different delivery date or condition), so
len(offers)overcounts. - not listed on amazon.com.tr (billed 404): the ASIN may exist on another store, but this check still cost a credit.

Does amazon.com.tr use its own bestseller category tree?
Yes. amazon.ie borrows the UK category tree because it has none of its own; amazon.com.tr is not in that alias list, so category_id for /amazon-bestsellers must come from amazon.com.tr's own tree, which you can browse in the category explorer. On 1 Nov 2026 that tree held 14,991 category nodes under 21 top-level departments, named in Turkish (Elektronik, Bilgisayarlar, Ev ve Mutfak). Top-level IDs are slugs such as electronics; deeper IDs are numeric, for example 13709880031 for Cep Telefonları ve Aksesuarlar (mobile phones and accessories). None of its numeric IDs appears in the German tree, so a German numeric category ID on amazon.com.tr fails with "Invalid CategoryId", a billed 400.
What does an amazon.com.tr snapshot cost?
1 credit per request, as on every store. The snapshot costs 1 credit per ASIN per day, 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 the store does not have is billed; an invalid marketplace ID and the history endpoints' 400 for amazon.com.tr are free, and the inputs the script skips are never sent. The example made 12 calls and every one was billed: 5 on day one (4 ASINs plus one retried 502) and 7 on day two (3 ASINs plus four attempts on the 503). For 100 ASINs a daily run is about 3,000 credits a month before retries; plans and prices are on the pricing page.
Frequently Asked Questions
What is the Amazon Turkey marketplace ID?
A33AVAJ2PDY3EV. Pass it as marketplaceId and the request goes to amazon.com.tr, with prices in TRY. A country code like TR or a domain like amazon.com.tr is rejected with a free 400 Invalid marketplaceId.
Can I get Amazon Turkey price history from the API?
No. The statistics, estimated sales and converter endpoints cover 11 marketplaces and answer amazon.com.tr with a free 400. Record your own daily offers readings instead, as the snapshot script in this post does.
Why is listedSinceDate null on amazon.com.tr?
The API recognises the Date First Available label in English, German, Spanish, Italian, French, Portuguese, Dutch, Polish and Japanese, but not in Turkish, so on amazon.com.tr the field comes back null. A null is not a sign of a new listing.
How do I tell when Amazon itself holds the featured offer on amazon.com.tr?
In /amazon-product-offers the featured offer has sellerId "Amazon" and amazonSellerId A1UNQM1SR2CHM, Amazon's own seller ID on amazon.com.tr. Third-party offers carry their own seller ID and amazonSellerId null.
Can I reuse German category IDs for amazon.com.tr bestsellers?
Not the numeric ones. amazon.com.tr has its own tree with Turkish names and shares no numeric IDs with the German tree, so a German numeric ID fails with Invalid CategoryId, a billed 400. Top-level slugs such as electronics exist on both.
What does a daily amazon.com.tr snapshot cost?
1 credit per ASIN per day for the offers call, plus every retried 502 or 503 attempt. A 404 is billed, a 500 without Retry-After is refunded, and inputs the script skips cost nothing.
Bottom line: use A33AVAJ2PDY3EV for amazon.com.tr, expect TRY prices, a null listedSinceDate and amazon.com.tr's own category tree, and keep the history endpoints for the 11 covered stores. For Turkey, the price history is the one you record. Other store IDs are in the marketplace IDs list; the offers endpoint page lists every field, and a free account includes 150 credits.