Skip to content

🪟 Fixed Window Rate Limiting

1. What is Fixed Window Rate Limiting?

  • Concept:
    Time is split into fixed intervals (e.g., 1 minute). Each client can make up to a set number of requests per interval. When the interval resets, so does the counter.

  • Example:
    If the limit is 5 requests per minute, a client can make 5 requests between 12:00:00 and 12:00:59. At 12:01:00, the counter resets.


2. Usage

Single Limiter Example

from fastapicap import RateLimiter
from fastapi import Depends

limiter = RateLimiter(limit=5, minutes=1)

@app.get("/limited", dependencies=[Depends(limiter)])
async def limited_endpoint():
    return {"message": "You are within the rate limit!"}

Multiple Limiters Example

limiter_1s = RateLimiter(limit=1, seconds=1)
limiter_30m = RateLimiter(limit=30, minutes=1)

@app.get("/strict", dependencies=[Depends(limiter_1s), Depends(limiter_30m)])
async def strict_endpoint():
    return {"message": "You passed both rate limits!"}

3. Available Configuration Options

You can customize the Fixed Window limiter using the following parameters:

Parameter Type Description Default
limit int Required. Maximum number of requests allowed per window. Must be positive.
seconds int Number of seconds in the window. Can be combined with minutes, hours, or days. 0
minutes int Number of minutes in the window. 0
hours int Number of hours in the window. 0
days int Number of days in the window. 0
key_func Callable Function to extract a unique key from the request (e.g., by IP, user ID, etc.). By default, uses client IP and path.
on_limit Callable Function called when the rate limit is exceeded. By default, raises HTTP 429.
prefix str Redis key prefix for all limiter keys. "cap"

Note:
- The window size is calculated as the sum of all time units provided (seconds, minutes, hours, days). - At least one time unit must be positive, and limit must be positive.

Example:

# 100 requests per hour, with a custom Redis key prefix
limiter = RateLimiter(limit=100, hours=1, prefix="myapi")

4. How Fixed Window Works

Suppose you set a limit of 5 requests per minute:

  • At 12:00:00, the window starts.
  • The client makes 5 requests between 12:00:00 and 12:00:59 — all are allowed.
  • A 6th request at 12:00:30 is blocked with a 429 error.
  • At 12:01:00, the window resets. The client can make 5 more requests.

Visualization:

Time Request # Allowed? Reason
12:00:01 1 Within limit
12:00:10 2 Within limit
12:00:20 3 Within limit
12:00:30 4 Within limit
12:00:50 5 Within limit
12:00:55 6 Limit exceeded
12:01:01 7 New window, allowed

5. Notes, Pros & Cons

Pros: - Simple to understand and implement. - Low memory usage. - Good for aggressive, clear-cut limits.

Cons: - Can allow bursts at window boundaries (e.g., 5 requests at 12:00:59 and 5 more at 12:01:00).


Use Fixed Window for simple, aggressive limits where bursts at window boundaries are acceptable.