Errors and Rate Limits
Response Envelope
Success responses:
{
"success": true,
"data": {}
}
Error responses:
{
"success": false,
"error": {
"code": "no_data_found",
"message": "No data found"
}
}
Rate Limits
The public API is currently limited per API key:
| Limit | Scope |
|---|---|
30 per minute |
Burst limit |
10 per day |
Daily quota |
100 per month |
Monthly quota |
When no valid API key is present, rate-limit accounting falls back to the request IP address.
Common Error Codes
| HTTP Status | Code | Meaning |
|---|---|---|
400 |
invalid_basis |
basis was not one of open_interest, volume, or total_premium. |
400 |
invalid_expiration |
An expiration filter was supplied but does not match available expirations. |
400 |
invalid_request |
Request parameters were syntactically valid but rejected by the analytics engine. |
400 |
no_tickers_provided |
Portfolio optimizer received no tickers parameters. |
401 |
missing_api_key |
No API key was supplied. |
401 |
invalid_api_key |
The supplied API key was not active. |
404 |
no_data_found |
No upstream market data was available for the requested symbol or universe. |
404 |
missing_symbol_data |
One or more requested symbols were absent from the data response. |
404 |
no_overlapping_data |
Requested assets did not have overlapping price history. |
404 |
no_valid_tickers |
Portfolio optimizer found no usable tickers. |
502 |
upstream_data_error |
Market data could not be fetched. |
500 |
server_misconfigured |
API key validation is unavailable because server configuration is incomplete. |
Client Handling Pattern
Clients should check both the HTTP status and the JSON envelope.
payload = response.json()
if not response.ok or not payload.get("success"):
error = payload.get("error", {})
raise RuntimeError(f"{error.get('code')}: {error.get('message')}")
Additive Fields
Analytics responses are designed for integration and visualization. New fields may be added to objects over time. Clients should ignore unknown fields and rely only on documented fields they need.