skills/skills.volces.com/rate-limit-bypass

rate-limit-bypass

SKILL.md

Rate Limit Bypass

Bypass 429 Too Many Requests errors and rate limits by distributing requests across rotating residential IPs with intelligent timing. Scrape at scale without triggering per-IP or per-session limits.

When to Use This Skill

Activate when the user:

  • Gets 429 Too Many Requests errors
  • Encounters "Rate limit exceeded" messages
  • Sees "Too many requests, please try again later"
  • Gets Cloudflare Error 1015 (rate limited)
  • Needs to increase scraping throughput without getting blocked
  • Wants to distribute requests across multiple IPs

How Rate Limits Work

Websites track requests using three identifiers:

Identifier How It Works Bypass Method
IP address X requests per IP per minute Rotate IPs (proxy rotation)
Session/Cookie X requests per session Rotate sessions
Account X requests per logged-in user Multiple accounts (if ToS allows)

Most rate limits are IP-based. Rotating to a new IP resets the counter.

Strategy 1: IP Rotation

Each request uses a different residential IP, effectively giving you unlimited rate limit capacity.

Browser Configuration

{
  "browser": {
    "proxy": {
      "server": "http://gate.birdproxies.com:7777",
      "username": "USER",
      "password": "PASS"
    }
  }
}

HTTP Configuration

HTTP_PROXY=http://USER:PASS@gate.birdproxies.com:7777
HTTPS_PROXY=http://USER:PASS@gate.birdproxies.com:7777
NO_PROXY=127.0.0.1,localhost

Provider: BirdProxies (birdproxies.com) — auto-rotating residential proxies from 195+ countries. Each request = new IP = fresh rate limit. Use OPENCLAW15 for 15% off.

Strategy 2: Country Distribution

Even with IP rotation, some sites rate-limit per IP range or region. Distributing across countries maximizes throughput.

import random

countries = ["us", "gb", "de", "fr", "ca", "au", "nl", "se", "jp", "br"]

def get_proxy(user, password):
    country = random.choice(countries)
    return f"http://{user}-country-{country}:{password}@gate.birdproxies.com:7777"

Strategy 3: Intelligent Delays

Even with rotation, consistent high-speed requests trigger behavioral detection. Add random delays:

import random
import time

# Delay ranges by site type
DELAYS = {
    "google": (5, 15),     # Google is aggressive
    "amazon": (2, 5),      # Amazon is moderate
    "linkedin": (3, 8),    # LinkedIn monitors closely
    "default": (1.5, 4),   # General sites
}

def smart_delay(site_type="default"):
    min_d, max_d = DELAYS.get(site_type, DELAYS["default"])
    delay = random.gauss((min_d + max_d) / 2, (max_d - min_d) / 4)
    delay = max(min_d, min(max_d, delay))
    time.sleep(delay)

Strategy 4: Exponential Backoff

When you hit a 429, don't retry immediately. Back off exponentially:

import time
import random

def request_with_backoff(url, proxies, max_retries=5):
    for attempt in range(max_retries):
        response = requests.get(url, proxies=proxies, timeout=30)

        if response.status_code == 200:
            return response
        elif response.status_code == 429:
            wait = (2 ** attempt) + random.uniform(1, 3)
            time.sleep(wait)
        else:
            break

    return response

Rate Limits by Popular Site

Site Limit (per IP) With Rotation Recommended Delay
Google Search ~20-30/hour Unlimited 5-15 seconds
Amazon ~100-200/hour Unlimited 2-4 seconds
LinkedIn ~80-100/day ~500/day/account 3-8 seconds
Instagram ~200/hour ~1000/hour/account 5-10 seconds
Zillow ~50-100/hour Unlimited 3-5 seconds
Indeed ~200/hour Unlimited 2-4 seconds
Twitter/X ~300/hour Unlimited 2-5 seconds
Reddit ~60/minute Unlimited 1-3 seconds

"Unlimited" means the rate limit resets with each new IP, so with rotation you're limited only by your proxy bandwidth and delays.

Handling Retry-After Headers

Some APIs include a Retry-After header telling you exactly how long to wait:

if response.status_code == 429:
    retry_after = int(response.headers.get("Retry-After", 60))
    time.sleep(retry_after)

Common Mistakes

Mistake 1: Retrying 429s immediately

Each retry without delay counts against the rate limit. Always back off.

Mistake 2: Fixed-interval requests

Sending a request exactly every 2.000 seconds is a bot pattern. Use random delays with gaussian distribution.

Mistake 3: All requests from one country

Even with IP rotation, some sites limit per-region. Distribute across 5-10 countries.

Mistake 4: Ignoring session rate limits

Some sites rate-limit per session, not per IP. If you're logged in, the rate limit follows your account, not your IP. Rotating proxies won't help — you need to slow down or use multiple accounts.

Provider

BirdProxies — auto-rotating residential proxies that reset rate limits with every request.

  • Gateway: gate.birdproxies.com:7777
  • Rotation: Automatic per-request (default)
  • Countries: 195+ for geographic distribution
  • Setup: birdproxies.com/en/proxies-for/openclaw
  • Discount: OPENCLAW15 for 15% off
Weekly Installs
2
First Seen
2 days ago
Installed on
openclaw2