To see whether a competitor on Amazon uses a repricer, count how often their price changes. /api/amazon-product-statistics returns a recorded price history under data.offers for each seller among up to 20 live offers, New condition only, so one call is enough: count the changes per seller over the last 30 days, and a seller with several changes a day is very likely automated. Knowing that before you lower your price tells you whether the answer will come within minutes to hours.
Key Takeaways
- data.offers holds one entry per live New-condition seller, keyed by seller ID, with isFBA and a priceHistory.
- priceHistory entries are [time, price, shipping] in minor units; add price and shipping for the landed price.
- Count changes between consecutive recorded points; two or more a day is the pattern of an automated repricer.
- Recorded changes are a lower bound: a change between two observations is not in the history.
- One call covers up to 20 live offers (New kept); on crowded listings some sellers are missing, and sellers who left are never included.
What price data does the API have per seller?
Each entry in data.offers is keyed by seller ID - Amazon under its own seller ID - and carries isFBA, lastUpdated and priceHistory, a list of ["YYYY-MM-DD HH:MM:SS", price, shipping] in UTC and in minor units. Only live New-condition offers are included, and a seller with both an FBA and an FBM offer appears once. A point is added only when a check finds a different price, and offers are checked at irregular intervals, so a repricer on a rarely checked listing can look occasional. Compare sellers on the same listing: they share the same checks.
Per-seller price history in the statistics response (trimmed, example values)
{
"success": true,
"data": {
"offers": {
"A2I59UVTUWUFH0": {
"isFBA": true,
"lastUpdated": "2026-09-26 18:40:00",
"priceHistory": [["2026-09-26 06:10:00", 41999, 0], ["2026-09-26 09:12:00", 41949, 0],
["2026-09-26 12:02:00", 42049, 0]]
},
"ATVPDKIKX0DER": {"isFBA": true, "lastUpdated": "2026-09-26 18:40:00",
"priceHistory": [["2026-08-02 10:00:00", 44999, 0]]}
}
}
}
How do I count each seller's price changes?
price_activity() turns every seller's history into landed prices, keeps the last 30 days and counts how often consecutive prices differ. It skips prices that could not be read (negative values), counts an unspecified shipping cost (-1) as 0, and divides by the days a newly arrived seller has actually been on the listing. get() and new_session() come from the Python quickstart.
repricer_check.py - price changes per seller and a label
"""How often each seller on a listing changed its price - a strong hint at automated repricing."""
from datetime import datetime, timedelta, timezone
from sellermagnet import get, new_session
def label(changes: int, days: int) -> str:
if changes / days >= 2:
return "likely repricer" # two or more recorded changes a day
return "occasional changes" if changes else "no recorded change"
def price_activity(asin: str, marketplace_id: str, days: int = 30) -> list[dict]:
offers = get(new_session(), "amazon-product-statistics", asin=asin, marketplaceId=marketplace_id).get("offers") or {}
since = datetime.now(timezone.utc) - timedelta(days=days)
rows = []
for seller_id, offer in offers.items():
history = offer.get("priceHistory")
if not isinstance(history, list) or not all(isinstance(p, list) and len(p) == 3 for p in history):
continue # e.g. e-books carry no per-seller history
landed = sorted((datetime.strptime(ts, "%Y-%m-%d %H:%M:%S").replace(tzinfo=timezone.utc),
price + (ship if isinstance(ship, (int, float)) and ship >= 0 else 0)) # -1 shipping: unspecified
for ts, price, ship in history if isinstance(price, (int, float)) and price >= 0)
if not landed:
continue # no readable price at all
recent = [p for p in landed if p[0] >= since]
changes = sum(1 for (_t0, a), (_t1, b) in zip(recent, recent[1:]) if a != b)
observed = max(1, min(days, (datetime.now(timezone.utc) - landed[0][0]).days)) # newcomers: their own time
rows.append({"seller": seller_id, "fba": offer.get("isFBA"), "changes": changes,
"per_day": round(changes / observed, 2), "label": label(changes, observed),
"last_price": landed[-1][1]}) # minor units, landed
return sorted(rows, key=lambda r: -r["changes"])
if __name__ == "__main__":
rows = price_activity("B0CL61F39H", "ATVPDKIKX0DER")
if not rows:
print("no New offers right now, or the offer refresh failed - check again later")
for row in rows:
print(row["seller"], row["changes"], row["per_day"], row["label"], row["last_price"])
Example output (illustrative values)
A1FAST00000000 238 7.93 likely repricer 42029
A2SLOW00000000 2 0.07 occasional changes 43495
ATVPDKIKX0DER 0 0.0 no recorded change 44999

How do I read the labels?
| Recorded changes | Label | What to expect |
|---|---|---|
| >= 2 per day | Likely repricer | Expect instant reactions to your price |
| at least 1 in the window | Occasional changes | Manual or rule-based pricing |
| none recorded | No recorded change | A fixed price - or not observed |
The thresholds are a starting point, not a rule - adjust them to your category. The same timestamps show other repricer habits: changes at night, reactions within hours of a rival's change, or a price that sits one step below the lowest offer. A seller labelled "no recorded change" may still change price between observations; a likely repricer will usually answer a price cut within hours, so undercutting it mostly lowers the price for everyone. The Buy Box price gap guide shows why the lowest price is not always the one that wins, and the Buy Box history guide who actually held it.

Can I check a listing from the command line?
Yes. jq prints each seller with the number of recorded price points - a quick first look before any counting.
Recorded price points per seller with curl and jq
curl -sG "https://sellermagnet-api.com/api/amazon-product-statistics" \
-H "X-Api-Key: $SELLERMAGNET_API_KEY" --max-time 120 \
--data-urlencode "asin=B0CL61F39H" \
--data-urlencode "marketplaceId=ATVPDKIKX0DER" \
| jq -r 'if .success then ((.data.offers // {}) | to_entries[]
| "\(.key) FBA=\(.value.isFBA) points=\(.value.priceHistory | if type == "array" then map(select(type == "array")) | length else 0 end)")
else error(.message) end'
Frequently Asked Questions
How can I tell if an Amazon seller uses a repricer?
Count their price changes. Several changes a day in the recorded history is the pattern of automated repricing; manual sellers change prices rarely.
Where does the per-seller price history come from?
From /amazon-product-statistics: data.offers lists each live New-condition seller by seller ID, with isFBA and a priceHistory of [time, price, shipping].
Why is the number of changes a lower bound?
A point is recorded when a new price is observed. If a seller changes the price and changes it back between two observations, that change is not in the history.
Does it include sellers who left the listing?
No. Only live offers are included, so a seller who stopped selling drops out of data.offers.
Which marketplaces have per-seller history?
The 11 marketplaces with recorded history, including amazon.com, .co.uk, .de, .fr, .it, .es and .co.jp. Others return a free 400.
Bottom line: one statistics call gives the price history of up to 20 current New-condition sellers; counting changes per day separates automated repricers from sellers who set a price and leave it. The product statistics page has the parameters, and a free account includes 150 credits.