StripeRunbook 0/4 done
rate_limit

Stripe Error rate_limit: Rate limit exceeded

Warning↻ Retryable · exponential backoffHTTP 429 Too Many RequestsAPI Gateway
TL;DR · 10-second read

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?

What you see · exact log / response
{
  "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"
  }
}
  1. High

    Bulk jobs without concurrency limits

    Backfills or migrations fire thousands of requests via Promise.all, spiking above the per-second limit.

  2. Medium

    Polling instead of webhooks

    Retrieving PaymentIntents or Subscriptions every few seconds to detect status changes burns the read budget.

  3. 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

✕ Broken · Node.js
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
✓ Fixed · Node.js
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

Reproduce locally · bash
$ 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 -c

Run 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