Keepa vs PricesAPI
Build ASIN-based Amazon analysis, or compare recorded product offers across retailers.
Use PricesAPI data to build price comparisons and history views. Coverage varies by product and market; your application handles analysis and pricing decisions.
Keepa fits Amazon-focused apps that need retained price-change series, marketplace offers and Buy Box data. PricesAPI fits product-and-market seller comparisons and raw recorded-offer charts where coverage exists.
Official-source facts
Reviewed 2026-09-22. Competitor facts below come from these official sources; PricesAPI facts come from our API documentation and pricing rules. Documented fields do not establish coverage, accuracy or performance for your products. We have not run a paid head-to-head benchmark.
| Feature | PricesAPI | Keepa |
|---|---|---|
| Free access | Free, one-time: 300 product-bearing Searches (3,000 credits); 6 rpm | Product API access uses an API plan and token balance. See Plans & Tokens for current access terms; tokens are not PricesAPI credits. |
| Entry paid plan | $49/month: 3,000 product-bearing Searches (30,000 credits); 20 rpm | Plans replenish tokens per minute; requested product and offer data changes consumption. See Plans & Tokens when sizing your workload. |
| Identity and market | Select id, id_type (pricesapi or catalog), and market. Exact catalogue variants differ from product clusters; name matching is not a barcode guarantee. | Supply an ASIN or product code (UPC/EAN/GTIN/ISBN-13) and an Amazon domain ID. Codes can resolve multiple ASINs; select the intended child variant and check supported locales. |
| Seller and condition | Snapshot includes seller_id, domain, listing title and URL. Condition is not published on Snapshot or observed History; mixed-condition rows need care. | Offers include sellerId, product-scoped offerId, condition and fulfilment flags. Parent/child ASIN fields help navigate variants; liveOffersOrder identifies current offers. |
| Delivery and totals | Snapshot has no numeric shipping amount. History shipping null means unknown, not free. A numeric item price alone is not a delivered total. | offerCSV separates price and shipping. Shipping 0 means free; -2 means undetermined; -1 can mean unshippable or unspecified. Do not add sentinel values as costs. |
| Currency | Currency is inferred from the requested market rather than retained from each offer. Validate cross-border amounts before ranking prices. | Amounts use the locale's smallest currency unit, such as euro cents or yen. Do not divide every locale's values by 100. |
| Freshness | Snapshot exposes observation time, age and stale state; reading it does not trigger a refresh. Recording time is not a merchant update time. | update controls product refresh; offers have separate lastSeen and update evidence. lastUpdate is not lastPriceChange, and offersSuccessful can be true with no offers. |
| History | Raw recorded offers plus date-window coverage, not a promise of daily sampling. Leave gaps visible; available depth varies by product and market. | Precollected change series start at trackingSince, with gaps possible. Since 2026-02-23, NEW/USED/COLLECTIBLE/REFURBISHED minima include delivery; earlier entries exclude it. |
| Pagination and batch | Snapshot returns up to 60 offers and a truncation flag, no offer cursor. Batch accepts 100 products; History uses bound continuation cursors. | Product requests accept up to 100 identifiers. days limits history returned; offers requests 20–100 fresh offers, while stored historical offers can enlarge the array. |
| Asynchronous work | Snapshot and History are direct retained reads. Async Bulk Search is a separate discovery workflow, not an immutable History export. | The compared Product endpoint returns synchronously; clients can issue parallel requests. Its documented response is not a task-ID polling workflow. |
| Billing unit | Search Products: 10 credits per response that returns at least one product; Product Snapshot: 1 credit per product; Price History: 1 credit per day with recorded offers. History reserves requested days, then refunds days without offers; valid continuations add no charge. Known-product empty Snapshots still bill. | Base Product read: one token per product. Offers replaces that base with six tokens per found offer page; options and outcomes affect cost. Tokens refill per minute and expire unused after 60 minutes. |
| Failures | 404 unknown identity, 403 balance, 409 expired History cursor and 429 with Retry-After are different cases. Restarting a History walk can bill again. | Inspect HTTP status, error and token balance. 429 means tokens exhausted; 402 is an inaccessible key. Failed offer refresh can leave historical data rather than fresh offers. |
- Feature
- Free access
- PricesAPI
- Free, one-time: 300 product-bearing Searches (3,000 credits); 6 rpm
- Keepa
- Product API access uses an API plan and token balance. See Plans & Tokens for current access terms; tokens are not PricesAPI credits.
- Feature
- Entry paid plan
- PricesAPI
- $49/month: 3,000 product-bearing Searches (30,000 credits); 20 rpm
- Keepa
- Plans replenish tokens per minute; requested product and offer data changes consumption. See Plans & Tokens when sizing your workload.
- Feature
- Identity and market
- PricesAPI
- Select id, id_type (pricesapi or catalog), and market. Exact catalogue variants differ from product clusters; name matching is not a barcode guarantee.
- Keepa
- Supply an ASIN or product code (UPC/EAN/GTIN/ISBN-13) and an Amazon domain ID. Codes can resolve multiple ASINs; select the intended child variant and check supported locales.
- Feature
- Seller and condition
- PricesAPI
- Snapshot includes seller_id, domain, listing title and URL. Condition is not published on Snapshot or observed History; mixed-condition rows need care.
- Keepa
- Offers include sellerId, product-scoped offerId, condition and fulfilment flags. Parent/child ASIN fields help navigate variants; liveOffersOrder identifies current offers.
- Feature
- Delivery and totals
- PricesAPI
- Snapshot has no numeric shipping amount. History shipping null means unknown, not free. A numeric item price alone is not a delivered total.
- Keepa
- offerCSV separates price and shipping. Shipping 0 means free; -2 means undetermined; -1 can mean unshippable or unspecified. Do not add sentinel values as costs.
- Feature
- Currency
- PricesAPI
- Currency is inferred from the requested market rather than retained from each offer. Validate cross-border amounts before ranking prices.
- Keepa
- Amounts use the locale's smallest currency unit, such as euro cents or yen. Do not divide every locale's values by 100.
- Feature
- Freshness
- PricesAPI
- Snapshot exposes observation time, age and stale state; reading it does not trigger a refresh. Recording time is not a merchant update time.
- Keepa
- update controls product refresh; offers have separate lastSeen and update evidence. lastUpdate is not lastPriceChange, and offersSuccessful can be true with no offers.
- Feature
- History
- PricesAPI
- Raw recorded offers plus date-window coverage, not a promise of daily sampling. Leave gaps visible; available depth varies by product and market.
- Keepa
- Precollected change series start at trackingSince, with gaps possible. Since 2026-02-23, NEW/USED/COLLECTIBLE/REFURBISHED minima include delivery; earlier entries exclude it.
- Feature
- Pagination and batch
- PricesAPI
- Snapshot returns up to 60 offers and a truncation flag, no offer cursor. Batch accepts 100 products; History uses bound continuation cursors.
- Keepa
- Product requests accept up to 100 identifiers. days limits history returned; offers requests 20–100 fresh offers, while stored historical offers can enlarge the array.
- Feature
- Asynchronous work
- PricesAPI
- Snapshot and History are direct retained reads. Async Bulk Search is a separate discovery workflow, not an immutable History export.
- Keepa
- The compared Product endpoint returns synchronously; clients can issue parallel requests. Its documented response is not a task-ID polling workflow.
- Feature
- Billing unit
- PricesAPI
- Search Products: 10 credits per response that returns at least one product; Product Snapshot: 1 credit per product; Price History: 1 credit per day with recorded offers. History reserves requested days, then refunds days without offers; valid continuations add no charge. Known-product empty Snapshots still bill.
- Keepa
- Base Product read: one token per product. Offers replaces that base with six tokens per found offer page; options and outcomes affect cost. Tokens refill per minute and expire unused after 60 minutes.
- Feature
- Failures
- PricesAPI
- 404 unknown identity, 403 balance, 409 expired History cursor and 429 with Retry-After are different cases. Restarting a History walk can bill again.
- Keepa
- Inspect HTTP status, error and token balance. 429 means tokens exhausted; 402 is an inaccessible key. Failed offer refresh can leave historical data rather than fresh offers.
Credits, searches and extracted records are different billing units. Compare the work each request does, not just the number included in a plan. The recommendations below are our assessment.
Choose PricesAPI when
- Your app compares product offers across retailers using an explicit market, rather than centring its identity model on ASINs.
- You want to build price-history charts from recorded offers and show the coverage available for each product.
Choose Keepa when
- Your workflow starts with Amazon ASINs and needs price-change history, Buy Box or fulfilment-specific marketplace analysis.
- You can decode Keepa time, currency units and sentinel values, and budget for the optional offer data your app needs.
Building a price tracker?
A seller comparison or price-history chart does not need a new Search at every step. PricesAPI also has three product-read APIs in public Beta:
- Find the product for free. Look up a name and market, choose the exact product, and check its recorded-history coverage before spending credits.
- Compare its stored seller prices. Use the product ID and market with Snapshot. Show when each offer was observed; a stored offer is not a live-price guarantee.
- Chart its recorded history. Read a date window and follow the remaining pages. For example, compare a headphone promotion with its earlier recorded prices, leaving unobserved days as gaps.
Check coverage for your actual products and markets. History first reserves credits for the full requested window, then refunds days without offers; continuation pages add no charge. Check the billing rules before choosing a long window.
Response shape
Product Search API returns matched products with available merchant offers inline. Carry a result’s product_ref into Snapshot or History; free product lookup is another starting point. Both examples are illustrative and based on the linked contracts; values are not live measurements or current commercial data.
GET /api/v1/products/search?q=Sony%20WH-1000XM5&market=us
{
"success": true,
"data": {
"query": "Sony WH-1000XM5",
"market": "us",
"products": [{
"position": 1,
"pid": 100569554,
"product_ref": { "id": "100569554", "id_type": "pricesapi", "market": "us" },
"cluster_id": "123456789",
"catalog_id": "987654321",
"title": "Sony WH-1000XM5 Wireless Headphones",
"image": "https://example.com/headphones.jpg",
"headline_price": 348,
"headline_currency": "USD",
"condition_label": null,
"source": "Amazon.com",
"multi_store": true,
"rating": 4.7,
"reviews": 8523,
"delivery": "Free delivery",
"tags": [],
"nearby_distance_km": null,
"offers": [{
"seller": "Amazon.com",
"seller_url": "https://amazon.com",
"price": 348,
"currency": "USD",
"product_title": "Sony WH-1000XM5",
"stock_status": "In stock",
"delivery_info": "Free delivery",
"url": "https://example.com/product"
}],
"offerCount": 1
}]
},
"meta": { "latency_ms": 842, "raw_count": 3, "gid_bearing_count": 2 }
}
Carry product_ref.id, id_type and market to the retained reads:
GET /api/v1/products?id=100569554&id_type=pricesapi&market=us
GET /api/v1/products/history?id=100569554&id_type=pricesapi&market=us&from=2026-09-01&to=2026-09-07
Snapshot: inspect observation and offers_page.truncated.
History: inspect coverage and follow page.next_cursor with the same parameters.
Null product_ref means no usable product identity; do not substitute cluster_id.Illustrative, not executed. Invented ASIN and changes; abbreviated response.
GET https://api.keepa.com/product?key=REDACTED&domain=1&asin=ASIN_SELECTED_BY_CALLER&history=1&days=30&update=-1
domain=1 selects Amazon US; update=-1 avoids a refresh.
csv[0] projects AMAZON time/price pairs. 4700 means USD 47.00 here.
Keepa minutes convert to Unix milliseconds: (minutes + 21564000) * 60000.
Response fragment:
{
"tokensConsumed": 1,
"tokensLeft": 59,
"refillIn": 30000,
"products": [{
"asin": "ASIN_SELECTED_BY_CALLER",
"domainId": 1,
"trackingSince": 8000000,
"lastUpdate": 8267760,
"csv": [[8267660, 4900, 8267760, 4700]]
}]
}Try the Product Search API
3,000 free credits, granted once. That covers 300 Searches returning products at 10 credits each. Empty and failed Searches cost nothing. Snapshot and History use different billing units.
Need more? Developer is $49/month for 30,000 credits, with a limit of 20 requests per minute.