API Reference
Introduction
The Quantis API is a unified REST and WebSocket interface over market data, derivatives, macro, fundamentals, news and quantitative analytics. All endpoints return JSON. Every response separates data from meta so raw data, calculated analytics and AI interpretation are never ambiguous. See Platform Coverage for the complete list of what each product pillar includes.
Authentication
Authenticate every request with your API key in the X-API-Key header. Generate and manage keys from your dashboard. Keys are scoped — a request fails with insufficient_scope if the key lacks the required permission for that endpoint.
# Replace with your key from the dashboard
curl -H "X-API-Key: qtx_live_xxxxxxxx" \
"https://your-domain/api/v1/market/quote?symbol=AAPL"import requests
headers = {"X-API-Key": "qtx_live_xxxxxxxx"}
r = requests.get("https://your-domain/api/v1/market/quote",
params={"symbol": "AAPL"}, headers=headers)
print(r.json())const res = await fetch(
"https://your-domain/api/v1/market/quote?symbol=AAPL",
{ headers: { "X-API-Key": "qtx_live_xxxxxxxx" } }
);
const data = await res.json();
console.log(data);interface QuoteResponse {
data: { symbol: string; last: number; bid: number; ask: number };
meta: { type: string; source: string; note: string };
}
const res = await fetch(
"https://your-domain/api/v1/market/quote?symbol=AAPL",
{ headers: { "X-API-Key": "qtx_live_xxxxxxxx" } }
);
const quote: QuoteResponse = await res.json();
console.log(quote.data.last);using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "qtx_live_xxxxxxxx");
var response = await client.GetStringAsync(
"https://your-domain/api/v1/market/quote?symbol=AAPL");
Console.WriteLine(response);HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://your-domain/api/v1/market/quote?symbol=AAPL"))
.header("X-API-Key", "qtx_live_xxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Quick Start
- Create an account, then purchase a license from Pricing via Stripe.
- Your API key is issued automatically once payment is confirmed — shown once on the checkout success page, or generate an additional one from API Keys.
- Call an endpoint with the
X-API-Keyheader set. - Monitor usage from the Usage & Logs page.
REST & WebSocket API
REST API. Every endpoint below is a standard HTTPS GET returning JSON, and supports pagination, filtering and aggregation parameters where the dataset calls for it (e.g. limit, timeframe, country). Bulk historical requests can be exported as CSV or Parquet for quantitative research workflows.
WebSocket API. Streaming quotes, order-book updates and alert events are delivered over a persistent WebSocket connection, authenticated with the same API key passed as a connection parameter. Concurrent stream limits are set per license tier — see your dashboard.
Market Data scope: market_data
All sample endpoints return illustrative, non-live JSON so you can validate integration shape ahead of production data access. Availability is gated by your license tier's scopes — see pricing.
Historical Data scope: historical_data
Futures scope: futures
Options scope: options
Fundamentals & Corporate scope: fundamentals
Macro, Rates & Economic Calendar scope: macro
News scope: news
Analytics Engines scope: analytics
Portfolio scope: portfolio
Risk Engine scope: risk
AI Intelligence scope: ai
Data Quality
Every response includes a meta block describing its provenance, so raw data, calculated analytics and AI interpretation are never ambiguous. Production datasets expose the full set of quality fields below.
| Field | Description |
|---|---|
| timestamp | When the underlying data point was captured |
| source | Originating feed or sandbox identifier |
| exchange | Exchange or venue of record, where applicable |
| data_type | Raw data, calculated analytic, or AI interpretation |
| update_frequency | How often the underlying series refreshes |
| data_status | e.g. live, delayed, illustrative/sandbox |
| last_update | Timestamp of the most recent refresh |
| quality_status | Pass/fail against validation, gap and staleness checks |
Errors
| Status | Code | Meaning |
|---|---|---|
| 401 | missing_api_key | No X-API-Key header supplied. |
| 401 | invalid_api_key | The key does not match any active record. |
| 403 | key_revoked | The key has been revoked from the dashboard. |
| 403 | insufficient_scope | The key's license tier does not include this endpoint's scope. |
Rate Limits
Rate limits (requests/minute, requests/day, concurrent WebSocket streams) are configured per license tier and displayed on your dashboard.
Examples
A second worked example — fetching an options chain and reading the first contract's implied volatility.
curl -H "X-API-Key: qtx_live_xxxxxxxx" \
"https://your-domain/api/v1/options/chain?symbol=AAPL"r = requests.get("https://your-domain/api/v1/options/chain",
params={"symbol": "AAPL"}, headers=headers)
first = r.json()["data"]["chain"][0]
print(first["implied_volatility"])const res = await fetch(
"https://your-domain/api/v1/options/chain?symbol=AAPL",
{ headers: { "X-API-Key": "qtx_live_xxxxxxxx" } }
);
const { data } = await res.json();
console.log(data.chain[0].implied_volatility);const { data } = await (await fetch(
"https://your-domain/api/v1/options/chain?symbol=AAPL",
{ headers: { "X-API-Key": "qtx_live_xxxxxxxx" } }
)).json() as { data: { chain: { implied_volatility: number }[] } };
console.log(data.chain[0].implied_volatility);var json = await client.GetStringAsync(
"https://your-domain/api/v1/options/chain?symbol=AAPL");
using var doc = JsonDocument.Parse(json);
var iv = doc.RootElement.GetProperty("data").GetProperty("chain")[0]
.GetProperty("implied_volatility").GetDouble();
Console.WriteLine(iv);HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://your-domain/api/v1/options/chain?symbol=AAPL"))
.header("X-API-Key", "qtx_live_xxxxxxxx")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());SDKs
Official SDK packages for Python, JavaScript/TypeScript, C# and Java follow the same authentication and response contract shown above and wrap each endpoint family as typed methods.