> ## Documentation Index
> Fetch the complete documentation index at: https://clair.im/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Amazon Products API

> Amazon Products API: search, product details, reviews, offers, sellers, GTIN lookup, best sellers, and categories. One page per request.

Nine endpoints, one subscription. Every call reads one live Amazon page and
costs **1 request**. Pass `engine=amazon` on every call. Search keeps
sponsored cards and flags them; lookup and seller products drop them. Fields
Amazon does not show come back `null` or empty.

See the [product page](https://clair.im/apis/amazon).

## Marketplace and location

Every endpoint takes two optional parameters. The response echoes both in `query`.

| Parameter  | Contract                                                                                                                                                  |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `country`  | Marketplace. Default `us`. `uk` is accepted as `gb`. Any other value is a 400.                                                                            |
| `zip_code` | Delivery postal code in that country, e.g. `10001`. Amazon then prices, stocks, and dates delivery for that address, and picks the buy-box seller for it. |

| `country` | Domain        | Currency |
| --------- | ------------- | -------- |
| `us`      | amazon.com    | USD      |
| `gb`      | amazon.co.uk  | GBP      |
| `ca`      | amazon.ca     | CAD      |
| `au`      | amazon.com.au | AUD      |
| `in`      | amazon.in     | INR      |
| `de`      | amazon.de     | EUR      |
| `es`      | amazon.es     | EUR      |
| `nl`      | amazon.nl     | EUR      |
| `be`      | amazon.com.be | EUR      |
| `jp`      | amazon.co.jp  | JPY      |

The request is made from the marketplace's country, and pages are read in
English. Without `zip_code`, Amazon picks a delivery location in that country
itself; the one it used is in `product.delivery_location`.

```sh theme={null}
curl -G https://api.clair.im/v1/product \
  -H "Authorization: Bearer YOUR_KEY" \
  --data-urlencode "engine=amazon" \
  --data-urlencode "asin=B07GR5K8SD" \
  --data-urlencode "country=de" \
  --data-urlencode "zip_code=10115"
```

## Search

`GET /v1/search?engine=amazon`

```sh theme={null}
curl -G https://api.clair.im/v1/search \
  -H "Authorization: Bearer YOUR_KEY" \
  --data-urlencode "engine=amazon" \
  --data-urlencode "q=wireless mouse" \
  --data-urlencode "brand=Logitech" \
  --data-urlencode "max_price=30" \
  --data-urlencode "prime=true"
```

| Parameter     | Required | Contract                                                                                              |
| ------------- | -------- | ----------------------------------------------------------------------------------------------------- |
| `engine`      | yes      | Must be `amazon`.                                                                                     |
| `q`           | one of   | Product keyword. Mapped to Amazon's `k`.                                                              |
| `category_id` | one of   | Numeric browse node, e.g. `12879431`. Search inside one category, with or without `q`.                |
| `sort_by`     | no       | `relevance` (default), `price_low_to_high`, `price_high_to_low`, `reviews`, `newest`, `best_sellers`. |
| `min_price`   | no       | Lowest price in the marketplace currency, e.g. `10` or `9.99`.                                        |
| `max_price`   | no       | Highest price in the marketplace currency.                                                            |
| `brand`       | no       | Brand name, e.g. `Logitech`. No commas.                                                               |
| `prime`       | no       | `true` for Prime-eligible items only. Amazon US only.                                                 |
| `min_rating`  | no       | `4` for Amazon's 4 Stars & Up filter.                                                                 |
| `condition`   | no       | `new`, `used`, or `renewed`.                                                                          |
| `deals`       | no       | `coupons`, `todays_deals`, or `all_discounts`.                                                        |
| `page`        | no       | 1-based Amazon results page. Default 1, max 10.                                                       |

Send `q`, `category_id`, or both. Do not send `limit` or `cursor`. The
filters are Amazon's own search refinements, so results match what a shopper
sees with the same filters ticked. Amazon numbers most refinements per
marketplace, and not every marketplace offers every one: `prime` outside the
US, `condition=renewed` on `ca`, `in`, `de`, `be`, and `jp`, and
`condition=used` on `in` and `es` return `400` before any request is charged.

Each hit is `position`, `asin`, `title`, `url`, `price_text`, `price`,
`currency`, `original_price_text`, `original_price`, `rating`, `ratings_count`,
`badge` (for example `Overall Pick`), `sales_volume` (for example
`1K+ bought in past month`), `image_url`, `sponsored`, `is_prime`,
`delivery`, `coupon`, and `other_offers`.

* `sponsored` is `true` for paid placements. They keep their place in
  `position`, as on the page.
* `is_prime` is `true` when the card offers Prime delivery and `false` when it
  shows delivery without Prime. Amazon shows Prime only to US visitors who are
  not logged in, so it is `null` on every other marketplace.
* `delivery` is the card's delivery line, e.g. `FREE delivery Tomorrow, Sep 26`.
  For Prime items this is the Prime member date.
* `coupon` is `{ text, price_text, price }`, e.g. `5% off coupon` and the price
  after it, or `null`.
* `other_offers` is the card's "More Buying Choices" line:
  `{ min_price_text, min_price, count }`, the cheapest other new or used offer
  and how many there are. `count` is a lower bound when Amazon prints `8+`.

## Product details

`GET /v1/product?engine=amazon&asin=B0CF3VGQFL`

| Parameter | Required | Contract           |
| --------- | -------- | ------------------ |
| `asin`    | yes      | 10-character ASIN. |

The body is `product`:

| Field                                            | Contents                                                                              |
| ------------------------------------------------ | ------------------------------------------------------------------------------------- |
| `title`, `brand`, `authors`                      | `authors` is filled for books; `brand` is then `null`.                                |
| `price`, `original_price`, `currency`            | Buy-box price and list price. For books with no buy box, the selected format's price. |
| `availability`                                   | Amazon's stock line.                                                                  |
| `sold_by`, `ships_from`                          | Buy-box seller `{ id, name }` and fulfiller. `sold_by.id` works as `seller_id`.       |
| `delivery`, `delivery_location`                  | Amazon's delivery promise and the address it was computed for.                        |
| `rating`, `ratings_count`, `rating_distribution` | Distribution is percent per star, keys `"5"` to `"1"`.                                |
| `image_url`, `images`                            | Full-size gallery.                                                                    |
| `bullets`, `description`                         | Feature bullets and the description or book blurb.                                    |
| `categories`                                     | Breadcrumb, broadest first.                                                           |
| `best_sellers_rank`                              | `[{ rank, category }]`.                                                               |
| `specifications`                                 | Name-to-value map from the product's spec tables.                                     |
| `identifiers`                                    | `isbn_10`, `isbn_13`, `upc`, `model_number`.                                          |
| `variants`                                       | `[{ asin, selected, attributes }]`, e.g. `{ "Color": "Deep Black" }`.                 |
| `formats`                                        | Book formats: `[{ name, asin, price, selected }]`.                                    |

## Product reviews

`GET /v1/product/reviews?engine=amazon&asin=B0CF3VGQFL`

The reviews Amazon shows on the product page without sign-in (usually 8 to 13),
plus `product.rating_distribution`. Amazon keeps the full review list behind
sign-in, so there is no `page`. Amazon sometimes serves the page without its
review block; Clair then reads the page once more, still for 1 request.

Each review is `id`, `title`, `body`, `rating`, `author`, `date` (ISO),
`country`, `verified_purchase`, `variant`, `helpful_votes`, and `url`.

## Product offers

`GET /v1/product/offers?engine=amazon&asin=1098145356`

Every seller in Amazon's all-offers panel. Each offer is `position`,
`condition` (`New`, `Used - Like New`, ...), `price`, `original_price`,
`delivery`, `ships_from`, and `seller` with `id`, `name`, `rating`,
`ratings_count`, and `positive_percent`. `offers` is empty when Amazon lists
none.

## GTIN lookup

`GET /v1/product/lookup?engine=amazon&gtin=9781098145354`

| Parameter | Required | Contract                                                |
| --------- | -------- | ------------------------------------------------------- |
| `gtin`    | yes      | UPC (12 digits), EAN (13), GTIN-8, GTIN-14, or ISBN-10. |

Returns product cards in the search shape. Use `results[0].asin`.

## Seller profile

`GET /v1/seller?engine=amazon&seller_id=AWZI6BA70DZZD`

`seller_id` comes from an offer. The body is `seller`: `name`, `logo_url`,
`rating`, `ratings_count`, `positive_percent`, `ratings` for `last_30_days`,
`last_90_days`, `last_12_months`, and `lifetime`, `rating_distribution`,
`business_name`, `business_address`, `about`, `storefront_url`, and recent
`feedback` (`rating`, `text`, `author`, `date`).

## Seller products

`GET /v1/seller/products?engine=amazon&seller_id=AWZI6BA70DZZD&page=1`

The seller's storefront as product cards in the search shape. `page` is 1 to 10.

## Best sellers

`GET /v1/bestsellers?engine=amazon&category=electronics`

| Parameter  | Required | Contract                                        |
| ---------- | -------- | ----------------------------------------------- |
| `category` | yes      | Best-seller slug, e.g. `electronics`, `books`.  |
| `node_id`  | no       | Subcategory node from `subcategories[]`.        |
| `page`     | no       | `1` or `2`. Amazon ranks 30 per page, 60 total. |

Each result is `rank`, `asin`, `title`, `url`, `price`, `rating`,
`ratings_count`, and `image_url`. `subcategories[]` has `name`, `category`, and
`node_id` for drilling down.

## Categories

`GET /v1/categories?engine=amazon`

Without parameters, the top-level departments. With `category` (and optionally
`node_id`), that node's children. Each entry is `name`, `category`, and
`node_id`. Use `node_id` as `category_id` in search or as `node_id` in best
sellers.

## Not available

Amazon renders deals client-side and puts full review pagination behind
sign-in, so neither is offered.

Auth, plans, rate limits, and error codes: [Authentication](/docs/authentication).
