Rate Limits
| Tier | Requests/minute | CVE searches/day | SAGE queries/month |
|---|---|---|---|
| Free | 10 | 50 | 5 |
| Standard | 60 | 500 | 50 |
| Professional | 300 | Unlimited | 500 |
| API | 1,000 | Unlimited | Unlimited |
| Enterprise | Custom | Unlimited | Unlimited |
Handling Rate Limits
When you hit a rate limit you receive HTTP 429 with error code RATE_LIMITED.
import time
import requests
def api_request(url, headers, max_retries=3):
for attempt in range(max_retries):
response = requests.get(url, headers=headers)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 60))
time.sleep(retry_after)
continue
return response
raise Exception("Rate limit exceeded after retries")
Pagination for Large Datasets
Always paginate large requests rather than fetching all at once.
def fetch_all_cves(api_key, severity="CRITICAL"):
headers = {"Authorization": f"Bearer {api_key}"}
base_url = "https://breachspider.com/api/v1/cves"
page = 1
while True:
response = requests.get(
f"{base_url}?severity={severity}&page={page}&limit=100",
headers=headers
)
data = response.json()
yield from data["data"]
if not data["pagination"]["has_next"]:
break
page += 1