Use cases / Amazon Products API
MAP enforcement on Amazon
Last updated September 28, 2026. Response excerpts are recorded from the live API.
Who
Who runs this, and what for
| Team | What they decide with it |
|---|---|
| Brand protection teams | Which sellers to contact or report today, with the price and date as evidence. |
| Channel and distribution managers | Which authorised resellers break the policy, and how often. |
| Agencies managing brands on Amazon | What to put in each client's weekly compliance report. |
Pipeline
The calls, step by step
01Search the brand
Search with q and brand returns the brand's listings with the featured price and, in other_offers, the lowest price among the other sellers and how many there are. That is enough to spot a violation without opening every product.
GET /v1/search?engine=amazon&q=wireless+mouse&prime=true&page=1 · results.0
{ "position": 1, "asin": "B004YAVF8I", "title": "Logitech M185 Compact Ambidextrous 2.4 GHz Wireless Mouse - Swift Grey", "url": "https://www.amazon.com/dp/B004YAVF8I", "price_text": "$13.99", "price": 13.99, "currency": "USD", "original_price_text": "$17.99", "original_price": 17.99, "rating": 4.4, "ratings_count": 45089, "badge": "Overall Pick", "sales_volume": "10K+ bought in past month", "image_url": "https://m.media-amazon.com/images/I/51WN5aXZWIL._AC_UY218_.jpg", "sponsored": false, "is_prime": true, "delivery": "FREE delivery Tomorrow, Sep 26", "coupon": null, "other_offers": { "min_price_text": "$6.58", "min_price": 6.58, "count": 8 } }Recorded response. Live values differ. 02Open offers only where the price is below MAP
For each watched ASIN whose price or other_offers.min_price is below its MAP, the offers endpoint lists every seller with condition, price, delivery, and the seller's id, name, and rating.
GET /v1/product/offers?engine=amazon&asin=1098145356 · offers.0
{ "position": 1, "condition": "New", "price_text": "$40.94", "price": 40.94, "currency": "USD", "original_price_text": "$65.99", "original_price": 65.99, "delivery": "$33.04 delivery October 14 - 30.", "ships_from": "Pensive Keyboard Books", "seller": { "id": "A245R8VFMDKNT1", "name": "Pensive Keyboard Books", "rating": 3, "ratings_count": 225, "positive_percent": 52 } }Recorded response. Live values differ. 03Identify the seller
The seller endpoint returns the business name and address Amazon shows for a seller id, with its feedback. That is who a notice goes to.
GET /v1/seller?engine=amazon&seller_id=AWZI6BA70DZZD · seller
{ "id": "AWZI6BA70DZZD", "name": "M + L", "url": "https://www.amazon.com/sp?seller=AWZI6BA70DZZD", "storefront_url": "https://www.amazon.com/s?me=AWZI6BA70DZZD", "logo_url": "https://m.media-amazon.com/images/I/41FV8yzLbkL.jpg", "rating": 3.5, "ratings_count": 2229, "positive_percent": 61, "ratings": { "last_30_days": { "rating": 3.1, "ratings_count": 332 }, "last_90_days": { "rating": 3.2, "ratings_count": 823 }, "last_12_months": { "rating": 3.5, "ratings_count": 2229 }, "lifetime": { "rating": 4.5, "ratings_count": 43640 } }, "rating_distribution": { "1": 8, "2": 1, "3": 2, "4": 5, "5": 84 }, "business_name": "Marc & Lukas GmbH", "business_address": "Kaiserswerther Str. 85D, Ratingen, NRW, 40878, DE", "about": "Contact us: service.us@mplusl.de", "feedback": [ { "rating": 5, "text": "Puzzle arrived on time. Excellent condition.", "author": "Diana M.", "date": "2026-09-23" } ] }Recorded response. Live values differ.
Code
A script to start from
map_check.py
# MAP check: find listings of a brand's products priced below the minimum
# advertised price, and name the sellers behind each.
import csv, os, requests
API = "https://api.clair.im"
HEADERS = {"Authorization": f"Bearer {os.environ['CLAIR_API_KEY']}"}
BRAND = "Logitech"
MAP = {"B004YAVF8I": 14.99, "B015NBTAOW": 49.99} # ASIN -> minimum advertised price
ZIP = "10001"
def get(path, **params):
r = requests.get(f"{API}{path}", headers=HEADERS, timeout=90,
params={"engine": "amazon", "zip_code": ZIP, **params})
r.raise_for_status()
return r.json()
with open("map_violations.csv", "w", newline="") as f:
out = csv.writer(f)
out.writerow(["asin", "map", "seller_id", "seller", "condition", "price"])
for page in range(1, 4): # the brand's first three result pages
body = get("/v1/search", q=BRAND, brand=BRAND, page=page)
for item in body["results"]:
floor = MAP.get(item["asin"])
prices = [item["price"], (item["other_offers"] or {}).get("min_price")]
lowest = min((p for p in prices if p), default=None)
if floor is None or lowest is None or lowest >= floor:
continue # not a watched ASIN, or nobody is below MAP
for offer in get("/v1/product/offers", asin=item["asin"])["offers"]:
if offer["condition"] == "New" and offer["price"] < floor:
out.writerow([item["asin"], floor, offer["seller"]["id"],
offer["seller"]["name"], offer["condition"], offer["price"]])
if not body["next_cursor"]:
break
Set CLAIR_API_KEY to a key subscribed to the Amazon Products API. Each call is one request against that API's monthly quota.
Cost
What it costs per month
| Schedule | Requests | Plan | Per month | Per 1,000 |
|---|---|---|---|---|
| 1 brand, 3 search pages, daily90 search pages plus about 5 offers calls a day = 240 requests. | 240 | Pay as you go | $4.82 | $20.08 |
| 200 ASINs checked individually, daily6,000 product calls plus about 20 offers calls a day = 6,600 requests. | 6,600 | Pro | $89.20 | $13.52 |
| 5 brands in 3 marketplaces, daily1,350 search pages plus about 15 offers calls a day = 1,800 requests. | 1,800 | Pay as you go | $36.18 | $20.10 |
Measured
Response times
| Amazon Products API | |
|---|---|
| Succeeded | 6 of 7 |
| Median response time | 15.1 s |
| 95th percentile | 18.5 s |
| Had price | 83% |
| Had availability | 100% |
| Had sold by | 100% |
| Had rating | 100% |
| Had best sellers rank | 100% |
| Had variants | 83% |
Limits
What to plan for
- Prices follow the delivery location. Check from the zip_code your policy is enforced for; a seller can price differently by region.
- Search shows a brand's listings as Amazon ranks them, up to 10 pages. For a long catalogue, check watched ASINs with the product endpoint instead.
- Keep condition in mind: many MAP policies cover new items only, and used offers are allowed below MAP.
- Amazon changes prices many times a day. A daily check records the price at that moment; store the response time as evidence.
FAQ
Common questions
What is MAP?
Minimum advertised price: the lowest price a brand allows resellers to advertise. It is a brand policy enforced through reseller agreements, not an Amazon rule.
Does the Buy Box price tell me enough?
No. A seller below MAP may not hold the Buy Box. other_offers.min_price in search, or the offers endpoint, shows every seller's price.
Can I watch other marketplaces?
Yes: us, gb, ca, au, in, de, es, nl, be, and jp. Each has its own sellers and prices, so check each one your policy covers.
Run it on your own products
200 requests a month free on each API, no card. Enough to run the pipeline on a short list before choosing a plan.
Bloomberg News API
Associated Press API
Glassdoor API
Greenhouse Jobs API

Crunchbase API
Website Contacts API