# Product Object

Source: https://env.7xmtools.com/api-docs/product-object.html

The product object contains all of Keepa’s price history data and basic product information. This page documents every field, the `csv` history array with all history types, how to decode the price history and how to convert Keepa Time timestamps.

JSON Object · Returned by: Product Request & Product Searches

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](https://env.7xmtools.com/api-docs/product-search.html) and [Product Request](https://env.7xmtools.com/api-docs/product.html).

> **Important:** Always evaluate the `productType` field first. This field determines what data for the product is available.

## Format

```json
{
    "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](https://env.7xmtools.com/api-docs/product-object.html#keepa-time) 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:<br>• **0** – STANDARD: Everything accessible.<br>• **1** – DOWNLOADABLE: No price, rating and offers data accessible. Data is updated less frequently.<br>• **2** – EBOOK: No price, rating and offers data accessible. Data is updated less frequently.<br>• **3** – INACCESSIBLE: No price, rating and offers data accessible. Sales rank and offer count data is updated less frequently. Some fields may be missing.<br>• **4** – INVALID: No current data available due to invalid or deprecated ASIN, or other issues. Might be temporary.<br>• **5** – VARIATION\_PARENT: Product is a parent ASIN. `variations` is set. |
| `asin` | String | The ASIN of the product.<br>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.<br>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.<br>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**.<br>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**.<br>Example: *2711319* |
| `lastUpdate` | Integer | States the last time we have updated the information for this product, in **Keepa Time minutes**.<br>Example: *2711319* |
| `lastRatingUpdate` | Integer | States the last time we have updated the product rating and review count, in **Keepa Time minutes**.<br>Example: *2711319* |
| `lastPriceChange` | Integer | States the last time we have registered a price change (any price type), in **Keepa Time minutes**.<br>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.<br>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.<br>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):<br>• `l` (String): Large image filename.<br>• `lH` (Integer): Height of the large image, in pixels.<br>• `lW` (Integer): Width of the large image, in pixels.<br>• `m` (String): Medium image filename.<br>• `mH` (Integer): Height of the medium image, in pixels.<br>• `mW` (Integer): Width of the medium image, in pixels.<br>• `variant` (String): Amazon’s image variant code, identifying the role of this image within the listing (for example *MAIN* or *PT01*).<br>Full Amazon image path: `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.<br>Example: *562066* |
| `categories` | Long array | Array of Amazon category node IDs this product is listed in. Can be empty.<br>Example: *\[569604\]* |
| `categoryTree` | Object array | Represents the category tree as an ordered array of objects, each consisting of two fields:<br>• `catId` – *Long* – the category ID<br>• `name` – *String* – the name of the category |

Example `images` entry:

```json
"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**).<br>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.<br>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.<br>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.<br>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:

```json
"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:

```javascript
"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:

```javascript
"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:<br>• ALL<br>• PRIME\_EARLY\_ACCESS<br>• PRIME\_EXCLUSIVE |
| `dealType` | String | The type of the deal badge. New deal types can be added at any time. Currently one of:<br>• PRIME\_DAY<br>• PRIME\_DAY\_EARLY<br>• EARLY\_ACCESS\_WITH\_PRIME<br>• PRIME\_EXCLUSIVE<br>• SELLING\_FAST<br>• PRIME\_SELLING\_FAST<br>• LIMITED\_TIME\_DEAL<br>• COUNTDOWN\_ENDS\_IN<br>• APP\_ONLY<br>• CLEARANCE\_NO\_RETURNS<br>• SPECIAL\_EVENT\_SALE<br>• GENERIC\_OFFER\_PROMO<br>• UNKNOWN |
| `badge` | String | The badge string as shown on the product page.<br>Example: *“Early Prime Deal”* |

Example:

```json
"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.<br>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.<br>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.<br>Example: *\[ "8806088624952" \]* |
| `upcList` | String array | A list of UPCs assigned to this product. The first index is the primary UPC. **null** if not available.<br>Example: *\[ "045496590086" \]* |
| `gtinList` | String array | A list of GTINs assigned to this product. The first index is the primary GTIN. **null** if not available.<br>Example: *\[ "00614141000012" \]* |

### Brand & manufacturer

| Field | Type | Description |
| --- | --- | --- |
| `manufacturer` | String | Name of the manufacturer. **null** if not available.<br>Example: *Canon* |
| `brand` | String | An item’s brand. **null** if not available.<br>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.<br>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.<br>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.<br>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.<br>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.<br>Example: *apparel* |
| `salesRankDisplayGroup` | String | The categorization of products for which the primary sales rank is based on.<br>Example: *apparel\_display\_on\_website* |
| `type` | String | The item’s productType. **null** if not available.<br>Example: *VIDEO\_GAME\_CONTROLLER* |
| `partNumber` | String | The item’s partNumber. **null** if not available.<br>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.<br>Example: *Hardcover* |

### Product attributes

| Field | Type | Description |
| --- | --- | --- |
| `scent` | String | The scent of the product. Describes the fragrance associated with the product.<br>Example: *"Lavender"* |
| `shortDescription` | String | A brief description of the product.<br>Example: *"A soothing lavender-scented candle."* |
| `activeIngredients` | String | Active ingredients present in the product.<br>Example: *"Lavender essential oil, Soy wax"* |
| `specialIngredients` | String | Special ingredients used in the product that may have unique properties.<br>Example: *"Beeswax blend, Natural dyes"* |
| `itemForm` | String | The form or physical state of the item.<br>Example: *"Liquid"* |
| `itemTypeKeyword` | String | Keywords describing the type or category of the item.<br>Example: *"body-lotions"* |
| `recommendedUsesForProduct` | String | Recommended uses for the product to guide customers.<br>Example: *"Aromatherapy, Home Decoration"* |
| `pattern` | String | The pattern or design featured on the product. **undefined** if not available.<br>Example: *"Striped", "Floral"* |
| `materials` | String array | The materials of the product. **undefined** if not available.<br>Example: *\[ "Steel", "Wood" \]* |
| `specialFeatures` | String array | The special features of the product. **undefined** if not available.<br>Example: *\[ "Fast Charging", "Lightweight" \]* |
| `specificUsesForProduct` | String array | Specific uses for the product, providing detailed applications.<br>Example: *\[ "Relaxation", "Decoration" \]* |
| `businessDiscount` | Integer | The highest business discount percentage. **undefined** if no business discount data is available.<br>*Note:* The business discount data is often outdated and may not reflect current offers.<br>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.<br>Example: *2711319* |
| `safetyWarning` | String | Safety warnings associated with the product to inform users of potential hazards.<br>Example: *"Keep away from open flames."* |
| `productBenefit` | String | Benefits of using the product, highlighting its advantages.<br>Example: *"Promotes relaxation and stress relief."* |
| `batteriesRequired` | Boolean | Indicates whether batteries are required for the product to function.<br>Example: *true* |
| `batteriesIncluded` | Boolean | Indicates whether batteries are included with the product upon purchase.<br>Example: *false* |
| `targetAudienceKeyword` | String | Keywords describing the target audience for the product.<br>Example: *"Adults, Gift for Her"* |
| `style` | String | The style of the product, which may influence its aesthetic appeal.<br>Example: *"Modern", "Vintage"* |
| `includedComponents` | String | Components included with the product, detailing what is provided upon purchase.<br>Example: *"Candle, Wick, Box"* |
| `material` | String | Material of the product, specifying the primary substances used in its construction.<br>Example: *"Soy Wax, Cotton"* |

### Editions, formats & content details

| Field | Type | Description |
| --- | --- | --- |
| `numberOfItems` | Integer | The number of items of this product. **-1** if not available.<br>Example: *1* |
| `numberOfPages` | Integer | The number of pages of this product. **-1** if not available.<br>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.<br>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.<br>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.<br>Examples: *\[ \[ "English" \], \[ "English", "Original Language" \] \]* |
| `model` | String | The item’s model. **null** if not available.<br>Example: *DSC-H300/BM* |
| `color` | String | The item’s color. **null** if not available.<br>Example: *Black* |
| `size` | String | The item’s size. **null** if not available.<br>Example: *S* |
| `edition` | String | The item’s edition. **null** if not available.<br>Example: *Standard Edition* |
| `format` | String | The item’s format. **null** if not available.<br>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.<br>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.<br>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:<br>• `aspect` – *String*<br>• `value` – *String* |

Example `hazardousMaterials` entries:

```json
{
  "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.<br>Example: *144* |
| `packageLength` | Integer | The package’s length in millimeters. **0 or -1** if not available.<br>Example: *144* |
| `packageWidth` | Integer | The package’s width in millimeters. **0 or -1** if not available.<br>Example: *144* |
| `packageWeight` | Integer | The package’s weight in grams. **0 or -1** if not available.<br>Example: *1500 (= 1.5 kg)* |
| `packageQuantity` | Integer | Quantity of items in the package. **0 or -1** if not available.<br>Example: *4* |
| `itemHeight` | Integer | The item’s height in millimeters. **0 or -1** if not available.<br>Example: *144* |
| `itemLength` | Integer | The item’s length in millimeters. **0 or -1** if not available.<br>Example: *144* |
| `itemWidth` | Integer | The item’s width in millimeters. **0 or -1** if not available.<br>Example: *144* |
| `itemWeight` | Integer | The item’s weight in grams. **0 or -1** if not available.<br>Example: *1500 (= 1.5 kg)* |

### Availability & buy box eligibility

| Field | Type | Description |
| --- | --- | --- |
| `availabilityAmazon` | Integer | Availability of the sold by Amazon offer. Possible values:<br>• **-1**: no Amazon offer exists<br>• **0**: Amazon offer is in stock and shippable<br>• **1**: Amazon offer is currently not in stock, but will be in the future (pre-order)<br>• **2**: Amazon offer availability is “unknown”<br>• **3**: Amazon offer is currently not in stock, but will be in the future (back-order)<br>• **4**: Amazon offer shipping is delayed – see `availabilityAmazonDelay` for more details |
| `availabilityAmazonDelay` | Integer array | If `availabilityAmazon` has the value *4*, this field will provide the delay interval in hours. **null** if no data is available.<br>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:<br>• **0**: New FBA<br>• **1**: New FBM<br>• **2**: Used FBA<br>• **3**: Used FBM<br>• **4**: Collectible FBA<br>• **5**: Collectible FBM<br>• **6**: Refurbished FBA<br>• **7**: Refurbished FBM |
| `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.<br>Example: *\[ 273344490183, 0 \]* |

### Flags & miscellaneous

| Field | Type | Description |
| --- | --- | --- |
| `isAdultProduct` | Boolean | Indicates if the item is considered to be for adults only.<br>Example: *true* |
| `isHeatSensitive` | Boolean | Indicates if the item is heat sensitive (e.g. meltable).<br>Example: *true* |
| `isMerchOnDemand` | Boolean | True if this product is an Amazon Merch on Demand product. **undefined** otherwise.<br>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.<br>Example: *true* |
| `ingredients` | String | The ingredient list of the product. **undefined** if not available.<br>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.<br>Example: *true* |
| `audienceRating` | String | Audience rating. The rating suggests the age for which the media is appropriate.<br>Example: *PG-13 (Parents Strongly Cautioned)* |
| `urlSlug` | String | The product listing URL slug.<br>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:<br>• **null**: The return rate is either unavailable or considered average.<br>• **1**: The product has a low return rate.<br>• **2**: The product has a high return rate. |
| `isEligibleForSuperSaverShipping` | Boolean | Whether or not the product’s buy box is eligible for free shipping.<br>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.<br>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.<br>Example: *12* |

Example `fbaFees` object:

```javascript
"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:<br>• The first entry is the discount for a one-time coupon (single purchase).<br>• The second entry is a Subscribe & Save first-order coupon (S&S initial order only). The Subscribe & Save value represents a clickable one-time coupon that applies only to the first Subscribe & Save order. It does not represent an ongoing Subscribe & Save discount for subsequent deliveries.<br>Entry value is either **0** if no coupon of that type is offered, **positive** for an absolute discount, or **negative** for a percentage discount. The `coupon` field is always accessible, but only updated if the *offers* parameter was used in the [Product Request](https://env.7xmtools.com/api-docs/product.html).<br> 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.<br>Format: \[ keepaTime, one-time coupon, subscribe and save coupon, keepaTime, … \]<br>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:<br>• `type` – *String* – The type of promotion: SNS<br>• `amount` – *Integer* – The discounted price<br>• `discountPercent` – *Integer* – The discount percent<br>• `snsBulkDiscountPercent` – *Integer* – The bulk discount percent for repeat SNS deliveries. **undefined** if no data available, **0** if no bulk discount provided. |
| `unitCount` | Object | Object that contains unit count data. **undefined** if it has no value.<br>• `unitValue` – *Double* – The field returns the specified weight or volume to facilitate per unit pricing. For products measured by volume, weight, or linear dimensions, it provides the total net quantity shipped for a single ASIN (e.g., a 12-pack of 6 fl oz bottles of water = 72 fl oz, or a single 2-liter bottle = 2 liters). For products sold as individual units, it returns the total number of units (e.g., a pack of 12 pens = 12).<br>• `unitType` – *String* – In cases where the product being sold is measured in units that are relevant to the customer’s purchasing decision, the *unitType* specifies the type of measurement used. For example, a bottle of soda may be measured in fluid ounces, while a box of screws is measured by the number of screws in the box.<br>• `eachUnitCount` – *Double* – The number of units in an ‘each’; where an ‘each’ refers to the smallest component of a product with a UPC, and a unit defines how this ‘each’ is measured. |

### 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](https://env.7xmtools.com/api-docs/product.html). Contains a [Statistics Object](https://env.7xmtools.com/api-docs/statistics-object.html). |
| `salesRankReference` | Long | The category node id of the main sales rank. **-1** if not available, **-2** if listed in launchpad.<br>Example: *281052* – [http://www.amazon.com/b/?node=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.<br>Format: \[ keepaTime, category node id, … \]<br>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.<br>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.<br>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.<br>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](https://env.7xmtools.com/api-docs/product.html). The *ratingCount* history has not been updated since April 9th 2025 as that data point was removed by Amazon. |

Example `salesRanks` object:

```javascript
"salesRanks": {
   "281052": [ keepaTime, salesRank, ... ],
   "123112042": [ keepaTime, salesRank, ... ]
}
```

Format of the `reviews` object:

```javascript
"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](https://env.7xmtools.com/api-docs/product.html). Contains [Marketplace Offer Objects](https://env.7xmtools.com/api-docs/offer-object.html). |
| `liveOffersOrder` | Integer array | Optional field, set only if the *offers* parameter was used in the [Product Request](https://env.7xmtools.com/api-docs/product.html). Contains an ordered array of index positions in the `offers` array for all [Marketplace Offer Objects](https://env.7xmtools.com/api-docs/offer-object.html) 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.<br>**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.<br>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.<br>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](https://env.7xmtools.com/api-docs/product.html). Contains a history of [sellerIds](https://env.7xmtools.com/api-docs/seller.html) 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”**.<br>Example: *\["2860926", "ATVPDKIKX0DER", …\]* |
| `buyBoxUsedHistory` | String array | Optional field, set only if the *offers* or *buybox* parameter was used in the [Product Request](https://env.7xmtools.com/api-docs/product.html). A history of **used** buy box winners, containing the [sellerIds](https://env.7xmtools.com/api-docs/seller.html), 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.<br>• *condition* can have the following values: **“2”** – Used - Like New, **“3”** – Used - Very Good, **“4”** – Used - Good, **“5”** – Used - Acceptable<br>• *isFBA* is either **“1”** – offer is FBA or **“0”** – offer is merchant fulfilled.<br>Example: *\["2860926", "ATVPDKIKX0DER", "4", "1", …\]* |
| `isRedirectASIN` | Boolean | Valid only if the *offers* parameter was used in the [Product Request](https://env.7xmtools.com/api-docs/product.html). 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](https://www.amazon.com/b?node=5856181011). |
| `offersSuccessful` | Boolean | Valid only if the *offers* parameter was used in the [Product Request](https://env.7xmtools.com/api-docs/product.html). 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](https://www.amazon.com/Amazon-Trade-In/b?ie=UTF8&node=9187220011) 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](https://env.7xmtools.com/api-docs/product.html): 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](https://env.7xmtools.com/api-docs/statistics-object.html) 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:

```python
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`

```python
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](https://env.7xmtools.com/api-docs/product.html) response. A basic request:

**Java**

```java
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**

```php
<?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);
}
```

**Python**

```python
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 stock
```

**Node.js**

```javascript
const 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**

```bash
curl -s "https://api.keepa.com/product?key=YOUR_API_KEY&domain=1&asin=B00M0QVG3W"
```

### Example product object

```json
{
  "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.*
