Stripe Error rate_limit: Rate limit exceeded
You exceeded Stripe's per-account request rate (by default 100 ops/s in live mode, 25 in test mode). Retry with exponential backoff and stop polling — use webhooks and list pagination instead.
Identify: does your log match?
{
"error": {
"code": "rate_limit",
"doc_url": "https://stripe.com/docs/error-codes/rate-limit",
"message": "Request rate limit exceeded. Learn more about rate limits here https://stripe.com/docs/rate-limits.",
"type": "invalid_request_error"
}
}- High
Bulk jobs without concurrency limits
Backfills or migrations fire thousands of requests via Promise.all, spiking above the per-second limit.
- Medium
Polling instead of webhooks
Retrieving PaymentIntents or Subscriptions every few seconds to detect status changes burns the read budget.
- Medium
Test mode has lower limits
Load tests in test mode hit the 25 ops/s limit much sooner than production would.
Fix
Enable SDK network retries
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, { maxNetworkRetries: 3, // exponential backoff on 429, 409 lock_timeout and network errors timeout: 20000, });
stripe-node retries 429s with backoff and reuses the same idempotency key, so POST retries cannot double-charge.
Verify: reproduce it on purpose
$ for i in $(seq 1 300); do curl -s -o /dev/null -w "%{http_code}\n" https://api.stripe.com/v1/customers?limit=1 -u "$STRIPE_SECRET_KEY:" & done | sort | uniq -cRun it against a dev environment to trigger rate_limit on purpose and test your error handler.
Prevent
- Prefer webhooks over polling for state changes.
- Use auto-pagination (for await) instead of parallel page fetches.
- Run load tests against stripe-mock, not test mode.
FAQ
What is Stripe's API rate limit?
By default 100 read and 100 write operations per second in live mode and 25 each in test mode, with lower limits on some endpoints such as Search.
Does Stripe send a Retry-After header?
Not reliably. Use exponential backoff with jitter, which the official SDKs implement via maxNetworkRetries.
Is rate_limit the same as lock_timeout?
No. lock_timeout (also 429) means concurrent requests touched the same object; serialize writes per object.
Related errors
Last verified 2026-10-14 · Source: Stripe OpenAPI spec + decline codes + webhook docs · Official docs ↗ · ~3,600 searches/mo