Errors & rate limits
| Status |
Meaning |
401 |
Missing or invalid API key. |
403 |
Key revoked, or user account suspended. |
422 |
Request body validation failed (check field types). |
429 |
Rate limit exceeded (default 100/min). Honor the Retry-After header. |
500 |
Server error — log + retry. Should not happen in normal usage. |
503 |
ML inference is down. Endpoint still returns a rules-only response with HTTP 200 in this case. |
Rate limits
- Default: 100 requests / minute per key
- Use case: Pre-trade check is 1 call per intended trade — you shouldn't approach the limit
- On 429: use exponential backoff (start 1s, double up to 30s, give up)
- Need more? Contact founder for a per-key limit increase
import time, requests
def call_with_backoff(fn, max_attempts=5):
delay = 1.0
for attempt in range(max_attempts):
try:
return fn()
except requests.HTTPError as e:
if e.response.status_code != 429:
raise
retry_after = float(e.response.headers.get("Retry-After", delay))
time.sleep(retry_after)
delay = min(delay * 2, 30.0)
raise RuntimeError("rate limit not cleared after retries")