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.