Parsed, not proxied HTML
Every field is extracted and typed. price.amount is a number,
rating is a float, prime is a boolean.
No regex archaeology on your side.
GET
Stop maintaining scrapers. One GET request returns structured
product, seller, deal and creator data — price, rating, offers, images, availability —
parsed, typed and ready to use.
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)
}
{
"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
}
Amazon changes its markup constantly, localises everything by postcode and gates half its surfaces behind client-side rendering. We absorb all of it so your code stays a single HTTP call.
Every field is extracted and typed. price.amount is a number,
rating is a float, prime is a boolean.
No regex archaeology on your side.
Pass zip and prices, delivery promises and availability resolve
to that location. Skip it and Amazon hides prices on many listings — we document exactly where.
In-process caching with X-Cache: HIT|MISS on every response, and
X-Response-Time-Ms so you can measure us rather than trust us.
Where an upstream surface is gated or client-rendered, the response carries a
note explaining the limit — instead of an empty object that
looks like your bug.
Per-request logs, per-endpoint breakdowns, latency, cache rate and error rate — plus credit headers on every response so your app knows its own budget.
Issue separate live and test keys per environment, rotate them without downtime and revoke instantly. We store only a hash — a leak of our database hands out nothing.
Everything the Amazon Shopping app can see, reconstructed as REST.
Search, details, offers and reviews.
Seller profile, feedback and storefront.
Ranked grids and promotions.
Identifier conversion and taxonomy.
Full parameters, response bodies and code samples in the reference.
Browse the API ReferenceFree tier, no card. You land on the dashboard with a live key already generated.
x-api-key: ac_live_… — or
Authorization: Bearer if that suits your client better.
Plain query strings, plain JSON back. Watch X-Credits-Remaining
to keep an eye on your budget.
# Track the Buy Box across a catalogue of ASINs
import requests
API = "https://amazoncrawler.com/v1"
HEAD = {"x-api-key": "ac_live_…"}
for asin in watchlist:
r = requests.get(
f"{API}/products/offers",
params={"asin": asin, "zip": "10001"},
headers=HEAD,
)
buybox = r.json()["offers"][0]
if buybox["price"]["amount"] < targets[asin]:
alert(asin, buybox)
# budget left, straight off the response
remaining = r.headers["X-Credits-Remaining"]
Add marketplace=DE to any endpoint. Prices come back in that
marketplace's currency, with local delivery and availability.
Create an account, copy the key we generate for you, and paste one line of cURL. No card, no sales call, no onboarding form.