Amazon Data API quick start
Account to parsed JSON in three steps. No SDK, no build tooling, no config file.
Create an account
The free plan gives you 50 requests a month with no card. We generate your first API key during signup, so you land on the dashboard with something you can paste straight away.
Create free accountSend your key with the request
Either header works — pick whichever your HTTP client makes easiest.
# preferred
x-api-key: ac_live_a1b2c3…
# equivalent
Authorization: Bearer ac_live_a1b2c3…
Call an endpoint
Here is a product search against the US marketplace with a New York delivery postcode.
curl -sS "https://amazoncrawler.com/v1/products/search?query=wireless+mouse&marketplace=US&zip=10001" \
-H "x-api-key: YOUR_API_KEY"
import requests
API_KEY = "YOUR_API_KEY"
response = requests.get(
"https://amazoncrawler.com/v1/products/search",
params={
"query": "wireless mouse",
"marketplace": "US",
"zip": "10001",
},
headers={"x-api-key": API_KEY},
timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
const API_KEY = "YOUR_API_KEY";
const url = new URL("https://amazoncrawler.com/v1/products/search");
const params = {
query: "wireless mouse",
marketplace: "US",
zip: "10001",
};
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
const response = await fetch(url, {
headers: { "x-api-key": API_KEY },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
console.log(data);
<?php
$apiKey = 'YOUR_API_KEY';
$query = http_build_query([
'query' => 'wireless mouse',
'marketplace' => 'US',
'zip' => '10001',
]);
$ch = curl_init("https://amazoncrawler.com/v1/products/search?$query");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["x-api-key: $apiKey"],
CURLOPT_TIMEOUT => 30,
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
)
func main() {
u, _ := url.Parse("https://amazoncrawler.com/v1/products/search")
q := u.Query()
q.Set("query", "wireless mouse")
q.Set("marketplace", "US")
q.Set("zip", "10001")
u.RawQuery = q.Encode()
req, _ := http.NewRequest("GET", u.String(), nil)
req.Header.Set("x-api-key", "YOUR_API_KEY")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
json.NewDecoder(res.Body).Decode(&data)
fmt.Println(data)
}
What comes back
{
"page": 1,
"sort": null,
"count": 20,
"query": "wireless mouse",
"results": [
{
"url": "https://www.amazon.com/dp/B07CMS5Q6P/ref=sr_1_1_sspa",
"asin": "B07CMS5Q6P",
"badge": "Best Seller",
"image": "https://m.media-amazon.com/images/I/51sg9BLSMTL.jpg",
"price": {
"amount": 29.99,
"display": "$29.99",
"currency": "USD",
"list_price": 49.99
},
"prime": false,
"title": "Logitech G305 Lightspeed Wireless Gaming Mouse - Black | HERO sensor, 12,000 DPI, Six programmable buttons, 250-hour battery, On-board memory",
"rating": 4.6,
"delivery": "FREE delivery Mon, Aug 10 on $35 of items shipped by Amazon",
"position": 4,
"sponsored": true,
"reviews_count": 39364,
"bought_past_month": "10K+ bought in past month"
},
{
"url": "https://www.amazon.com/dp/B005EJH6Z4/ref=sr_1_2_ffob_sspa",
"asin": "B005EJH6Z4",
"badge": null,
"image": "https://m.media-amazon.com/images/I/61YQeAUIboL.jpg",
"price": {
"amount": 12.58,
"display": "$12.58",
"currency": "USD",
"list_price": null
},
"prime": false,
"title": "Amazon Basics 2.4 GHz Wireless Optical Computer Mouse with USB Nano Receiver",
"rating": 4.5,
"delivery": "FREE delivery Mon, Aug 10 on $35 of items shipped by Amazon",
"position": 5,
"sponsored": true,
"reviews_count": 69507,
"bought_past_month": "10K+ bought in past month"
}
],
"marketplace": "US",
"has_next_page": true,
"total_results": 42555
}
Check your budget without spending it
GET /v1/usage returns your current plan, credits used and reset date.
It requires a key but costs nothing — safe to poll from a health check.
# your quota state — no credits charged
curl "https://amazoncrawler.com/v1/usage" -H "x-api-key: $AC_KEY"
# machine-readable endpoint index — no key needed
curl "https://amazoncrawler.com/v1/"
Handle the two failures that actually happen
Almost every real-world error is one of these. Both are transient and both are safe to retry with backoff — neither is charged against your credits.
| Status | Meaning | What to do |
|---|---|---|
| 429 | Rate limit or monthly credits exhausted. | Read Retry-After, sleep, retry. If it is the quota, upgrade or wait for the reset. |
| 502 / 504 | Amazon returned something unusable, or timed out. | Retry with exponential backoff. Roughly 1 in 500 requests on busy surfaces. |
import time, requests
def fetch(path, params, tries=4):
for attempt in range(tries):
r = requests.get(f"https://amazoncrawler.com/v1{path}", params=params,
headers={"x-api-key": KEY}, timeout=30)
if r.status_code < 400:
return r.json()
if r.status_code in (429, 502, 504):
time.sleep(2 ** attempt)
continue
r.raise_for_status() # 4xx: your request, not our infrastructure
raise RuntimeError("exhausted retries")