Documentation

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.

cURL
Python
JavaScript
TypeScript
C#
Java
# 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

  1. Create an account, then purchase a license from Pricing via Stripe.
  2. 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.
  3. Call an endpoint with the X-API-Key header set.
  4. 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.

GET /api/v1/market/quote?symbol=AAPL
GET /api/v1/fx/quote?pair=EURUSD
GET /api/v1/commodities/quote?symbol=XAUUSD
GET /api/v1/crypto/quote?symbol=BTCUSD

Historical Data scope: historical_data

GET /api/v1/market/ohlc?symbol=AAPL&timeframe=1d&limit=30

Futures scope: futures

GET /api/v1/futures/quote?symbol=ES1
GET /api/v1/futures/curve?root=CL

Options scope: options

GET /api/v1/options/chain?symbol=AAPL&expiration=2026-09-18
GET /api/v1/options/analytics?symbol=AAPL

Fundamentals & Corporate scope: fundamentals

GET /api/v1/fundamentals/overview?symbol=AAPL
GET /api/v1/earnings/calendar?symbol=AAPL
GET /api/v1/corporate/events?symbol=AAPL

Macro, Rates & Economic Calendar scope: macro

GET /api/v1/macro/calendar?country=US
GET /api/v1/fixed-income/yields
GET /api/v1/central-bank/rates?bank=FED

News scope: news

GET /api/v1/news/latest?limit=10

Analytics Engines scope: analytics

GET /api/v1/analytics/volatility?symbol=SPX
GET /api/v1/analytics/correlation?symbols=SPX,DXY,GOLD
GET /api/v1/analytics/seasonality?symbol=SPX&month=September
GET /api/v1/positioning/cot?symbol=ES
GET /api/v1/flows/etf?symbol=SPY

Portfolio scope: portfolio

GET /api/v1/portfolio/positions

Risk Engine scope: risk

GET /api/v1/risk/portfolio

AI Intelligence scope: ai

GET /api/v1/ai/intelligence?symbol=SPX

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.

FieldDescription
timestampWhen the underlying data point was captured
sourceOriginating feed or sandbox identifier
exchangeExchange or venue of record, where applicable
data_typeRaw data, calculated analytic, or AI interpretation
update_frequencyHow often the underlying series refreshes
data_statuse.g. live, delayed, illustrative/sandbox
last_updateTimestamp of the most recent refresh
quality_statusPass/fail against validation, gap and staleness checks

Errors

StatusCodeMeaning
401missing_api_keyNo X-API-Key header supplied.
401invalid_api_keyThe key does not match any active record.
403key_revokedThe key has been revoked from the dashboard.
403insufficient_scopeThe 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
Python
JavaScript
TypeScript
C#
Java
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.