AutoRetry IconAutoRetry
Getting Startedcore

API Rate Limiting: Implementation & Best Practices

API rate limiting protects backend services from being overwhelmed by excessive traffic, mitigates DoS attacks, and ensures fair resource allocation.

1. What is Rate Limiting?

Rate limiting restricts the number of requests a user, IP address, or application can make to an API within a specified window of time (e.g., 100 requests per minute). When the limit is exceeded, the server typically responds with an HTTP status code 429 Too Many Requests.

Common Use Cases

  • Abuse Prevention: Stopping credential stuffing, scraping, and brute-force attacks.
  • Tiered Monetization: Enforcing pricing tiers for SaaS applications (e.g., Free tier: 60 req/min vs. Enterprise tier: 10,000 req/min).
  • Resource Stability: Preventing traffic spikes from crashing shared downstream microservices.

2. Standard Rate Limiting Algorithms

Choosing the right algorithm depends on your consistency, memory, and performance requirements.

Algorithm

How It Works

Pros

Cons

Token Bucket

Tokens are added at a fixed rate to a bucket of maximum capacity. Each request consumes one token.

Allows for short bursts of traffic while enforcing average limits.

Requires state tracking per client.

Leaky Bucket

Requests enter a queue and are processed at a constant, fixed rate. Excess requests overflow and are dropped.

Smooths out traffic spikes into steady processing streams.

Can introduce latency if the queue fills up.

Fixed Window Counter

Counts requests in fixed time blocks (e.g., 12:00:00 to 12:01:00). Reset occurs at window boundary.

Simple to implement and memory-efficient.

Vulnerable to traffic spikes at window boundaries (double requests in split moments).

Sliding Window Log

Tracks timestamps of every request in a sorted set. Old timestamps outside the window are purged.

Highly accurate; eliminates boundary spike issues.

High memory overhead for high-traffic APIs.

To provide a seamless developer experience, your API should communicate rate limit status clearly via standard response headers on every request:

  • X-RateLimit-Limit: The maximum number of requests allowed in the current period.
  • X-RateLimit-Remaining: The number of remaining requests left in the current window.
  • X-RateLimit-Reset: The Unix timestamp or UTC time when the rate limit window resets.
  • Retry-After: Included strictly in 429 responses, indicating how many seconds the client must wait before making a new request.

Example Response (429 Too Many Requests)

HTTP

HTTP/1.1 429 Too Many Requests
Content-Type: application/json
Retry-After: 60
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1774972800

{ "error": "Rate limit exceeded. Please retry after 60 seconds." }

4. Best Practices for API Consumers (Clients)

If you are consuming an API with rate limits, adhere to these guidelines to prevent application failures:

  1. Implement Exponential Backoff with Jitter: When receiving a 429 status, do not retry immediately. Wait for the duration specified in Retry-After, adding random jitter to prevent "thundering herd" problems.
  2. Cache Responses: Cache idempotent GET requests locally to minimize redundant network calls.
  3. Use Batching and Bulk Endpoints: If the API supports bulk operations (e.g., fetching multiple records in a single payload), use them instead of individual polling requests.