Operating the API

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

PlanRequests / monthRate limitOverageKeys
Free 50 1/sec Hard stop at limit 1

What costs a credit

CallCostWhy
Any data endpoint1Flat, regardless of response size or page count.
/scrape2Detects the page type before parsing, so it does more work.
/v1/0Endpoint index. No key required.
/v1/usage0Your own quota state. Key required, free to poll.
Failed requests04xx, 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.

Staying under the limit
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

GET /v1/usage
{
  "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/top for a rating summary costs the same as full reviews but returns far less to process.
  • Prefer /utility/gtin-to-asin over search. One deterministic lookup beats a search you then have to disambiguate.
  • Batch by category, not by ASIN. /bestsellers returns 30 ranked products for one credit.
  • Set include_sponsored=false when tracking organic rank, so you are not paying to parse ads.

Compare plan limits →