Rate Limits

Limits are enforced per API key. Burst allows short spikes above the sustained rate.

Limits by plan

PlanMonthly requestsRequests / sec (sustained)Burst
Free1,000No API access
Starter10,000510
Growth100,0002040
Scale1,000,000100200

Burst is 2× sustained rate. The token bucket refills continuously so short spikes above the sustained rate are absorbed without triggering 429s.

Monthly quota

Monthly quota resets on the first of each calendar month (UTC). Batch requests count as N against your quota, where N is the number of addresses in the batch.

Exceeding your quota returns 402 quota_exceeded. Use GET /v1/usage to monitor remaining quota programmatically.

429 error response

HTTP/1.1 429 Too Many Requests

{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded. Limit: 5 req/s (burst: 10).",
    "request_id": "req_abc123"
  }
}

Handling 429s — exponential backoff

Wait before retrying. Double the wait on each failure. Cap at 30 seconds.

import time
import requests

def screen_with_retry(address: str, chain: str, max_retries: int = 5) -> dict:
    delay = 1.0
    for attempt in range(max_retries):
        response = requests.post(
            "https://anchorapi.dev/api/v1/screen",
            headers={"Authorization": f"Bearer {SCREENING_API_KEY}"},
            json={"address": address, "chain": chain},
            timeout=10,
        )
        if response.status_code == 429:
            time.sleep(delay)
            delay = min(delay * 2, 30)  # cap at 30s
            continue
        response.raise_for_status()
        return response.json()
    raise RuntimeError(f"Rate limited after {max_retries} retries")