Rate Limits
Limits by tier
| Tier | Requests / month | Requests / minute | Verification credits |
|---|---|---|---|
| Free | 2,000 | 10 | 10 |
| Pro | 50,000 | 100 | 500 |
| Growth | 500,000 | 500 | 5,000 |
| Enterprise | Custom | Custom | Custom |
See Pricing for plan costs and credit top-ups.
Response headers
Every API response includes rate limit headers:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Your per-minute request limit |
| X-RateLimit-Remaining | Requests remaining in the current minute window |
| X-RateLimit-Reset | Unix timestamp when the current window resets |
| Retry-After | Seconds to wait before retrying (only on 429 responses) |
When you hit the limit
You'll receive a 429 (Too Many Requests) response:
{
"error": "rate_limit_exceeded",
"message": "You have exceeded your request limit. Retry after 47 seconds.",
"code": 429,
"retry_after": 47
}
Retry guidance
Use exponential backoff when you receive a 429:
import time
import requests
def verify_with_backoff(payload, api_key, max_retries=5):
delay = 1
for attempt in range(max_retries):
resp = requests.post(
"https://api.policynumbers.com/v1/verify",
headers={"Authorization": f"Bearer {api_key}"},
json=payload,
)
if resp.status_code != 429:
return resp
retry_after = int(resp.headers.get("Retry-After", delay))
time.sleep(retry_after)
delay = min(delay * 2, 60)
raise Exception("Rate limit retries exhausted")
Start with the Retry-After value from the header. If absent, start at 1 second and double each attempt, capping at 60 seconds.
Monthly reset
Monthly request counts reset on the first day of each calendar month (UTC midnight). Unused requests do not roll over.