A public API can receive requests from anyone.

That creates an obvious problem:

What stops one client from sending millions of requests?

Rate limiting.

Basic Idea

Suppose an endpoint allows:

100 requests per minute 

A client that exceeds that limit might receive:

429 Too Many Requests 

Why Rate Limit?

Rate limiting can help protect against:

  • Accidental request floods
  • Resource exhaustion
  • Credential abuse
  • Automated scraping
  • Some denial-of-service scenarios
  • Brute-force attempts It isn't a complete security solution, but it is an important layer.

Example

A simple policy could be:

GET /api/products 100 requests/minute 

while a sensitive endpoint might use:

POST /api/login 10 requests/minute 

Different endpoints often deserve different limits.

Where Should Limits Be Applied?

Possible strategies include limiting by:

IP address User ID API key Session Combination of identifiers 

The appropriate strategy depends on the application.

Distributed Systems

If your application runs on multiple servers, an in-memory counter on each server can produce inconsistent results.

For example:

Server A → 50 requests Server B → 50 requests 

The user may effectively get 100 requests even though the intended limit was 50.

Shared infrastructure such as Redis is commonly used for distributed rate limiting.

Good User Experience

Rate limiting should be predictable.

API responses can communicate when clients should retry using appropriate headers and status codes.

Final Thoughts

Rate limiting isn't only a cybersecurity feature.

It is also a reliability mechanism.

A well-designed API protects itself from both malicious and accidental traffic spikes.