Radar is live!

TutorialFebruary 4, 202510 min read

Rate Limiting Strategies for Resilient API Integrations

Master rate limiting with request queuing, exponential backoff, circuit breakers, and the token bucket algorithm. Build integrations that handle 429 errors gracefully and never lose data.

RK
Ryan Kumar
Platform Engineer

Understanding Rate Limits

Rate limits protect APIs from abuse and ensure fair resource allocation. Most data enrichment APIs limit requests per minute, hour, or day. When you exceed these limits, you receive a 429 "Too Many Requests" error.

Poor rate limit handling leads to lost data, failed enrichments, and frustrated users. Great rate limit handling is invisible-your application gracefully manages limits without impacting user experience.

Common Rate Limit Patterns

  • Per minute: 20 requests per minute (Netrows default)
  • Per hour: 1,000 requests per hour
  • Per day: 10,000 requests per day
  • Concurrent: Maximum 5 simultaneous requests

Request Queuing

The simplest rate limiting strategy is queuing requests. Instead of making API calls immediately, add them to a queue and process at a controlled rate.

Benefits of Queuing

  • Never lose requests: All requests are preserved in the queue
  • Smooth traffic: Consistent request rate to API
  • Priority handling: Process high-value requests first
  • Retry logic: Automatically retry failed requests

For a 20 requests/minute limit, process one request every 3 seconds. This ensures you never hit the limit while maximizing throughput.

Exponential Backoff

When you do hit a rate limit, exponential backoff is the gold standard for retry logic. Instead of retrying immediately, wait progressively longer between attempts.

Exponential Backoff Pattern

  • First retry: Wait 1 second
  • Second retry: Wait 2 seconds (2^1)
  • Third retry: Wait 4 seconds (2^2)
  • Fourth retry: Wait 8 seconds (2^3)
  • Fifth retry: Wait 16 seconds (2^4)

Add jitter (random variation) to prevent thundering herd problems when multiple clients retry simultaneously. Instead of waiting exactly 4 seconds, wait 3-5 seconds randomly.

Circuit Breakers

Circuit breakers prevent cascading failures by temporarily stopping requests to failing services. If an API returns too many errors, "open" the circuit and stop sending requests for a cooldown period.

Circuit States

  • Closed (Normal): Requests flow through normally. Track failure rate.
  • Open (Failing): Too many failures detected. Block all requests and return errors immediately.
  • Half-Open (Testing): After cooldown, allow limited requests to test if service recovered.

Set thresholds based on your tolerance: open circuit after 5 consecutive failures or 50% error rate over 1 minute. Close circuit after 3 consecutive successes in half-open state.

Token Bucket Algorithm

The token bucket algorithm is the most sophisticated rate limiting approach. Imagine a bucket that holds tokens, with tokens added at a fixed rate.

How It Works

  1. Bucket capacity: Maximum tokens (e.g., 20 for burst capacity)
  2. Refill rate: Tokens added per second (e.g., 0.33 for 20/minute)
  3. Request cost: Each API call consumes 1 token
  4. Wait if empty: If no tokens available, wait for refill

This algorithm allows bursts (use all 20 tokens quickly) while maintaining average rate (20/minute). It's more flexible than simple queuing and matches how most APIs actually enforce limits.

Handling 429 Errors

When you receive a 429 error, the API is telling you to slow down. Many APIs include a "Retry-After" header indicating when you can try again.

429 Response Handling

  1. Check for "Retry-After" header
  2. If present, wait that duration before retrying
  3. If absent, use exponential backoff
  4. Log the rate limit hit for monitoring
  5. Don't count 429s as failures for circuit breaker

Distributed Rate Limiting

When multiple servers or processes share the same API quota, you need distributed rate limiting. Use Redis or a similar shared store to coordinate across instances.

Distributed Strategies

  • Centralized counter: Single Redis counter tracks total requests
  • Token bucket in Redis: Shared token bucket across all instances
  • Quota allocation: Divide quota among instances (e.g., 5 req/min each)
  • Leader election: One instance manages queue, others submit to it

Testing Rate Limit Handling

Don't wait for production to discover rate limit bugs. Test your handling logic thoroughly.

Testing Checklist

  • ✓ Simulate 429 responses in tests
  • ✓ Verify exponential backoff timing
  • ✓ Test circuit breaker state transitions
  • ✓ Confirm no requests are lost
  • ✓ Measure throughput under rate limits
  • ✓ Test recovery after limit resets

Monitoring and Alerting

Track rate limit metrics to optimize your integration and catch issues early.

Key Metrics

  • 429 error rate: How often you hit limits
  • Queue depth: Pending requests waiting to process
  • Average wait time: How long requests wait in queue
  • Throughput: Actual requests per minute achieved
  • Circuit breaker state: Open/closed status

Set alerts for sustained high queue depth (indicates insufficient quota) and frequent circuit breaker opens (indicates API instability).

Best Practices Summary

  • ✓ Use request queuing to smooth traffic
  • ✓ Implement exponential backoff with jitter
  • ✓ Add circuit breakers for failing services
  • ✓ Respect "Retry-After" headers
  • ✓ Never lose requests-queue everything
  • ✓ Monitor 429 rates and queue depth
  • ✓ Test rate limit handling thoroughly
  • ✓ Use distributed coordination for multi-instance deployments

Conclusion

Rate limiting is inevitable when working with APIs. The difference between amateur and professional integrations is how gracefully they handle limits. With request queuing, exponential backoff, circuit breakers, and proper monitoring, you can build resilient integrations that never lose data.

Start simple with basic queuing, then add sophistication as your volume grows. The patterns in this guide will serve you well from prototype to production scale.

Build Resilient Integrations

Netrows provides clear rate limits and helpful error messages. Start building with flexible pricing.

GET ACCESS