Amazon Data API rate limits & credits
Two independent limits: how fast you may call (per second) and how much you may call (per month). They are enforced separately and reported separately.
By plan
| Plan | Requests / month | Rate limit | Overage | Keys |
|---|---|---|---|---|
| Free | 50 | 1/sec | Hard stop at limit | 1 |
What costs a credit
| Call | Cost | Why |
|---|---|---|
| Any data endpoint | 1 | Flat, regardless of response size or page count. |
| /scrape | 2 | Detects the page type before parsing, so it does more work. |
| /v1/ | 0 | Endpoint index. No key required. |
| /v1/usage | 0 | Your own quota state. Key required, free to poll. |
| Failed requests | 0 | 4xx, 5xx and rate-limited calls are never charged. |
limit on /products/search auto-paginates
server-side. Each upstream page it fetches is one credit — so
limit=100 spanning five pages costs five, not one.
Rate limiting
A fixed one-second window per API key. Exceed it and you get
429 rate_limited with Retry-After: 1.
The window resets on the next whole second, so the correct response is to sleep briefly and
retry rather than to fail the job.
The limit is per key, so splitting a workload across several keys does not multiply your throughput fairly — but it does isolate a noisy batch job from your latency-sensitive traffic.
import time
from concurrent.futures import ThreadPoolExecutor
RATE = 15 # your plan's requests/second
def throttled(items, fn):
with ThreadPoolExecutor(max_workers=RATE) as pool:
for batch in chunks(items, RATE):
started = time.monotonic()
yield from pool.map(fn, batch)
# pad out the remainder of the second
time.sleep(max(0, 1.0 - (time.monotonic() - started)))
Monthly credits
Credits reset at the start of each billing period — 30 days from when your current plan started,
not on the first of the calendar month. The exact timestamp is on every response as
X-Credits-Reset and in
GET /v1/usage.
Running out
Every plan stops at its limit
The API returns 429 quota_exhausted until the period resets.
Rejected requests cost no credits, and no plan bills you for volume beyond what you bought.
Need more before the reset?
Upgrade from the billing dashboard. The new allowance applies from your very next request — usage already recorded carries over, so nothing resets and nothing is lost.
Watching your budget
{
"plan": "Growth",
"interval": "monthly",
"status": "active",
"included_requests": 150000,
"requests_used": 41827,
"requests_remaining": 108173,
"overage_requests": 0,
"rate_limit_per_sec": 15,
"period_start": "2026-07-15T09:12:04Z",
"period_end": "2026-08-14T09:12:04Z"
}
You can also enable email alerts at 80% and 100% of your monthly credits from account settings.
Spending fewer credits
- Cache on your side. Product titles, brands and images change rarely — refetch prices hourly and everything else weekly.
- Use the narrowest endpoint.
/products/reviews/topfor a rating summary costs the same as full reviews but returns far less to process. - Prefer
/utility/gtin-to-asinover search. One deterministic lookup beats a search you then have to disambiguate. - Batch by category, not by ASIN.
/bestsellersreturns 30 ranked products for one credit. - Set
include_sponsored=falsewhen tracking organic rank, so you are not paying to parse ads.