Skip to content

Rate Limiting Introduction — Controlling API Traffic for Reliability

DodaTech Updated 2026-06-28 4 min read

In this tutorial, you will learn about Rate Limiting Introduction. We cover key concepts, practical examples, and best practices to help you master this topic.

Rate limiting controls how many requests a client can make to a server within a specific time window, preventing abuse, ensuring fair resource allocation, and maintaining service quality during traffic spikes.

What You'll Learn

  • What rate limiting is and why every API needs it
  • Common rate limiting algorithms and their trade-offs
  • How rate limiting protects both users and providers

Why It Matters

Without rate limiting, a single misconfigured client can consume all server resources. One malicious user can brute-force authentication endpoints. A traffic spike from a viral post can overwhelm your backend. Rate limiting prevents all these scenarios.

Real-World Use

Durga Antivirus Pro's API handles 10,000+ partner integrations. Rate limiting ensures that no single partner can exceed 1,000 requests per minute, preventing one partner's buggy client from degrading service for everyone else.

flowchart LR
    Clients["Multiple Clients"] --> RL["Rate Limiter"]
    RL -->|"Under limit"| Backend["Backend Service"]
    RL -->|"Over limit"| Error["429 Too Many Requests"]
    style RL fill:#dbeafe,stroke:#2563eb
    style Error fill:#fecaca,stroke:#dc2626

Common Rate Limiting Algorithms

Algorithm How It Works Best For
Token Bucket Tokens refill at a rate; requests consume tokens APIs with burst allowance
Leaky Bucket Requests processed at fixed rate; queue overflow drops Smooth traffic shaping
Fixed Window Counter resets at fixed intervals Simple per-minute limits
Sliding Window Window slides with each request Accurate rate tracking
Sliding Log Timestamp log of each request Precise, no boundary issues

How Rate Limiting Is Applied

Rate limiting can be applied at different levels:

  • Global: All requests across all clients
  • Per-IP: Each IP address has its own limit
  • Per-User: Each authenticated user has a limit
  • Per-Endpoint: Different limits for different API routes
  • Per-API-Key: Each API key has its own quota
def is_rate_limited(client_id, max_requests=100, window_seconds=60):
    current = get_request_count(client_id, window_seconds)
    if current >= max_requests:
        return True
    increment_request_count(client_id)
    return False

# Check on every request
if is_rate_limited(client_ip):
    return {"error": "Rate limit exceeded"}, 429

What Happens When Rate Limited

When a request exceeds the rate limit, the server returns:

  • Status code: 429 Too Many Requests
  • Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
  • Retry-After: Seconds until the client can retry
import time

def rate_limit_response(retry_after=60):
    return {
        "error": "Rate limit exceeded. Try again later.",
        "retry_after_seconds": retry_after
    }, 429, {
        "Retry-After": str(retry_after),
        "X-RateLimit-Limit": "100",
        "X-RateLimit-Remaining": "0",
        "X-RateLimit-Reset": str(int(time.time()) + retry_after),
    }

Common Mistakes

1. Not Having Rate Limits at All

The most common mistake. Without rate limits, your API is vulnerable to abuse, brute force, and accidental DDoS from misconfigured clients.

2. Rate Limiting After Processing

Check the rate limit before processing the request. Rate limiting after expensive computation wastes resources on rejected requests.

3. Not Returning Rate Limit Headers

Clients cannot adapt their behavior without knowing their remaining quota. Always return rate limit headers.

4. Using Only Per-IP Limits

Per-IP limits are easy to bypass (VPN, botnets). Combine IP limits with user-based and global limits.

5. Single-Instance Counters

With multiple server instances, in-memory counters are inconsistent. Use Redis or another shared store.

Practice Questions

  1. What is the purpose of rate limiting in an API?
  2. What HTTP status code indicates a rate-limited request?
  3. Why should rate limiting be checked before processing the request?
  4. What is the difference between global, per-IP, and per-user rate limiting?
  5. Why do Distributed Systems need a shared store for rate limit counters?

Answers:

  1. Rate limiting prevents abuse, ensures fair resource allocation, protects against traffic spikes, and maintains service quality.
  2. 429 Too Many Requests is the standard status code for rate-limited requests.
  3. Checking after processing wastes resources. The request should be rejected at the earliest point to preserve system capacity.
  4. Global limits protect the entire system. Per-IP prevents one source from dominating. Per-user differentiates between users.
  5. Without a shared store like Redis, each server instance has its own counter, allowing clients to exceed limits by hitting different instances.

Challenge: Design a rate limiting Strategy for a public API that serves free users (100 req/hour), pro users (1000 req/hour), and enterprise users (10000 req/hour). Include IP, user, and endpoint-level limits.

FAQ

Can rate limiting be applied to Websocket connections?

: Yes. Limit the number of connections per client and the number of messages per connection per second.

What is the difference between rate limiting and throttling?

: Rate limiting rejects excess requests. Throttling slows down processing but may still accept all requests.

Should rate limits apply to all endpoints equally?

: No. Login endpoints should have stricter limits than read-only data endpoints.

How do you set the right rate limit values?

: Start with conservative estimates based on expected traffic, monitor usage, and adjust. Observe actual client behavior and set limits 2-3x above the 99th percentile.

Is rate limiting a security feature?

: Yes. It prevents brute-force attacks, credential stuffing, DDoS, and API abuse. It is a critical security control.

Mini Project

Build a simple Python rate limiter that tracks requests per client in memory, enforces a 10 req/min limit, returns 429 with proper headers when exceeded, and resets the counter every minute.

What's Next

Continue with Why Rate Limit APIs for a deeper exploration of rate limiting benefits, or jump to Token Bucket Algorithm for the most popular rate limiting approach.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro