The product object contains all of our price history data and basic product information.
Returned by: the product object is returned by the following requests: Product Searches and Product Request.
Important: Always evaluate the productType field first. This field determines what data for the product is available.
Format#
{
"productType": Integer,
"asin": String,
"domainId": Integer,
"title": String,
"itemHighlights": String,
"trackingSince": Integer,
"listedSince": Integer,
"lastUpdate": Integer,
"lastRatingUpdate": Integer,
"lastPriceChange": Integer,
"lastEbayUpdate": Integer,
"lastStockUpdate": Integer,
"images": Image array,
"rootCategory": Integer,
"categories": Long array,
"categoryTree": Object array,
"parentAsin": String,
"parentAsinHistory": String array,
"parentTitle": String,
"parentHighlights": String,
"frequentlyBoughtTogether": String array,
"bundleItems": String array,
"eanList": String array,
"upcList": String array,
"gtinList": String array,
"manufacturer": String,
"brand": String,
"brandStoreName": String,
"brandStoreUrl": String,
"brandStoreUrlName": String,
"websiteDisplayGroup": String,
"websiteDisplayGroupName": String,
"salesRankDisplayGroup": String,
"type": String,
"partNumber": String,
"binding": String,
"scent": String,
"shortDescription": String,
"activeIngredients": String,
"specialIngredients": String,
"itemForm": String,
"itemTypeKeyword": String,
"recommendedUsesForProduct": String,
"pattern": String,
"specificUsesForProduct": String array,
"businessDiscount": Integer,
"lastBusinessDiscountUpdate": Integer,
"safetyWarning": String,
"productBenefit": String,
"batteriesRequired": Boolean,
"batteriesIncluded": Boolean,
"targetAudienceKeyword": String,
"style": String,
"includedComponents": String,
"material": String,
"materials": String array,
"specialFeatures": String array,
"numberOfItems": Integer,
"numberOfPages": Integer,
"publicationDate": Integer,
"releaseDate": Integer,
"contributors": two dimensional String array,
"languages": two dimensional String array,
"model": String,
"color": String,
"size": String,
"edition": String,
"format": String,
"features": String array,
"description": String,
"hazardousMaterials": Object array,
"videos": Object array,
"aPlus": Object array,
"deals": Deal Details Object array,
"packageHeight": Integer,
"packageLength": Integer,
"packageWidth": Integer,
"packageWeight": Integer,
"packageQuantity": Integer,
"itemHeight": Integer,
"itemLength": Integer,
"itemWidth": Integer,
"itemWeight": Integer,
"availabilityAmazon": Integer,
"availabilityAmazonDelay": Integer array,
"buyBoxEligibleOfferCounts": Integer array,
"competitivePriceThreshold": Integer,
"suggestedLowerPrice": Integer,
"ebayListingIds": Long array,
"isAdultProduct": Boolean,
"isHeatSensitive": Boolean,
"isMerchOnDemand": Boolean,
"isHaul": Boolean,
"launchpad": Boolean,
"audienceRating": String,
"ingredients": String,
"urlSlug": String,
"returnRate": Integer,
"isEligibleForSuperSaverShipping": Boolean,
"fbaFees": Object,
"variableClosingFee": Integer,
"referralFeePercentage": Double,
"variations": Object array,
"historicalVariations": String array,
"coupon": Integer array,
"couponHistory": Integer array,
"promotions": Promotion Object array,
"unitCount": Object,
"stats": Statistics Object,
"salesRankReference": Long,
"salesRankReferenceHistory": Long array,
"salesRanks": Object,
"lastSoldUpdate": Integer,
"monthlySold": Integer,
"monthlySoldHistory": Integer array,
"reviews": Review Object,
"offers": Marketplace Offer Object array,
"liveOffersOrder": Integer array,
"buyBoxSellerIdHistory": String array,
"buyBoxUsedHistory": String array,
"isRedirectASIN": Boolean,
"isSNS": Boolean,
"offersSuccessful": Boolean,
"csv": two dimensional Integer array
}
Fields#
All timestamps are given in Keepa Time minutes (see Keepa Time Minutes below). All price and fee values are integers in the respective Amazon locale’s smallest currency unit (e.g. euro cents or yen). The fields are grouped below for readability; the group order follows the API response.
Identification & product type#
| Field | Type | Description |
|---|---|---|
productType |
Integer | Must always be evaluated first. Determines what data for the product is available. Possible values:
|
asin | String | The ASIN of the product. Example: B00M0QVG3W |
domainId | Integer | The domainId of the product’s Amazon locale. Possible values: [ 1: com | 2: co.uk | 3: de | 4: fr | 5: co.jp | 6: ca | 8: it | 9: es | 10: in | 11: com.mx | 12: com.br ] |
title | String | Title of the product. Amazon limits titles to 75 characters, including spaces, in all categories except media. Descriptive content that does not fit into the title is published separately in itemHighlights, so read both fields if you need the full descriptive text. Caution: may contain unescaped HTML markup in rare cases.Example: Canon PowerShot SX400 Digital Camera with 30x Optical Zoom (Black) |
itemHighlights | String | Amazon’s Item Highlights: up to 125 characters of descriptive content in addition to the title – typically materials or recommended use cases that help customers compare options. Amazon treats this content as searchable and displays it together with the title in search results and on the product detail page. undefined if not available.Example: Machine washable cotton blend, for indoor and outdoor use |
Tracking & update timestamps#
| Field | Type | Description |
|---|---|---|
trackingSince | Integer | States the time we have started tracking this product, in Keepa Time minutes. Example: 2711319 |
listedSince | Integer | States the time the item was first listed on Amazon, in Keepa Time minutes. This timestamp is only available for some products. If not available, the field has the value 0 or -1. Example: 2711319 |
lastUpdate | Integer | States the last time we have updated the information for this product, in Keepa Time minutes. Example: 2711319 |
lastRatingUpdate | Integer | States the last time we have updated the product rating and review count, in Keepa Time minutes. Example: 2711319 |
lastPriceChange | Integer | States the last time we have registered a price change (any price type), in Keepa Time minutes. Example: 2711319 |
lastEbayUpdate | Integer | States the last time we have updated the eBay prices for this product, in Keepa Time minutes. If no matching products were found, the integer is negative. Example: 2711319 |
lastStockUpdate | Integer | The most recent update of the stock data for this product’s offers, in Keepa Time minutes. This field is undefined unless the stock parameter was used and stock data was collected at least once. Not all offers are necessarily updated. Refer to the lastStockUpdate field of the individual offers. Example: 2711319 |
Images & categories#
| Field | Type | Description |
|---|---|---|
images |
Object array | Provides metadata for images associated with the product. The images field is an array of image objects, each containing up to two resolutions for the same image (if available). These are used in the product image carousel on Amazon. undefined if unavailable. Each object in the array represents the metadata for a single image in various sizes (large and medium):
https://m.media-amazon.com/images/I/<image name>
|
rootCategory | Integer | Category node ID of the product’s root category. 0 if no root category known. The ID 9223372036854775807 (max signed long value) denotes a blank category with the name “?”. We use this in cases where a product is listed in no or non-existent categories. Example: 562066 |
categories | Long array | Array of Amazon category node IDs this product is listed in. Can be empty. Example: [569604] |
categoryTree | Object array | Represents the category tree as an ordered array of objects, each consisting of two fields:
|
Example images entry:
"images": [{
"l": "81bRlmLRyPL.jpg",
"lH": 1500,
"lW": 1500,
"m": "g1dlEmb2mq3.jpg",
"mH": 500,
"mW": 500,
"variant": "MAIN"
}]
Parent ASIN & variations#
| Field | Type | Description |
|---|---|---|
parentAsin | String | The ASIN of the parent product (if the product has variations, otherwise null). Example: B00M0QVG3W |
parentAsinHistory | String array | The history of the parentAsin field. This array has the format: [keepaTime, previous parent ASIN, …]. The timestamp indicates when the previously associated parentAsin ceased to be valid. For the current parent ASIN, use the parentAsin field. undefined if the parentAsin field never changed. We started tracking parentAsin changes on March 18th 2024.Example: [2711319, B00M0QVG3W] |
parentTitle | String | The title of the parent product, resolved from the ASIN in parentAsin so a variation can be labelled with its parent’s wording without requesting the parent separately. It is a snapshot of the parent’s current title, taken while answering the request – there is no history for this field. Provided for variations only: a parent product references itself in parentAsin and therefore has no parentTitle. undefined if the product has no parent or the parent could not be resolved.Example: Canon PowerShot SX400 Digital Camera with 30x Optical Zoom (Black) |
parentHighlights | String | The itemHighlights of the parent product, resolved in the same way and under the same conditions as parentTitle. undefined if the product has no parent, the parent could not be resolved, or the parent itself has no item highlights.Example: Machine washable cotton blend, for indoor and outdoor use |
variations | Object array | Contains up to 4000 variations of this product. Each object in the array represents a single variation. A variation object consists of the variation ASIN, a swatch image, and an attributes array, where each entry represents one variation theme, including a dimension and its corresponding value. To request live data for this field, the offers parameter must be used. Not all variations have a swatch image. Only available variations are provided. |
historicalVariations | String array | Provides unlisted (historical and out of stock) variation ASINs of this product. undefined if no data is available or the historical-variations parameter was not specified. |
Example variations entry:
"variations": [{
"asin": "B07GFPNJL9",
"image": "55DVdLc1oBC.jpg",
"attributes": [{
"dimension": "Size",
"value": "7.24 LB"
}, {
"dimension": "FlavorName",
"value": "Cheddar"
}]
}]
Videos & A+ content#
| Field | Type | Description |
|---|---|---|
videos | Object array | Provides metadata for videos associated with the product. The videos parameter is mandatory for access. Each object in the array represents the metadata for a single video. Metadata can be retrieved for all image carousel videos and up to 10 (community) videos from the product listing’s Videos section. To request live data for this field, the offers parameter must also be included. undefined if unavailable. |
aPlus | Object array | Provides enhanced A+ content from Amazon product listings. The aplus parameter is mandatory for access. Each A+ content object consists of one or more modules containing descriptive text, images, and videos to further illustrate product features. undefined if unavailable. |
Example videos entry:
"videos": [{
"title": "Compressed Air Duster", // string
"image": "31XBcVI7oTL.jpg", // string
"duration": 36, // short, in seconds
"creator": "Seller", // string
"name": "Innovation", // string, public name of the creator
"url": "https://m.media-amazon.com/images/S/vse-vms-transcoding-artifact-us-east-1-prd/d8d8f97e-aa42-42d2-aa4c-6ab1b006edb5/default.jobtemplate.hls.m3u8" // string
}]
Note: The creator field represents the creator type and can have the following values: Main, Customer, Seller, Influencer, Vendor, ThirdParty, Amazon, Merchant and Brand. Main is used for all product image carousel videos for which no duration, title and name are available.
Example aPlus entry:
"aPlus": [{
"module": [{
"text": [
"Experience premium quality and design.",
"Engineered for performance and style."
], // array of strings, each representing a block of descriptive text
"image": [
"https://m.media-amazon.com/images/S/aplus-media-library-service-media/47ac6642-83d5-4ebf-867b-ae890ef135d4.png"
], // array of strings, each representing a full image URL
"imageAltText": [
"Healthy delicious recipes"
], // array of strings, each the alt text of the image
"video": [
"https://m.media-amazon.com/images/S/aplus-media/vc/e07d60fa-d3dd-49fa-90d0-b07e05a3f783.mp4"
], // array of strings, each representing a full video URL
"asin": [
"B000K11CAA"
] // array of strings, each representing a comparison table module's product ASIN
}],
"fromManufacturer": true // boolean; indicates whether the A+ content is provided by the manufacturer/vendor
}]
Note: The module array contains one or more A+ content modules. Each module object includes: text – an array of strings with descriptive text blocks; image – an array of strings, each a full URL to an image; imageAltText – an array of strings, each the alt text of the corresponding image (same index as image); video – an array of strings, each a full URL to a video. The fromManufacturer field is a boolean that indicates if the A+ content originates from the manufacturer or vendor (true) or from another source (false).
Deal badges (deals)#
The deals field provides metadata for active deals associated with the product’s buy box. undefined if unavailable. Only updated when the offers parameter is used. Each entry is a Deal Details Object with the following fields:
| Field | Type | Description |
|---|---|---|
accessType | String | Who can access the deal. New access types can be added at any time. Currently one of:
|
dealType | String | The type of the deal badge. New deal types can be added at any time. Currently one of:
|
badge | String | The badge string as shown on the product page. Example: “Early Prime Deal” |
Example:
"deals": [
{
"accessType": "PRIME_EXCLUSIVE",
"badge": "Early Prime Deal",
"dealType": "EARLY_ACCESS_WITH_PRIME"
}
]
Related products & identifiers#
| Field | Type | Description |
|---|---|---|
frequentlyBoughtTogether | String array | One or two “Frequently Bought Together” ASINs. null if not available. Field is updated when the offers parameter was used. Example: [ "B00M0QVG3W", "B00T85PMWY" ] |
bundleItems | String array | A list of ASINs this product bundle consists of. Only available for virtual product bundles. null if not available. Example: [ "B00M0QVG3W", "B00T85PMWY" ] |
eanList | String array | A list of EANs assigned to this product. The first index is the primary EAN. null if not available. Example: [ "8806088624952" ] |
upcList | String array | A list of UPCs assigned to this product. The first index is the primary UPC. null if not available. Example: [ "045496590086" ] |
gtinList | String array | A list of GTINs assigned to this product. The first index is the primary GTIN. null if not available. Example: [ "00614141000012" ] |
Brand & manufacturer#
| Field | Type | Description |
|---|---|---|
manufacturer | String | Name of the manufacturer. null if not available. Example: Canon |
brand | String | An item’s brand. null if not available. Example: Sony |
brandStoreName | String | The store name of the item’s brand. Never available for digital products, movie rentals, product bundles, Amazon Fresh, and Amazon Pantry. undefined if not available. Example: Hot Wheels |
brandStoreUrl | String | The brand store URL path. To get the full URL, prepend the Amazon domain of the respective locale (e.g. https://www.amazon.com). Never available for digital products, movie rentals, product bundles, Amazon Fresh, and Amazon Pantry. undefined if not available. Example: /stores/LEGO/page/017EF856-965D-4B56-A171-EA61CAFF45DD |
brandStoreUrlName | String | The brand store name from the URL path. Never available for digital products, movie rentals, product bundles, Amazon Fresh, and Amazon Pantry. undefined if not available. Example: LEGO (from the URL: /stores/LEGO/page/…) |
Classification & display groups#
| Field | Type | Description |
|---|---|---|
websiteDisplayGroup | String | A categorization of products that behave similarly, influencing how sales rank is calculated and displayed, especially for product variations. Example: apparel_display_on_website |
websiteDisplayGroupName | String | A categorization name of products that behave similarly, influencing how sales rank is calculated and displayed, especially for product variations. Example: apparel |
salesRankDisplayGroup | String | The categorization of products for which the primary sales rank is based on. Example: apparel_display_on_website |
type | String | The item’s productType. null if not available. Example: VIDEO_GAME_CONTROLLER |
partNumber | String | The item’s partNumber. null if not available. Example: DSC-H300/BM-RB |
binding | String | The item’s binding. null if not available. If the item is not a book, it is usually the product category instead. Example: Hardcover |
Product attributes#
| Field | Type | Description |
|---|---|---|
scent | String | The scent of the product. Describes the fragrance associated with the product. Example: "Lavender" |
shortDescription | String | A brief description of the product. Example: "A soothing lavender-scented candle." |
activeIngredients | String | Active ingredients present in the product. Example: "Lavender essential oil, Soy wax" |
specialIngredients | String | Special ingredients used in the product that may have unique properties. Example: "Beeswax blend, Natural dyes" |
itemForm | String | The form or physical state of the item. Example: "Liquid" |
itemTypeKeyword | String | Keywords describing the type or category of the item. Example: "body-lotions" |
recommendedUsesForProduct | String | Recommended uses for the product to guide customers. Example: "Aromatherapy, Home Decoration" |
pattern | String | The pattern or design featured on the product. undefined if not available. Example: "Striped", "Floral" |
materials | String array | The materials of the product. undefined if not available. Example: [ "Steel", "Wood" ] |
specialFeatures | String array | The special features of the product. undefined if not available. Example: [ "Fast Charging", "Lightweight" ] |
specificUsesForProduct | String array | Specific uses for the product, providing detailed applications. Example: [ "Relaxation", "Decoration" ] |
businessDiscount | Integer | The highest business discount percentage. undefined if no business discount data is available. Note: The business discount data is often outdated and may not reflect current offers. Example: 14 |
lastBusinessDiscountUpdate | Integer | States the last time we have updated the businessDiscount field, in Keepa Time minutes. undefined if the businessDiscount has no value.Example: 2711319 |
safetyWarning | String | Safety warnings associated with the product to inform users of potential hazards. Example: "Keep away from open flames." |
productBenefit | String | Benefits of using the product, highlighting its advantages. Example: "Promotes relaxation and stress relief." |
batteriesRequired | Boolean | Indicates whether batteries are required for the product to function. Example: true |
batteriesIncluded | Boolean | Indicates whether batteries are included with the product upon purchase. Example: false |
targetAudienceKeyword | String | Keywords describing the target audience for the product. Example: "Adults, Gift for Her" |
style | String | The style of the product, which may influence its aesthetic appeal. Example: "Modern", "Vintage" |
includedComponents | String | Components included with the product, detailing what is provided upon purchase. Example: "Candle, Wick, Box" |
material | String | Material of the product, specifying the primary substances used in its construction. Example: "Soy Wax, Cotton" |
Editions, formats & content details#
| Field | Type | Description |
|---|---|---|
numberOfItems | Integer | The number of items of this product. -1 if not available. Example: 1 |
numberOfPages | Integer | The number of pages of this product. -1 if not available. Example: 514 |
publicationDate | Integer | The item’s publication date in one of the following three formats: YYYY or YYYYMM or YYYYMMDD (Y = year, M = month, D = day). -1 if not available. Examples: 1978 = the year 1978; 200301 = January 2003; 20150409 = April 9th, 2015 |
releaseDate | Integer | The item’s release date. Same format as publicationDate. -1 if not available. |
contributors | Two-dimensional String array | The contributors of the item. A contributor can be an author, actor, director, etc. Each contributor entry has a name and a role type. Example: [ [ "Vin Diesel", "actor" ] ] |
languages | Two-dimensional String array | An item can have one or more languages. Each language entry has a name and most also have a type. null if not available. Examples: [ [ "English" ], [ "English", "Original Language" ] ] |
model | String | The item’s model. null if not available. Example: DSC-H300/BM |
color | String | The item’s color. null if not available. Example: Black |
size | String | The item’s size. null if not available. Example: S |
edition | String | The item’s edition. null if not available. Example: Standard Edition |
format | String | The item’s format. null if not available. Example: AC-3 |
features | String array | A list of up to 5 product features / bullet points. null if not available. An entry can contain HTML markup in rare cases. We currently limit each entry to a maximum of 1000 characters (if the feature is longer it will be cut off). This limitation may change in the future without prior notice. Example: [ "6 Universal outlets, 6 ft in Length", "Will accept most of the plug types from around the world!", … ] |
description | String | A description of the product. null if not available. May contain HTML markup and \n newlines. We limit the product description to a maximum of 4000 characters (if the description is longer it will be cut off). This limitation may change in the future without prior notice. To request live data for this field the offers parameter must be used.Example (excerpt): <p><b>Why should you buy our Universal Surge Protector?<b></p> • Professional series Universal Surge Protector will accept most of the plug types from around the world, including: UK, US, all of Europe, China, Australian and more! <br />• The AC surge suppression for full protection of 220-250V workstations… |
hazardousMaterials | Object array | The hazardous material types of the product. undefined if not available. Each entry consists of two fields:
|
Example hazardousMaterials entries:
{
"value": "AEROSOLS",
"aspect": "proper_shipping_name"
}, {
"value": "UN1950",
"aspect": "united_nations_regulatory_id"
}
Package & item dimensions#
| Field | Type | Description |
|---|---|---|
packageHeight | Integer | The package’s height in millimeters. 0 or -1 if not available. Example: 144 |
packageLength | Integer | The package’s length in millimeters. 0 or -1 if not available. Example: 144 |
packageWidth | Integer | The package’s width in millimeters. 0 or -1 if not available. Example: 144 |
packageWeight | Integer | The package’s weight in grams. 0 or -1 if not available. Example: 1500 (= 1.5 kg) |
packageQuantity | Integer | Quantity of items in the package. 0 or -1 if not available. Example: 4 |
itemHeight | Integer | The item’s height in millimeters. 0 or -1 if not available. Example: 144 |
itemLength | Integer | The item’s length in millimeters. 0 or -1 if not available. Example: 144 |
itemWidth | Integer | The item’s width in millimeters. 0 or -1 if not available. Example: 144 |
itemWeight | Integer | The item’s weight in grams. 0 or -1 if not available. Example: 1500 (= 1.5 kg) |
Availability & buy box eligibility#
| Field | Type | Description |
|---|---|---|
availabilityAmazon | Integer | Availability of the sold by Amazon offer. Possible values:
|
availabilityAmazonDelay | Integer array | If availabilityAmazon has the value 4, this field will provide the delay interval in hours. null if no data is available.Examples: [ 24, 48 ] (= Available to ship in 1-2 days.), [ 0, 288 ] (= Usually dispatched within 12 days.), [ 732, 1464 ] (= In stock. Usually ships within 1 to 2 months.) |
buyBoxEligibleOfferCounts | Integer array | If available, an array of integers, each entry indicating the total number of offers eligible for the Buy Box across specified offer conditions and fulfillment channels. This array contains eight elements, indexed as follows:
|
competitivePriceThreshold | Integer | A price based on competitive prices from other retailers (excluding other Amazon sellers). The offer may be ineligible for the Buy Box if the seller’s price + shipping is greater than this competitive price. undefined if it has no value. |
suggestedLowerPrice | Integer | The suggested lower price of the item, including shipping. The suggested lower price is based on a range of factors, including historical selling prices, recent Buy Box-eligible prices, and input from customers. undefined if it has no value. |
ebayListingIds | Long array | Contains the lowest priced matching eBay listing Ids. Always contains two entries, the first one is the listing id of the lowest priced listing in new condition, the second in used condition. null or 0 if not available. Example: [ 273344490183, 0 ] |
Flags & miscellaneous#
| Field | Type | Description |
|---|---|---|
isAdultProduct | Boolean | Indicates if the item is considered to be for adults only. Example: true |
isHeatSensitive | Boolean | Indicates if the item is heat sensitive (e.g. meltable). Example: true |
isMerchOnDemand | Boolean | True if this product is an Amazon Merch on Demand product. undefined otherwise. Example: true |
isHaul | Boolean | True if this product is an Amazon Haul product. undefined otherwise. Only basic product information is available for Amazon Haul products. Example: true |
ingredients | String | The ingredient list of the product. undefined if not available. Example: Purified Carbonated Water, Natural Flavors |
launchpad | Boolean | Indicates if the item is listed in the launchpad category. If so, the salesRankReference will not be available.Example: true |
audienceRating | String | Audience rating. The rating suggests the age for which the media is appropriate. Example: PG-13 (Parents Strongly Cautioned) |
urlSlug | String | The product listing URL slug. Example: Ring-Video-Doorbell-Satin-Nickel-2020-Release |
returnRate | Integer | This field provides information about the customer return rate for a product. The possible values are:
|
isEligibleForSuperSaverShipping | Boolean | Whether or not the product’s buy box is eligible for free shipping. Example: true |
FBA & referral fees#
| Field | Type | Description |
|---|---|---|
fbaFees | Object | Object containing the FBA pick & pack fee for this product and the timestamp of the last update. The fee corresponds to the FBA pick & pack charge for this product, based on its dimensions and weight, assuming a selling price equal to the current offer price. If there is no current offer, the last known offer price is assumed; if neither is available, a default selling price of 100.00 is used. Values are integers in the marketplace’s smallest currency unit (for example euro cents or yen). null if not available. |
variableClosingFee | Integer | The variable closing fee for this product. Values are integers in the marketplace’s smallest currency unit (for example euro cents or yen). undefined if not applicable. Example: 81 |
referralFeePercentage | Double | The Amazon referral fee percentage at the assumed selling price. The selling price is taken from the current offer price, otherwise the last known offer price, otherwise a default of 100.00. null if not available. Example: 12 |
Example fbaFees object:
"fbaFees": {
"lastUpdate": keepaTime,
"pickAndPackFee": 259
}
Coupons, promotions & unit count#
| Field | Type | Description |
|---|---|---|
coupon | Integer array | Contains coupon details for the buy box offer of the product, if available. null if not available. An integer array with two entries:
coupon field is always accessible, but only updated if the offers parameter was used in the Product Request.Examples: [ 200, -15 ] – both coupon types available: $2 one time discount or 15% for subscribe and save. [ -7, 0 ] – only the one time coupon type is available, offering a 7% discount. |
couponHistory | Integer array | Contains historical values for the coupon field, if available. null if not available. We started tracking coupon history on June 15th 2024.Format: [ keepaTime, one-time coupon, subscribe and save coupon, keepaTime, … ] Example: [2711319, 200, -15, …] |
promotions | Object array | Contains an array of active promotions. Not all product promotions can be provided. Requires the offers parameter to be updated. A promotion object consists of:
|
unitCount | Object | Object that contains unit count data. undefined if it has no value.
|
Sales rank, sold & review statistics#
| Field | Type | Description |
|---|---|---|
stats | Statistics Object | Optional field, set only if the stats parameter was used in the Product Request. Contains a Statistics Object. |
salesRankReference | Long | The category node id of the main sales rank. -1 if not available, -2 if listed in launchpad. Example: 281052 – http://www.amazon.com/b/?node=281052 |
salesRankReferenceHistory | Long array | A long array containing the historical category node id(s) of the main sales rank. This data, if available, can be used to match historical sales ranks provided in the csv field to their reference category. The category id has the value -1 if not available or -2 if listed in launchpad.Format: [ keepaTime, category node id, … ] Example: [2711319, 281052, …] |
salesRanks | Object | An object containing sales rank histories. Each key represents the categoryId of the rank, with the history in the corresponding value. |
lastSoldUpdate | Integer | States the last time we have updated the monthlySold field, in Keepa Time minutes. undefined if the monthlySold has no value.Example: 2711319 |
monthlySold | Integer | How often this product was bought in the past month. This field represents the bought past month metric found on Amazon search result pages. It is not an estimate. Amazon only provides the data in bracketed ranges such as “10+” or “100+”, rather than as exact figures. undefined if it has no value. Most ASINs do not have this value set. The value is variation specific. Example: 1000 – the ASIN was bought at least 1000 times in the past month. |
monthlySoldHistory | Integer array | Contains historical values of the monthlySold field. undefined if it has no value.Format: [ keepaTime, monthlySold, … ] |
reviews | Review Object | This object contains variation specific review and rating counts histories as well as a last update timestamp. null if not available. It is not possible to force an update to the reviews object data. For non-variation specific ratings and review data access the csv field. Accessible only if the rating parameter was used in the Product Request. The ratingCount history has not been updated since April 9th 2025 as that data point was removed by Amazon. |
Example salesRanks object:
"salesRanks": {
"281052": [ keepaTime, salesRank, ... ],
"123112042": [ keepaTime, salesRank, ... ]
}
Format of the reviews object:
"reviews": {
"lastUpdate": keepaTime,
"ratingCount": [ keepaTime, ratingCount, ... ],
"reviewCount": [ keepaTime, reviewCount, ... ]
}
Offers & buy box#
| Field | Type | Description |
|---|---|---|
offers | Marketplace Offer Object array | Optional field, set only if the offers parameter was used in the Product Request. Contains Marketplace Offer Objects. |
liveOffersOrder | Integer array | Optional field, set only if the offers parameter was used in the Product Request. Contains an ordered array of index positions in the offers array for all Marketplace Offer Objects retrieved for this call. If no offers were found, the field will be null. The sequence of integers reflects the ordering of the offers on the Amazon offer page (for all conditions). Since the offers field contains historical offers as well as current offers, one can use this array to look up all offers that are currently listed on Amazon in the correct order.Note: If there are identical offers (same seller, same condition, same shipping type, and same condition text) we only track the lowest-priced one. If this happens, there will be duplicate offer indexes in the liveOffersOrder field at the position of the omitted duplicate (higher-priced) offer – all pointing to the lowest-priced offer’s index. Example: [ 3, 5, 2, 18, 15 ] – the offer with the array index 3 of the offers field is currently the first one listed on the offer listings page on Amazon, followed by the offer with the index 5, and so on.Example with duplicates: [ 3, 5, 2, 18, 5 ] – the second offer, as listed on Amazon, is a lower-priced duplicate of the 5th offer on Amazon. The lower-priced one is included in the offers field at index 5. |
buyBoxSellerIdHistory | String array | Optional field, set only if the offers or buybox parameter was used in the Product Request. Contains a history of sellerIds that held the Buy Box in the format: Keepa time minutes, sellerId, […]. If no seller qualified for the Buy Box, the sellerId “-1” is used (suppressed Buy Box). If we were unable to identify the seller or if the product was out of stock (no seller), the sellerId is “-2”. Example: ["2860926", "ATVPDKIKX0DER", …] |
buyBoxUsedHistory | String array | Optional field, set only if the offers or buybox parameter was used in the Product Request. A history of used buy box winners, containing the sellerIds, offer sub-condition, and FBA status in the format: Keepa time minutes, seller id, condition, isFBA, […]. If no seller qualified for the used buy box, the sellerId “” (empty String) is used.
|
isRedirectASIN | Boolean | Valid only if the offers parameter was used in the Product Request. Boolean indicating if the ASIN will be redirected to another one on Amazon (example: the ASIN has the color black variation, which is not available and is redirected on Amazon to the color red). |
isSNS | Boolean | Boolean indicating if the product’s Buy Box is available for subscribe and save. |
offersSuccessful | Boolean | Valid only if the offers parameter was used in the Product Request. Boolean indicating if the system was able to retrieve fresh offer information. A product with no marketplace offers at all still counts as a successful retrieval and returns true — there is simply no offer page to fetch (compare COUNT_* csv entries). |
The csv History Array#
The csv field is a two-dimensional history array containing the product’s historical data. Access the first dimension index using the following enum/constants:
| Index | History type | Entry format | Description |
|---|---|---|---|
| 0 | AMAZON | time, value | Amazon price history |
| 1 | NEW | time, value | Marketplace New price history |
| 2 | USED | time, value | Marketplace Used price history |
| 3 | SALES | time, value | Sales Rank history (not every product has a Sales Rank; variation items usually don’t have individual sales ranks) |
| 4 | LISTPRICE | time, value | List Price (MSRP) history |
| 5 | COLLECTIBLE | time, value | Collectible price history |
| 6 | REFURBISHED | time, value | Refurbished price history |
| 7 | NEW_FBM_SHIPPING | time, price, shipping | 3rd party (not including Amazon) New price history including shipping costs, only fulfilled by merchant (FBM). Requires the offers parameter. |
| 8 | LIGHTNING_DEAL | time, value | Lightning Deal price history (special handling required – see the Lightning Deals note below) |
| 9 | WAREHOUSE | time, value | Amazon Warehouse price history. Requires the offers parameter. |
| 10 | NEW_FBA | time, value | Price history of the lowest 3rd party (not including Amazon/Warehouse) New offer that is fulfilled by Amazon. Requires the offers parameter. |
| 11 | COUNT_NEW | time, value | New offer count history (= count of marketplace merchants selling the product as new) |
| 12 | COUNT_USED | time, value | Used offer count history |
| 13 | COUNT_REFURBISHED | time, value | Refurbished offer count history |
| 14 | COUNT_COLLECTIBLE | time, value | Collectible offer count history |
| 15 | EXTRA_INFO_UPDATES | time, value | History of past updates to all offers-parameter related data: offers, aPlus, videos, isSNS, isRedirectASIN, and the csv types NEW_FBM_SHIPPING, WAREHOUSE, NEW_FBA, RATING, COUNT_REVIEWS, USED_*_SHIPPING, COLLECTIBLE_*_SHIPPING, BUY_BOX_USED_SHIPPING, PRIME_EXCL and REFURBISHED_SHIPPING. As updates to those fields are infrequent, it is essential to know when our system updated them. The absolute value indicates the number of offers fetched at the given time. If the value is positive, it means all available offers were fetched. If negative, there were more offers than fetched. |
| 16 | RATING | time, value | The product’s rating history (an integer from 0 to 50, e.g., 45 = 4.5 stars). Requires the offers parameter. |
| 17 | COUNT_REVIEWS | time, value | The product’s rating count history. Requires the offers parameter. |
| 18 | BUY_BOX_SHIPPING | time, price, shipping | The New buy box price history, including shipping costs. If no offer qualified for the buy box (or if the buy box is a used offer), the price has the value -1. Requires the offers parameter. |
| 19 | USED_NEW_SHIPPING | time, price, shipping | “Used - Like New” price history, including shipping costs. Requires the offers parameter. |
| 20 | USED_VERY_GOOD_SHIPPING | time, price, shipping | “Used - Very Good” price history, including shipping costs. Requires the offers parameter. |
| 21 | USED_GOOD_SHIPPING | time, price, shipping | “Used - Good” price history, including shipping costs. Requires the offers parameter. |
| 22 | USED_ACCEPTABLE_SHIPPING | time, price, shipping | “Used - Acceptable” price history, including shipping costs. Requires the offers parameter. |
| 23 | COLLECTIBLE_NEW_SHIPPING | time, price, shipping | “Collectible - Like New” price history, including shipping costs. Requires the offers parameter. |
| 24 | COLLECTIBLE_VERY_GOOD_SHIPPING | time, price, shipping | “Collectible - Very Good” price history, including shipping costs. Requires the offers parameter. |
| 25 | COLLECTIBLE_GOOD_SHIPPING | time, price, shipping | “Collectible - Good” price history, including shipping costs. Requires the offers parameter. |
| 26 | COLLECTIBLE_ACCEPTABLE_SHIPPING | time, price, shipping | “Collectible - Acceptable” price history, including shipping costs. Requires the offers parameter. |
| 27 | REFURBISHED_SHIPPING | time, price, shipping | Refurbished price history, including shipping costs. Requires the offers parameter. |
| 28 | EBAY_NEW_SHIPPING | time, price, shipping | Price history of the lowest new price on the respective eBay locale, including shipping costs |
| 29 | EBAY_USED_SHIPPING | time, price, shipping | Price history of the lowest used price on the respective eBay locale, including shipping costs |
| 30 | TRADE_IN | time, value | Trade-in price history (Amazon trade-in is not available for every locale) |
| 31 | RENT | time, value | Not provided. This index is retired and is never populated; it is listed only so the positions of the following types are unambiguous. |
| 32 | BUY_BOX_USED_SHIPPING | time, price, shipping | The Used buy box price history (any sub-condition), including shipping costs. If no offer qualified for the used buy box, the price has the value -1. Requires the offers parameter. |
| 33 | PRIME_EXCL | time, value | Price history of the lowest Prime exclusive New offer. Requires the offers parameter. |
| 34 | COUNT_NEW_FBA | time, value | New FBA offer count history (includes Amazon offer). Added March 2026. |
| 35 | COUNT_NEW_FBM | time, value | New FBM offer count history. Added March 2026. |
Important csv information#
- We only append a new entry to the history array if the price/value changed, not every time we update the product.
- Shipping and handling costs are not included unless specified.
- For NEW, USED, COLLECTIBLE, and REFURBISHED time series, the pricing definition is as follows: entries dated before Feb 23, 2026, reflect the lowest listing price. Entries dated on or after Feb 23, 2026, reflect the lowest landing price (listing price + shipping).
- Amazon is considered to be part of the marketplace. If Amazon has the overall lowest new price, the marketplace new price in the corresponding time interval is identical to the Amazon price.
- The following types are only set if the offers parameter was used in the Product Request: NEW_FBM_SHIPPING, WAREHOUSE, NEW_FBA, RATING, COUNT_REVIEWS, BUY_BOX_SHIPPING, USED_*_SHIPPING, COLLECTIBLE_*_SHIPPING, REFURBISHED_SHIPPING, BUY_BOX_USED_SHIPPING, and PRIME_EXCL.
Note – Lightning Deals: If a deal is currently active, the last entry of the history array will contain the end date (a future date) with a price of -1. When accessing the current deal price, handle this special case. Alternatively, use the current price array of the stats object to access the current price. If no deal is currently active but the last entry has the value -1 with a date in the future, it means an upcoming deal is announced (scheduled to start at that date).
Note – eBay prices: eBay listings often have incorrect information and/or product codes, causing item mismatches and incorrect pricing information. Use eBay price history information with caution and do not rely on their accuracy. We update eBay prices at different intervals than Amazon prices.
Important: We can add new data types to the csv field from time to time without announcement. Do not expect a fixed size of the first array dimension in your implementation.
Decoding the Price History#
The second dimension of the csv array contains the price/value history in the format Keepa time minutes, value, […] or, if the type includes *_SHIPPING costs, the format: Keepa time minutes, price, shipping costs, […]. If history is unavailable, it is null.
- The price is an integer of the respective Amazon locale’s smallest currency unit (e.g., euro cents or yen).
- If no offer was available in the given interval (e.g., out of stock), the price has the value -1.
- Timestamps are Keepa Time minutes – see the conversion below.
A minimal Python decoder:
KEEPA_TIME_OFFSET = 21564000 # minutes; Keepa Time -> Unix epoch offset
def keepa_time_to_unix_ms(keepa_minutes):
return (keepa_minutes + KEEPA_TIME_OFFSET) * 60000
def decode_csv(history, with_shipping=False):
"""Decode one csv history array into a list of data points.
Plain types: [keepaTime, value, keepaTime, value, ...]
*_SHIPPING types: [keepaTime, price, shipping, keepaTime, price, shipping, ...]
A value/price of -1 means no offer was available in that interval.
"""
if history is None:
return [] # no history available for this type
step = 3 if with_shipping else 2
points = []
for i in range(0, len(history), step):
point = {
"timestamp_ms": keepa_time_to_unix_ms(history[i]),
"value": history[i + 1],
}
if with_shipping:
point["shipping"] = history[i + 2]
points.append(point)
return points
# csv index constants (see table above)
AMAZON, NEW, USED, SALES, BUY_BOX_SHIPPING = 0, 1, 2, 3, 18
product = response["products"][0]
amazon_history = decode_csv(product["csv"][AMAZON])
buy_box_history = decode_csv(product["csv"][BUY_BOX_SHIPPING], with_shipping=True)
Keepa Time Minutes#
Keepa Time minutes is the time format used for all timestamps of the product object. To convert a Keepa Time minutes value to an uncompressed Unix epoch time:
- For milliseconds:
(keepaTime + 21564000) * 60000 - For seconds:
(keepaTime + 21564000) * 60
from datetime import datetime, timezone
def parse_keepa_time(keepa_minutes):
"""Convert Keepa Time minutes to a timezone-aware datetime (UTC)."""
return datetime.fromtimestamp((keepa_minutes + 21564000) * 60, tz=timezone.utc)
Example#
Product objects are returned in the products array of a Product Request response. A basic request:
KeepaAPI api = new KeepaAPI("YOUR_API_KEY");
Request r = Request.getProductRequest(AmazonLocale.US, null, null, "B00M0QVG3W");
api.sendRequest(r)
.done(result -> {
Product product = result.products[0];
// newest value of the AMAZON price history
int price = ProductAnalyzer.getLast(
product.csv[Product.CsvType.AMAZON.index], Product.CsvType.AMAZON);
System.out.println(product.title + ": " + price);
})
.fail(failure -> System.out.println(failure));<?php
use Keepa\KeepaAPI;
use Keepa\API\Request;
use Keepa\API\ResponseStatus;
use Keepa\objects\AmazonLocale;
$api = new KeepaAPI("YOUR_API_KEY");
$response = $api->sendRequestWithRetry(Request::getProductRequest(AmazonLocale::US, null, null, null, 1, true, ['B00M0QVG3W']));
if ($response->status == ResponseStatus::OK) {
$product = $response->products[0];
$amazonHistory = $product->csv[0]; // AMAZON price history
echo $product->title . ": " . end($amazonHistory);
}import requests
params = {"key": "YOUR_API_KEY", "domain": 1, "asin": "B00M0QVG3W"}
r = requests.get("https://api.keepa.com/product", params=params)
product = r.json()["products"][0]
print(product["title"])
amazon = product["csv"][0] # AMAZON price history: [keepaTime, price, ...]
print("Latest Amazon price (cents):", amazon[-1]) # -1 = out of stockconst res = await fetch("https://api.keepa.com/product?key=YOUR_API_KEY&domain=1&asin=B00M0QVG3W");
const data = await res.json();
const product = data.products[0];
console.log(product.title);
const amazon = product.csv[0]; // AMAZON price history: [keepaTime, price, ...]
console.log("Latest Amazon price (cents):", amazon[amazon.length - 1]);curl -s "https://api.keepa.com/product?key=YOUR_API_KEY&domain=1&asin=B00M0QVG3W"Example product object#
{
"productType": 0,
"asin": "B00M0QVG3W",
"domainId": 1,
"title": "Canon PowerShot SX400 Digital Camera with 30x Optical Zoom (Black)",
"trackingSince": 2711319,
"listedSince": 2705011,
"lastUpdate": 7664520,
"lastRatingUpdate": 7664201,
"lastPriceChange": 7664520,
"lastEbayUpdate": 7660034,
"images": [
{
"l": "81bRlmLRyPL.jpg",
"lH": 1500,
"lW": 1500,
"m": "g1dlEmb2mq3.jpg",
"mH": 500,
"mW": 500,
"variant": "MAIN"
}
],
"rootCategory": 502394,
"categories": [281052],
"categoryTree": [
{ "catId": 502394, "name": "Camera & Photo" },
{ "catId": 281052, "name": "Point-and-Shoot Digital Cameras" }
],
"parentAsin": null,
"frequentlyBoughtTogether": ["B00T85PMWY"],
"eanList": ["8714574623290"],
"upcList": ["013803243871"],
"manufacturer": "Canon",
"brand": "Canon",
"websiteDisplayGroup": "photo_display_on_website",
"websiteDisplayGroupName": "photo",
"salesRankDisplayGroup": "photo_display_on_website",
"type": "CAMERA_DIGITAL",
"partNumber": "9542B001",
"binding": "Electronics",
"model": "SX400",
"color": "Black",
"numberOfItems": 1,
"releaseDate": 20140929,
"features": [
"30x Optical Zoom with 24mm Wide-Angle lens",
"16.0 Megapixel CCD sensor with DIGIC 4+ Image Processor"
],
"packageHeight": 91,
"packageLength": 175,
"packageWidth": 137,
"packageWeight": 540,
"packageQuantity": 1,
"itemHeight": 69,
"itemLength": 104,
"itemWidth": 80,
"itemWeight": 313,
"availabilityAmazon": 0,
"buyBoxEligibleOfferCounts": [3, 5, 1, 2, 0, 0, 0, 0],
"competitivePriceThreshold": 18990,
"ebayListingIds": [273344490183, 0],
"isAdultProduct": false,
"isHeatSensitive": false,
"launchpad": false,
"isSNS": false,
"urlSlug": "Canon-PowerShot-SX400-Digital-Optical",
"isEligibleForSuperSaverShipping": true,
"fbaFees": {
"lastUpdate": 7664213,
"pickAndPackFee": 384
},
"referralFeePercentage": 8,
"coupon": [200, 0],
"salesRankReference": 281052,
"salesRanks": {
"281052": [7650101, 4823, 7660440, 5102, 7664520, 4991]
},
"lastSoldUpdate": 7664100,
"monthlySold": 100,
"monthlySoldHistory": [7620400, 50, 7650300, 100],
"csv": [
[7650101, 19900, 7655230, 18999, 7664520, 19499],
[7650101, 18990, 7660440, 18500],
[7650101, 14999, 7663880, 15250],
[7650101, 4823, 7660440, 5102, 7664520, 4991],
[7650101, 24999],
null,
null,
[7650101, 18990, 450, 7660440, 18500, 499]
]
}
Object shortened for readability; illustrative values only. Real product objects contain many more fields, and the csv array covers the history types listed above (null where no history exists) – here it is truncated after index 7 (NEW_FBM_SHIPPING, which uses the time, price, shipping triplet format). Prices are integers in the locale’s smallest currency unit; timestamps are Keepa Time minutes.