Rate Limits
The Onvera API implements rate limiting to ensure fair usage and system stability.
Rate Limit Headers
All API responses include rate limit headers:
X-RateLimit-Limit- Maximum requests per windowX-RateLimit-Remaining- Remaining requests in current windowX-RateLimit-Reset- Unix timestamp when the rate limit resets
Example:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1705766400Default Limits
Per API Key
- 1000 requests per hour - Default limit per API key
- Burst limit - Up to 100 requests per minute
Per Endpoint
Some endpoints have specific limits:
- Operation polling - Recommended: 1 request per 2-5 seconds
- Deployment creation - 10 deployments per hour
Rate Limit Exceeded
When you exceed the rate limit, the API returns:
Status Code: 429 Too Many Requests
Response:
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Please retry after 60 seconds"
}
}Headers:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1705766400
Retry-After: 60Handling Rate Limits
Exponential Backoff
When you receive a 429 response, implement exponential backoff:
import time
import random
def make_request_with_backoff(url, headers, max_retries=5):
for attempt in range(max_retries):
response = requests.get(url, headers=headers)
if response.status_code != 429:
return response
# Get retry delay from header or calculate
retry_after = int(response.headers.get('Retry-After', 60))
# Add jitter to avoid thundering herd
delay = retry_after + random.uniform(0, 10)
print(f"Rate limited. Retrying after {delay} seconds...")
time.sleep(delay)
raise Exception("Max retries exceeded")Respect Retry-After Header
Always respect the Retry-After header:
# Get retry delay from header
RETRY_AFTER=$(curl -I -H "X-API-Key: $API_KEY" \
https://api.onvera.io/api/v1/deployments \
2>/dev/null | grep -i "retry-after" | cut -d' ' -f2)
# Wait before retrying
sleep $RETRY_AFTERBest Practices
- Monitor rate limit headers - Track remaining requests
- Implement exponential backoff - For 429 responses
- Respect Retry-After header - Wait the specified time
- Don't poll too frequently - Use 2-5 second intervals for operations
- Cache responses - Reduce unnecessary requests
- Batch operations - When possible, batch multiple operations
Polling Guidelines
When polling operations:
- Recommended interval: 2-5 seconds
- Maximum frequency: 1 request per second
- Don't poll indefinitely - Set a timeout (e.g., 30 minutes)
Example:
#!/bin/bash
OPERATION_ID="op_xxx"
API_KEY="onv_sk_live_..."
MAX_ATTEMPTS=360 # 30 minutes at 5 second intervals
for i in $(seq 1 $MAX_ATTEMPTS); do
RESPONSE=$(curl -s -H "X-API-Key: $API_KEY" \
https://api.onvera.io/api/v1/operations/$OPERATION_ID)
STATUS=$(echo $RESPONSE | jq -r '.data.status')
if [ "$STATUS" = "succeeded" ] || [ "$STATUS" = "failed" ]; then
echo "Operation completed: $STATUS"
break
fi
# Wait 5 seconds before next poll
sleep 5
doneIncreasing Limits
If you need higher rate limits, contact your account representative to discuss your use case and requirements.
Related Concepts
- Errors - Error handling
- Operations - Polling patterns