Keepa Scraper — Amazon Price History, BSR, Offers & Deals avatar

Keepa Scraper — Amazon Price History, BSR, Offers & Deals

Pricing

from $5.00 / 1,000 products

Go to Apify Store
Keepa Scraper — Amazon Price History, BSR, Offers & Deals

Keepa Scraper — Amazon Price History, BSR, Offers & Deals

Keepa Scraper for Amazon: paste ASINs, Amazon or Keepa links and get one row per product with Buy Box and lowest prices, sales rank, monthly sales, ratings and a price trend with a 0-100 deal score. Keepa deals links work too. Price history and seller offers are optional add-ons.

Pricing

from $5.00 / 1,000 products

Rating

0.0

(0)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

16 hours ago

Last modified

Categories

Share

Paste a list of Amazon products, or a Keepa deals link, and get back one clean row per product or per deal. The rows come straight from Keepa's API, so you get Keepa's tracking data (price history, sales rank, offers) without a Keepa subscription or any code.

On top of Keepa's own numbers, every product row carries a trend block worked out by this actor: is the price rising, falling or flat, how far it moved in 30 and 90 days, and a 0-100 deal score that says how cheap today's price is compared with the product's own history.

What one run gives you

  • Any mix of inputs in one list. Bare ASINs, Amazon product links, Keepa product links and Keepa deals links. Each one is recognised on its own; repeats are fetched once.
  • 11 Amazon sites. amazon.com, .co.uk, .de, .co.jp, .ca, .fr, .it, .es, .in, .com.mx and .com.br. A link brings its own site; bare ASINs use the site you pick.
  • Prices now and over time. Buy Box, lowest new, lowest used, Warehouse, FBA and FBM, list price, refurbished, collectible and more, plus dated history series when the history add-on is on.
  • Demand signals. Best Sellers Rank, sales-rank drops over 30, 90, 180 and 365 days, Amazon's monthly-sold estimate, star rating and rating count.
  • Sellers and stock. Up to 40 live offers per product with seller ID, condition, FBA and Prime flags, price, shipping and stock (add-on).
  • Deals. Set your filters on keepa.com, copy the deals link, and the actor pages through the results, one row per deal with the drop against its average price.
  • Your column set. Keep only the fields you need, or switch to Keepa's own field names if your pipeline already reads Keepa's API.

What you can paste in

You pasteYou get
B0BN72FYFGOne product row, looked up on the Amazon site chosen in the settings
https://www.amazon.com/dp/B0DZDBDCFHOne product row; the site comes from the link
https://keepa.com/#!product/3-B0FRYBZR91One product row; 3 is Keepa's code for amazon.de
https://keepa.com/#!deals/...One row per deal on each page read, up to the page limit

Amazon links are read in the /dp/, /gp/product/ and /product/ forms. Anything the actor cannot read (a search page, a store front, a typo) is skipped and named in the run log, and the rest of the list still runs.

Keepa uses these site codes in its own product links: 1 amazon.com, 2 amazon.co.uk, 3 amazon.de, 4 amazon.fr, 5 amazon.co.jp, 6 amazon.ca, 8 amazon.it, 9 amazon.es, 10 amazon.in, 11 amazon.com.mx, 12 amazon.com.br.

How a run works

How the Keepa Scraper works

The list is sorted into product lookups and deals links first. Products are grouped by Amazon site and requested from Keepa 100 at a time, with 180 days of statistics. Keepa packs its histories into flat number arrays with prices in cents and times in its own minute count; the actor unpacks them into { seen_at, price } points with ISO dates and normal currency amounts. Deals links are read page by page and stop at the first empty page. Every row is written to the dataset the moment it is ready, so a long run shows results from the start.

Settings

Shown in the order of the input form.

FieldDefaultWhat it does
identifiers(required)The products and deals links to fetch, one per line
marketplaceusAmazon site for bare ASINs; ignored for links
maxItems0Total row cap across products and deals; 0 means no cap
max_pages1Pages read from each Keepa deals link
output_fields[]Keep only these top-level fields; empty keeps all
raw_outputfalseUse Keepa's own field names and packed arrays
include_offers_sellerstrueAdd offers, seller lists and stock (paid add-on)
include_price_historytrueAdd dated price series (paid add-on)

Three ways to run it

Look up two products with every add-on:

{
"identifiers": ["B0BN72FYFG", "https://www.amazon.com/dp/B0DZDBDCFH"]
}

Cheapest product rows, only the columns a price sheet needs:

{
"identifiers": ["https://keepa.com/#!product/3-B0FRYBZR91"],
"include_price_history": false,
"include_offers_sellers": false,
"output_fields": ["asin", "title", "buybox_price", "new_price", "bsr", "monthly_sold", "trend"]
}

Five pages of a Keepa deals search, capped at 300 rows:

{
"identifiers": ["https://keepa.com/#!deals/<the link you copied from keepa.com>"],
"max_pages": 5,
"maxItems": 300
}

Rows you get back

Every row starts with data_captured_at (when the actor wrote it) and data_type: product_search for a product, deal for a deal. Filter on data_type when one run mixes both.

A product row

A real row from our smoke test, shortened:

{
"data_captured_at": "2026-10-21T12:00:00.000Z",
"data_type": "product_search",
"asin": "B0BN72FYFG",
"title": "Apple iPhone 14, 128GB, Midnight - Unlocked (Renewed)",
"marketplace": "us",
"currency": "USD",
"brand": "Apple",
"model": "iPhone 14",
"product_url": "https://www.amazon.com/dp/B0BN72FYFG",
"buybox_price": 299.95,
"new_price": 298.94,
"used_price": 252.99,
"list_price": 389.0,
"monthly_sold": 6000,
"bsr": 1,
"sales_rank_drops30": 3,
"sales_rank_drops90": 9,
"rating": 4.0,
"rating_count": 13859,
"statistics": {
"buybox_price": { "current": 299.95, "average_30_days": 304.45 }
}
}

With the history add-on on, the same row also has series like this one:

{
"buybox_price_history": [
{ "seen_at": "2026-09-30T14:49:00Z", "price": 299.95, "shipping": 0.0 }
]
}

With the offers add-on on, it also has offers, one entry per live offer:

{
"offers": [
{ "seller_id": "A2ZA9A2J109LFF", "condition_name": "refurbished", "is_fba": false, "is_prime": false, "price": 299.95, "shipping": 0.0, "total_price": 299.95, "is_active": true }
],
"total_offer_count": 41
}

A deal row

{
"data_captured_at": "2026-10-21T12:00:00.000Z",
"data_type": "deal",
"page": 0,
"asin": "B0028OA2O0",
"title": "Justice League: Justice on Trial (DVD) (AT)",
"marketplace": "us",
"metric": "buybox_price",
"current_value": 5.97,
"average_value": 47.56,
"difference_from_average": 41.59,
"difference_percent": 87,
"deal_created_at": "2026-09-29T10:26:00Z"
}

Read it as: the Buy Box price is 5.97 against a 47.56 average, 87% under.

The fields, by what you would use them for

Identify the product: asin, parent_asin, title, brand, manufacturer, model, product_url, product_image_url, category_tree, product_group, binding.

Price right now: buybox_price, new_price, used_price, warehouse_price, new_fba_price, new_fbm_price, list_price, refurbished_price, collectible_price, the four used-condition prices (used_like_new_price down to used_acceptable_price), prime_exclusive_price, rent_price, trade_in_price, ebay_new_price, ebay_used_price. Most have a matching *_seen_at with the time Keepa last saw that price.

Price over time (history add-on): a *_history series for most of the prices above, each a list of { seen_at, price } points.

Demand: bsr with its category, sales_ranks, sales_rank_drops30 / 90 / 180 / 365, monthly_sold, rating, rating_count, review_count.

Buy Box detail: buybox_seller_id, buybox_is_fba, buybox_is_amazon, buybox_is_prime_eligible, buybox_eligible_offer_counts, buybox_stats and the used Buy Box equivalents.

Sellers and stock (offers add-on): offers, total_offer_count, offer_count_fba, offer_count_fbm, stock_amazon, stock_buybox, seller_ids_lowest_fba, seller_ids_lowest_fbm.

Selling costs: fba_fees, referral_fee_percent, variable_closing_fee, suggested_lower_price, competitive_price_threshold, return_rate.

The full list of top-level fields is in the "Keep only these columns" picker on the input form.

The trend block

Worked out from the product's lowest-new-price history, which the actor always requests (so the block is there even with the history add-on off):

KeyMeaning
directionrising or falling when the 30-day move is over 2%, else stable; unknown when there is no price 30 days back
current_priceLatest lowest-new price
change_30_days_pct, change_90_days_pctMove against the price 30 and 90 days earlier, in percent
lowest_price, highest_price, average_priceAcross the whole history Keepa holds
deal_score0 = at its all-time high, 100 = at its all-time low; 50 when the price never changed
data_pointsHow many price points went into it

trend is null when Keepa has fewer than two new-price points for the product.

Billing

Pay per event. Each product row is one product event and each deal row one deal event. The two add-ons bill per product row on top: price_history for every product row while price history is on, and offers_sellers for each product row that came back with offers while the offers add-on is on. Deal rows never carry add-on events. Turning both add-ons off is the cheapest way to fetch products.

Runs on Apify's free plan look up the first 5 products and read 1 page of the first deals link.

Questions

Where does the data come from? From Keepa's API, called by the actor with its own key. You do not need a Keepa account.

How fresh is it? As fresh as Keepa's tracking. data_captured_at is when the actor wrote the row; each price's *_seen_at is when Keepa last observed that price, which can be hours older for slow-moving products.

Why is a price null? Keepa has no current value for it: nobody is selling in that condition, or Keepa does not track that price on that Amazon site.

A line in my list was skipped. Why? It did not parse as an ASIN, a product link or a Keepa link. The run log names every skipped line. Amazon search pages and store fronts are not product links.

Can I get the same product from two Amazon sites? Yes. Add it twice with the site in the link (amazon.com/dp/... and amazon.de/dp/...) or as two Keepa links with different site codes. The same ASIN on the same site is fetched once.

Does the proxy setting matter? No. The actor only talks to Keepa's API and does not use a proxy.

Support

Open an issue on the actor's Issues tab with the run ID and the line that misbehaved.

🤖 For AI Agents & LLM Apps

Purpose: Amazon product data and Keepa deals through Keepa's API, one row per product or deal.

Minimal input:

{ "identifiers": ["B0BN72FYFG"], "include_price_history": false, "include_offers_sellers": false }
  • identifiers takes ASINs, Amazon product links, Keepa product links and Keepa deals links, mixed.
  • Rows carry data_type (product_search or deal); product rows include trend.deal_score (0-100, higher = cheaper vs own history).
  • Use output_fields to cut rows down to the fields you need; history series make full rows large.
  • Billing: one event per row, plus one per product row for each add-on left on. Both add-ons default to on.

⚠️ Disclaimer

This actor is an independent tool. It is not made, endorsed or supported by Keepa or by Amazon.com, Inc. or its affiliates; Keepa and Amazon are trademarks of their owners. It reads product and price data through Keepa's API and does not collect personal data. You are responsible for using the results in line with Keepa's and Amazon's terms and the law that applies to you, including data-protection law such as the GDPR.

SEO Keywords

keepa scraper, keepa api alternative, keepa price history export, amazon price history, amazon price tracker, amazon buy box price, amazon bsr tracker, amazon sales rank history, amazon monthly sales estimate, amazon product research, asin lookup, asin to price, amazon offers and sellers, fba seller data, keepa deals export, amazon price drop finder, amazon deal score, amazon product data csv