Home / Blog / Amazon Price History API: Buy Box, FBA and FBM Price History as JSON

Amazon Price History API: Buy Box, FBA and FBM Price History as JSON

Get an ASIN's recorded Buy Box, Amazon, FBA and FBM price history as JSON with one request. Which series is a landed price and which is an item price, why the values are integers, how to turn the series into a daily table with 30- and 90-day lows, and how to get ready-made PNG charts.

September 19, 2026
4 min read
SellerMagnet Team
Share & Bookmark
Blueprint flow from an ASIN through the statistics API to price series, a daily table and price alerts

To get an Amazon product's price history as JSON, call the SellerMagnet /api/amazon-product-statistics endpoint with the ASIN and marketplace. One request returns the recorded Buy Box, Amazon-as-seller, lowest FBA and lowest FBM price series under data.stats, each as [date, price] pairs in integer minor units, plus sales rank, rating and monthly-sold history. Add graphs=true and the same credit also returns a PNG chart per series.

Key Takeaways

  • One statistics request returns every recorded price series for an ASIN; there is no date-range parameter.
  • Prices are integers in minor units: 41800 means 418.00, and yen values are whole yen.
  • buyBoxPriceHistory and lowestFBMPriceHistory are landed prices (item plus shipping); the others are item prices.
  • No-offer entries are dropped rather than stored as zero, and one date can appear several times.
  • graphs=true adds a watermarked PNG chart for each series that has data, at no extra cost.

Which price histories does the API return?

The statistics endpoint returns recorded history, not a live snapshot - for the live Buy Box and the full offer list, use the product offers endpoint. The price series differ in one way that matters for comparisons: whether shipping is included.

Price series in data.stats (and one beside it) and what each measures.
SeriesWhat it recordsIncludes shipping
stats.buyBoxPriceHistoryPrice of the Buy Box offerYes - landed price
stats.lowestFBMPriceHistoryLowest merchant-fulfilled offerYes - landed price
stats.lowestFBAPriceHistoryLowest Amazon-fulfilled offerNo - item price
stats.amazonAsSellerPriceHistoryAmazon's own offerNo - item price
marketplaceNewPriceHistoryLowest new offer (sits beside stats)No - item price

Next to the prices, stats also holds salesRankHistory (timestamps with a time of day; -1 means the product had no rank), monthlySoldHistory as ["YYYY-MM", units], and rating and review-count histories. data.trackingSince gives the date recording started, or N/A - that is how far back the history goes.

History covers amazon.com, .ca, .com.mx, .com.br, .co.uk (also used for Ireland), .de, .fr, .it, .es, .in and .co.jp. For any other marketplace the response describes amazon.com, so check data.marketplaceId before you store it.

Response from /api/amazon-product-statistics (trimmed, example values)

{
  "success": true,
  "data": {
    "asin": "B0CLTBHXWQ",
    "marketplaceId": "APJ6JRA9NG5V4",
    "buyBoxPrice": 41800,
    "buyBoxFulfillment": "FBM",
    "lowestFBAPrice": 44999,
    "trackingSince": "2023-12-18",
    "stats": {
      "buyBoxPriceHistory": [["2025-06-12", 42900], ["2025-06-13", 41700], ["2025-06-13", 41800]],
      "lowestFBAPriceHistory": [["2025-06-14", 44999]],
      "amazonAsSellerPriceHistory": [["2025-06-14", 44999]],
      "salesRankHistory": [["2025-06-14 01:58:00", 15]],
      "monthlySoldHistory": [["2025-05", 1000], ["2025-06", 1000]]
    }
  }
}

How do I turn the price history into a daily table?

A series records a value each time the price changed, so a busy day has several entries and a quiet week has none. For charts and comparisons, keep the last price per day and carry it forward until the next change. One caveat: the moments when nobody offered the product are removed from the series, so a quiet stretch can mean the price held or that the product was unavailable. Forward-filling assumes it held; if availability matters, check the seller's stockHistory in data.offers.

price_history.py - fetch, convert and compute the lows

import datetime as dt
import os

import requests

ZERO_DECIMAL = {"A1VC38T7YXB528"}  # amazon.co.jp: values are whole yen


def statistics(asin: str, marketplace_id: str) -> dict:
    resp = requests.get(
        "https://sellermagnet-api.com/api/amazon-product-statistics",
        params={"asin": asin, "marketplaceId": marketplace_id,
                "api_key": os.environ["SELLERMAGNET_API_KEY"]},
        timeout=90,
    )
    try:
        body = resp.json()
    except ValueError:  # e.g. an HTML error page from a proxy
        body = {}
    if resp.status_code != 200 or not body.get("success"):
        raise RuntimeError(f"{asin}: {resp.status_code} {body.get('message')}")
    return body["data"]


def daily(series: list, marketplace_id: str) -> dict:
    """[[date, minor units], ...] -> {date: price}, keeping the last value per day."""
    divisor = 1 if marketplace_id in ZERO_DECIMAL else 100
    out = {}
    for day, value in series:  # already in time order
        out[day[:10]] = value / divisor
    return out


def low_since(prices: dict, days: int) -> float | None:
    """Lowest price in effect during the last `days` days (steps carried forward)."""
    cutoff = (dt.date.today() - dt.timedelta(days=days)).isoformat()
    before = [p for d, p in prices.items() if d < cutoff]
    recent = [p for d, p in prices.items() if d >= cutoff]
    if before:
        recent.append(before[-1])  # the price still in effect when the window opened
    return min(recent) if recent else None


data = statistics("B0CLTBHXWQ", "APJ6JRA9NG5V4")
buy_box = daily(data["stats"]["buyBoxPriceHistory"], data["marketplaceId"])
print("tracking since", data.get("trackingSince"))
print("30-day low", low_since(buy_box, 30), "90-day low", low_since(buy_box, 90))
Blueprint step chart of an example Buy Box price over 30 days with the 30-day low marked
The series is a step function: each value holds until the next change.

Is the Buy Box price history comparable with the FBA price?

Not directly. buyBoxPriceHistory is the landed price - item price plus shipping - while lowestFBAPriceHistory is the item price alone. For an FBA offer that ships free the two agree; for a merchant-fulfilled offer with shipping they do not. Compare landed with landed (buyBoxPriceHistory and lowestFBMPriceHistory), or read each seller's item price and shipping separately from data.offers, where every priceHistory entry is [timestamp, price, shipping].

Current price fields can be text

buyBoxPrice is "N/A" when nobody holds the Buy Box or its holder is not among the recorded new offers, and lowestFBAPrice / lowestFBMPrice are null when no such offer exists. Check the type before dividing, or take the latest value from buyBoxPriceHistory instead.

Can the API return price history charts?

Yes. Pass graphs=true and the response gains data.graphs: one PNG URL per series that has data, such as buyBoxPriceHistory, lowestFBAPriceHistory, salesRankHistory and monthlySoldHistory. The request still costs one credit. The images carry a watermark, so they suit internal dashboards and reports better than a storefront.

Chart URLs for one ASIN with curl and jq

curl -sG "https://sellermagnet-api.com/api/amazon-product-statistics" \
  --data-urlencode "asin=B0CLTBHXWQ" \
  --data-urlencode "marketplaceId=APJ6JRA9NG5V4" \
  --data-urlencode "graphs=true" \
  --data-urlencode "api_key=$SELLERMAGNET_API_KEY" \
  | jq -r '.data.graphs | to_entries[] | "\(.key)\t\(.value)"'
Blueprint breakdown of a statistics request with graphs=true and the price series it returns
One request, every series; graphs=true adds chart URLs for the same credit.

For a watch list, run the script once a day, compare today's price with the 90-day low and alert when it drops below it. Recorded history changes slowly, so there is no point checking it more often; for reacting to a live Buy Box change, the Buy Box polling guide covers intervals and cost. To pull history for thousands of ASINs, see the bulk lookup guide.

Frequently Asked Questions

Is there an API for Amazon price history?

Yes. /api/amazon-product-statistics returns an ASIN's recorded Buy Box, Amazon, lowest FBA and lowest FBM price history as JSON in one request.

What unit are the prices in?

Integer minor units: 41800 means 418.00 in the currency of data.marketplaceId. On amazon.co.jp the values are whole yen.

Can I request a date range?

No. One request returns everything recorded since trackingSince; filter by date on your side.

Why are there gaps in the price history?

Entries recorded while nobody offered the product are removed rather than stored as zero, and a series only records changes, so stretches without entries are normal.

Does graphs=true cost extra?

No. The chart URLs come with the same single credit as the JSON history.

Bottom line: one request, every recorded series; divide by 100 (not for yen), compare landed with landed, and keep the last price per day. The product statistics page shows the endpoint, and a free account includes 500 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.

500 free API credits • No credit card required • Cancel anytime