# Amazon

Amazon product data, including the buy-box owner and — with `search_and_offers` — the full
list of seller offers.
See the [Amazon Price Tracker use case →](https://kwery.co/use-cases/amazon-price-tracking-api)

## Supported countries 

`country` accepts: `us` `ca` `mx` `br` `uk (gb)` `de` `at` `ch` `es` `fr` `it` `jp` `in` `ae` `au` `nl` `se` `pl` `be` `sg` `tr`

`uk` and `gb` are the same UK marketplace. `at` and `ch` are served from the amazon.de
storefront with Austria/Switzerland localization.

## Keys 

| Key | Values | Description |
|  --- | --- | --- |
| `term` | Free text | Keyword search. |
| `asin` | 10-char ASIN | Direct product lookup. |
| `gtin` | EAN / GTIN-13 | Resolved to the matching ASIN, then fetched. |


## Topics 

| Topic | Description |
|  --- | --- |
| `search` (default) | Product page, including the current buy-box. |
| `search_and_offers` | Also fetches the full seller-offer list (Amazon's "all offers" view). |


## Product `content` fields 

| Field | Description |
|  --- | --- |
| `product_id` | Amazon product ID (the ASIN). |
| `name` | Product title. |
| `url` | Product URL. |
| `brand_name` | Brand, where available. |
| `category` | Category info (`name`, `node_id`, `rank`). |
| `bsr` | Best-seller rank entries. |
| `parent_asin` | Parent ASIN for variation products. |
| `currency` | ISO currency. |
| `buybox.price` | Buy-box price. On a Prime-exclusive deal this is the **regular (non-Prime) price**; the Prime price is in `prime_price`. |
| `buybox.seller_name` / `buybox.seller_id` | Seller currently winning the buy box — the same `buybox` object shape Walmart and Kaufland return. |
| `seller_type` | Fulfilment of the buy-box seller: `amazon` (sold by Amazon, 1P), `fba` (third-party, Fulfilled by Amazon), `fbm` (third-party, fulfilled by merchant). Modern response format. |
| `is_prime` | `true` when the buy box carries a Prime-exclusive price (a discount available only to Prime members). Modern response format. |
| `prime_price` | The Prime-exclusive price when `is_prime` is `true`, otherwise `null`. Modern response format. |
| `shipping` | Buy-box shipping cost. |
| `availability` | `in_stock` or `out_of_stock` — whether the product page is purchasable. Unified field, see [Availability](/sources#availability). |
| `no_shops` | Number of distinct sellers seen. |
| `on_amazon_since` | First-seen date, where available. |
| `description_text` / `bullet_text` | Product description and bullet points. |
| `rating` / `rating_count` | Aggregate reviews. |
| `offers_count` | Number of offers (populated with `search_and_offers`). |
| `price_min` / `price_avg` / `price_max` | Offer price aggregates (with `search_and_offers`). |
| `offers` | Seller offers (with `search_and_offers`). |


Each offer carries `total` — the landed price (`price` + `shipping`).

With `topic: search_and_offers`, `offers[]` lists each seller offer (seller name, price,
currency, shipping, condition). The buy-box stays available separately, nested under
`amazon`.

The three fields marked *modern response format* — `seller_type` (three-value fulfilment),
`is_prime` and `prime_price` — are part of the current Amazon response. A small number of
pre-cutover accounts are pinned to the older Amazon shape (two-value `seller_type`, no
Prime fields) so their existing integrations keep working; contact us to move an account
onto the current format.

## Example request 

cURL
```bash
curl -s https://api.kwery.co/job \
  -H "Authorization: Bearer $KWERY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"source":"amazon","country":"de","key":"asin","topic":"search_and_offers","values":["B0847ZTV5Q"]}'
```

Node.js
```js
const res = await fetch('https://api.kwery.co/job', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.KWERY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ source: 'amazon', country: 'de', key: 'asin', topic: 'search_and_offers', values: ['B0847ZTV5Q'] }),
});
const data = await res.json();
if (data.error) throw new Error(data.message);
console.log('job id:', data.job._id);
```

Python
```python
import os, requests

res = requests.post(
    "https://api.kwery.co/job",
    headers={"Authorization": f"Bearer {os.environ['KWERY_API_KEY']}"},
    json={"source": "amazon", "country": "de", "key": "asin", "topic": "search_and_offers", "values": ["B0847ZTV5Q"]},
)
data = res.json()
if data.get("error"):
    raise RuntimeError(data["message"])
print("job id:", data["job"]["_id"])
```

JavaScript
```js
const res = await fetch('https://api.kwery.co/job', {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${KWERY_API_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ source: 'amazon', country: 'de', key: 'asin', topic: 'search_and_offers', values: ['B0847ZTV5Q'] }),
});
const data = await res.json();
if (data.error) throw new Error(data.message);
console.log('job id:', data.job._id);
```

PHP
```php
<?php
$ch = curl_init('https://api.kwery.co/job');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer ' . getenv('KWERY_API_KEY'),
    'Content-Type: application/json',
  ],
  CURLOPT_POSTFIELDS => '{"source":"amazon","country":"de","key":"asin","topic":"search_and_offers","values":["B0847ZTV5Q"]}',
]);
$data = json_decode(curl_exec($ch), true);
if ($data['error']) { throw new Exception($data['message']); }
echo 'job id: ' . $data['job']['_id'];
```

Go
```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"os"
)

func main() {
	body := []byte(`{"source":"amazon","country":"de","key":"asin","topic":"search_and_offers","values":["B0847ZTV5Q"]}`)
	req, _ := http.NewRequest("POST", "https://api.kwery.co/job", bytes.NewBuffer(body))
	req.Header.Set("Authorization", "Bearer "+os.Getenv("KWERY_API_KEY"))
	req.Header.Set("Content-Type", "application/json")
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	var data map[string]any
	json.NewDecoder(resp.Body).Decode(&data)
	fmt.Println("job:", data["job"])
}
```

Java
```java
var client = java.net.http.HttpClient.newHttpClient();
var request = java.net.http.HttpRequest.newBuilder()
    .uri(java.net.URI.create("https://api.kwery.co/job"))
    .header("Authorization", "Bearer " + System.getenv("KWERY_API_KEY"))
    .header("Content-Type", "application/json")
    .POST(java.net.http.HttpRequest.BodyPublishers.ofString(
        "{\"source\":\"amazon\",\"country\":\"de\",\"key\":\"asin\",\"topic\":\"search_and_offers\",\"values\":[\"B0847ZTV5Q\"]}"))
    .build();
var response = client.send(request, java.net.http.HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
```

C#
```csharp
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization",
    $"Bearer {Environment.GetEnvironmentVariable("KWERY_API_KEY")}");
var body = new StringContent(
    """{"source":"amazon","country":"de","key":"asin","topic":"search_and_offers","values":["B0847ZTV5Q"]}""",
    System.Text.Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://api.kwery.co/job", body);
Console.WriteLine(await response.Content.ReadAsStringAsync());
```

Ruby
```ruby
require 'net/http'
require 'json'

uri = URI('https://api.kwery.co/job')
req = Net::HTTP::Post.new(uri, {
  'Authorization' => "Bearer #{ENV['KWERY_API_KEY']}",
  'Content-Type' => 'application/json',
})
req.body = '{"source":"amazon","country":"de","key":"asin","topic":"search_and_offers","values":["B0847ZTV5Q"]}'
data = JSON.parse(Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }.body)
raise data['message'] if data['error']
puts "job id: #{data['job']['_id']}"
```

## Example response 

Results are fetched with `GET /job/{id}/download` once the job is `finished`. This is a **real response**, captured live on 2026-09-18 — the exact payload a self-serve account receives for the request above.
To keep this page readable, `offers` shows the first 5 of the 13 the download contains, and the two long German copy fields (`bullet_text`, `description_text`) are omitted. Everything else is unedited.

Worth reading the `total` column rather than `price`: the €43.88 listing costs **€99.45 delivered** (€55.57 shipping), while the €31.19 buy-box lands at **€35.18** — which is why the landed total is part of every offer.

```json
{
  "job_id": "6aacf9da6abe0b5ab35556a6",
  "status": "finished",
  "results": [
    {
      "query": {
        "source": "amazon",
        "country": "de",
        "key": "asin",
        "value": "B0847ZTV5Q",
        "topic": "search_and_offers",
        "max_pages": 1,
        "max_age": 1200
      },
      "content": {
        "product_id": "B0847ZTV5Q",
        "name": "Rowenta Studio Dry Glow Haartrockner, 2100 Watt, Föhn mit Diffusor für Locken, 3 Temperatur- und 2 Geschwindigkeitsstufen, Ionenfunktion, Kaltlufttaste, weiß/roségold, CV5830",
        "url": "https://www.amazon.de/dp/B0847ZTV5Q",
        "category": {
          "name": "Kosmetik",
          "node_id": "84230031",
          "rank": null
        },
        "brand_name": "Rowenta",
        "rating": 90,
        "rating_count": 5471,
        "currency": "EUR",
        "seller_type": "amazon",
        "bsr": [],
        "parent_asin": "B0847ZTV5Q",
        "shipping": 0,
        "is_available": true,
        "on_amazon_since": null,
        "availability": true,
        "no_shops": 16,
        "offers_count": 13,
        "price_avg": 36.34,
        "price_max": 45.79,
        "price_min": 24.69,
        "is_prime": false,
        "prime_price": null,
        "offers": [
          {
            "price": 26.21,
            "shipping": 15.94,
            "total": 42.15,
            "currency": "EUR",
            "position": 1,
            "condition": "Neu",
            "seller_id": "",
            "seller_name": "Amazon",
            "seller_url": "https://www.amazon.de",
            "seller_type": "standalone-shop",
            "marketplace_name": "amazon",
            "seller_rating": 0,
            "seller_rating_count": 0
          },
          {
            "price": 43.88,
            "shipping": 55.57,
            "total": 99.45,
            "currency": "EUR",
            "position": 2,
            "condition": "Neu",
            "seller_id": "A2N8G12PC7U0FI",
            "seller_name": "Sotel (AGB / Garantiebestimmungen siehe hier)",
            "seller_url": "https://www.amazon.de/sp?seller=A2N8G12PC7U0FI",
            "seller_type": "marketplace-shop",
            "marketplace_name": "amazon",
            "seller_rating": 88,
            "seller_rating_count": 11014
          },
          {
            "price": 31.19,
            "shipping": 3.99,
            "total": 35.18,
            "currency": "EUR",
            "position": 1,
            "condition": "Neu",
            "seller_id": "",
            "seller_name": "Amazon",
            "seller_url": "https://www.amazon.de",
            "seller_type": "standalone-shop",
            "marketplace_name": "amazon",
            "seller_rating": 0,
            "seller_rating_count": 0
          },
          {
            "price": 24.69,
            "shipping": 3.99,
            "total": 28.68,
            "currency": "EUR",
            "position": 2,
            "condition": "Offener Karton - Wie neu",
            "seller_id": "",
            "seller_name": "Amazon Retourenkauf",
            "seller_url": "https://www.amazon.de",
            "seller_type": "standalone-shop",
            "marketplace_name": "amazon",
            "seller_rating": 0,
            "seller_rating_count": 0
          },
          {
            "price": 33.74,
            "shipping": 0,
            "total": 33.74,
            "currency": "EUR",
            "position": 3,
            "condition": "Neu",
            "seller_id": "AUAVRUONAQ4EG",
            "seller_name": "cyberport",
            "seller_url": "https://www.amazon.de/sp?seller=AUAVRUONAQ4EG",
            "seller_type": "marketplace-shop",
            "marketplace_name": "amazon",
            "seller_rating": 68,
            "seller_rating_count": 6714
          }
        ],
        "buybox": {
          "price": 31.19,
          "seller_name": "Amazon",
          "seller_id": "A3JWKAKR8XB7XF"
        }
      },
      "success": true,
      "updated_at": "2026-09-18T08:45:32.774Z",
      "trust": {
        "score": 0.89,
        "components": {
          "identity": 0.7,
          "completeness": 0.8,
          "price_integrity": 1,
          "offer_contamination": 1,
          "freshness": 1
        },
        "flagged_offers": []
      },
      "served_from": "live",
      "observed_at": "2026-09-18T08:45:43.824Z"
    }
  ]
}
```

The `trust` block is explained in [Confidence score](/guides/trust); `served_from` and `observed_at` in [Audit & provenance](/guides/audit-and-provenance).