Home / Blog / Detect Amazon Competitors Using a Repricer: Price Change Frequency via API

Detect Amazon Competitors Using a Repricer: Price Change Frequency via API

Find out which sellers on an Amazon listing reprice automatically: read each seller's recorded price history from one statistics call, count the price changes per day, and label sellers as likely repricers, occasional changers or static - before you start a price war.

September 27, 2026
4 min read
SellerMagnet Team
Share & Bookmark
Blueprint flow from an ASIN through per-seller price histories to change counts and repricer labels

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
Blueprint bar chart of recorded price changes per day for five sellers on one listing
Illustrative: one seller reprices around the clock, the others rarely or never.

How do I read the labels?

Change frequency and what it usually means.
Recorded changesLabelWhat to expect
>= 2 per dayLikely repricerExpect instant reactions to your price
at least 1 in the windowOccasional changesManual or rule-based pricing
none recordedNo recorded changeA 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.

Blueprint table of price change frequency, the label assigned and what to expect from that seller
Three labels from one number.

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.

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