Rate Limits
Limits are enforced per API key. Burst allows short spikes above the sustained rate.
Limits by plan
| Plan | Monthly requests | Requests / sec (sustained) | Burst |
|---|---|---|---|
| Free | 1,000 | No API access | — |
| Starter | 10,000 | 5 | 10 |
| Growth | 100,000 | 20 | 40 |
| Scale | 1,000,000 | 100 | 200 |
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")