Using the API
Rate limits
Limits are counted for the whole business in one mode. Your secret and restricted keys share one allowance and your publishable keys share another, so traffic on a public page can never use up what your server needs. Live and test have separate allowances, so a load test in test mode cannot starve the live shop.
The limits
| Unverified tier | Verified business | |
|---|---|---|
| Requests per minute, per merchant, per mode, all keys together | 60 | 600 |
| Bucket size (spent at most 10 a second) | 60 | 600 |
| Requests in flight at once | 10 | 50 |
| Publishable key, per client IP address, per key | 30 per minute | 30 per minute |
| Exports | 10 per hour | 10 per hour |
| Event resends | 100 per hour | 100 per hour |
Emails about one invoice or receipt, once payer email is on (in this release every send is refused with payer_email_off) | 5 per 24 hours | 5 per 24 hours |
The allowance is a bucket that holds as many requests as the per-minute limit, 60 or 600, and refills evenly: one a second at 60 a minute. It is spent at most 10 requests in any one second, so a full bucket of 600 lasts a minute at that pace, and at most 10 or 50 requests may be in flight at once. Creating more keys does not multiply the limit.
Requests made with a publishable key draw on a bucket of their own of the same size, with its own requests in flight, and never on the one your secret and restricted keys use. A publishable key is also limited to 30 requests a minute from each client address; an IPv6 address counts as its whole /64.
The headers on every response
Response headers
RateLimit-Limit: 60
RateLimit-Remaining: 41
RateLimit-Reset: 19RateLimit-Reset is the seconds until the bucket is full again. A refused request answers 429 with rate_limit_exceeded and Retry-After: <seconds>. Requests refused by the rate limit are not counted against it and are not stored for idempotency.
Not the same as business limits
These limits protect the service. They are separate from a tier's business limits (order size, 30-day volume, open orders, daily payouts), which answer 403 with a limit_error and do not clear by waiting a minute.
Webhook deliveries to you are not counted. Hosted checkout pages and payment links have their own limits per visitor.