Rate Limits & Quotas
Understand AlterLab's rate limits, concurrency caps, and payload restrictions to optimize your integration.
Rate Limits
Rate limits are applied per API key and scale with your account balance:
| Tier | Balance | Requests/Minute |
|---|---|---|
| Starter | $0 - $50 | 30 |
| Growth | $50 - $200 | 100 |
| Scale | $200 - $500 | 300 |
| High Volume | $500+ | 500 |
| Enterprise | Custom | 1000+ |
Soft Limits
Concurrency Limits
Maximum number of requests that can be processed simultaneously. Add funds to instantly unlock higher limits:
| Account Balance | Tier | Concurrent Requests | Requests/Minute |
|---|---|---|---|
| $0 - $50 | Starter | 3 | 30 |
| $50 - $200 | Growth | 10 | 100 |
| $200 - $500 | Scale | 25 | 300 |
| $500+ | High Volume | 50 | 500 |
| Enterprise | Enterprise | 100+ | 1000+ |
Instant Upgrades
Payload Limits
| Limit Type | Value | Notes |
|---|---|---|
| Request Body Size | 1 MB | Maximum size of JSON request |
| Response Size | 50 MB | Maximum scraped content size |
| URL Length | 8,192 chars | Maximum URL length |
| Headers Size | 32 KB | Total custom headers size |
| Extraction Schema | 64 KB | Maximum JSON schema size |
| Extraction Prompt | 4,000 chars | Maximum prompt length |
Timeout Limits
| Operation | Default | Maximum |
|---|---|---|
| Sync Request | 90 seconds | 300 seconds |
| Sync Polling (internal) | 60 seconds | 120 seconds |
| Async Job | 300 seconds | 600 seconds |
| Wait for Selector | 30 seconds | 60 seconds |
| PDF/OCR Processing | 120 seconds | 300 seconds |
Long-Running Jobs
sync: false to get a job ID and poll for results.Batch Limits
| Limit | Value |
|---|---|
| URLs per batch request | 1,000 |
| Concurrent batches | 5 |
| Batch result retention | 24 hours |
Rate Limit Headers
Every response includes headers to help you track your rate limit status:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1704067200
X-Concurrency-Limit: 5
X-Concurrency-Current: 2
Retry-After: 30 # Only on 429 responsesX-RateLimit-LimitMaximum requests per minuteX-RateLimit-RemainingRequests remaining in current windowX-RateLimit-ResetUnix timestamp when limit resetsRetry-AfterSeconds to wait before retrying (429 only)Handling Rate Limits
1. Check Headers
Monitor X-RateLimit-Remaining and slow down before hitting the limit.
2. Implement Exponential Backoff
On 429 errors, wait and retry with increasing delays: 1s, 2s, 4s, 8s...
import time
def scrape_with_retry(url, max_retries=5):
for attempt in range(max_retries):
response = requests.post(...)
if response.status_code == 429:
wait = 2 ** attempt # Exponential backoff
time.sleep(wait)
continue
return response
raise Exception("Max retries exceeded")3. Use Batching
Batch requests are processed more efficiently and don't count against per-minute limits the same way.
4. Queue Requests
Use a job queue (Redis, RabbitMQ) to throttle requests and handle retries gracefully.
Increasing Limits
Add Funds
Your limits automatically increase as your account balance grows. See the tier tables above.
Enterprise Plans
For custom limits, dedicated infrastructure, or SLA guarantees, contact our sales team.
Need Higher Limits?