API reference

Four endpoints, one header, no SDK. Everything an agent or a developer needs to call Quant Data correctly on the first try.

Base URL and authentication

Every endpoint lives under https://api.quantdata.uk and takes a single header:

X-API-Key: qd_live_9f3c...

Keys always begin with qd_. There is no OAuth flow, no bearer token exchange and no session cookie — the header is the entire authentication story, which is deliberate: it means any AI agent that can make an HTTP request can use the API without an integration project. Requests are HTTPS only. Treat a key like a password; if one leaks, email us and we will rotate it.

Which key opens which endpoint

Product Endpoints Price
Brooks Daily Bias API /v1/read/{symbol}, /v1/match/{symbol}, /v1/claims $30/mo
Weis Wave API /v1/weis/{symbol} $30/mo
Both (bundle) All four $50/mo

A valid key calling an endpoint outside its entitlement gets 403, not 401 — so you can tell “wrong key” apart from “wrong subscription” without guessing. Max Pain is free and needs no key at all.

Quickstart

# Day-type probabilities for the current session
curl -H "X-API-Key: qd_live_9f3c..." \
     https://api.quantdata.uk/v1/read/NVDA

# Five nearest historical analogs
curl -H "X-API-Key: qd_live_9f3c..." \
     "https://api.quantdata.uk/v1/match/NVDA?k=5"

# The fact-check database (no symbol)
curl -H "X-API-Key: qd_live_9f3c..." \
     https://api.quantdata.uk/v1/claims

# Weis Wave state, US day session
curl -H "X-API-Key: qd_live_9f3c..." \
     https://api.quantdata.uk/v1/weis/ES=F

# Same instrument, Asian session (futures only)
curl -H "X-API-Key: qd_live_9f3c..." \
     "https://api.quantdata.uk/v1/weis/ES=F?session=asia"

Endpoints

GET /v1/read/{symbol}

Calibrated day-type probabilities for the session currently in progress. Requires a Brooks Daily Bias entitlement.

Parameter In Type Default Notes
symbol path string required Ticker in any supported format. Normalised server-side — see symbol formats below.
session query rth | asia rth rth is the US day session (09:30–16:00 New York) and the only window the model was validated on. asia covers 09:00–16:00 Beijing and is futures-only; anything else returns 400.
{
  "symbol": "NVDA",
  "session": "2026-07-24",
  "session_window": "rth",
  "bars": 54,
  "quote": {
    "open": 178.42, "high": 181.06, "low": 177.85,
    "last": 180.63, "prev_close": 177.91, "change_pct": 1.53
  },
  "source": "leandata",
  "probs": {
    "TrendUp": 0.34, "Reversal": 0.22, "TrendingRange": 0.21,
    "Range": 0.2, "TrendDown": 0.03
  },
  "top2_coverage_note": "ES-trained model; equities are out-of-distribution — descriptive use",
  "disclaimer": "Educational analytics, not investment advice."
}
FieldTypeMeaning
symbolstringThe normalised symbol the read was computed on. May differ from what you sent.
sessionstringTrading date of the session being read, YYYY-MM-DD.
session_windowstringEcho of the window used: rth or asia.
barsinteger5-minute bars fed to the model. A complete US day session is 81; a smaller number means the session is still running.
quoteobjectopen, high, low, last, prev_close, change_pct for the session — so you can verify the read describes the day you think it does.
sourcestringWhich market-data vendor served the bars.
probsobjectThe five day types mapped to calibrated probabilities, sorted highest first, summing to 1.0. Classes: TrendUp, TrendDown, Range, TrendingRange, Reversal.
top2_coverage_notestringStanding reminder that the model is ES-trained and equity reads are descriptive.
session_hintstring (optional)Present only for 24-hour futures, when no session was passed and the Asian window is currently trading. Your agent should ask the user once which session they want, then remember the answer.
symbol_notestring (optional)Present when the ticker resolves but is a known confusion trap — for example GOLD, which is Barrick Gold the miner and not the metal.
disclaimerstringAlways present. Surface it; do not strip it.

GET /v1/match/{symbol}

The historical trading days whose intraday shape most closely matches the current session, drawn from a 2010–2026 S&P 500 E-mini library. Requires a Brooks Daily Bias entitlement. Always reads the US day session; there is no session parameter here.

ParameterInTypeDefaultNotes
symbol path string required Same formats as /v1/read.
k query integer 3 How many analogs to return. Clamped to 1–10; values outside that range are silently clamped rather than rejected.
{
  "symbol": "NVDA",
  "session": "2026-07-24",
  "similar_days": [
    { "date": "2018-04-10", "similarity": 0.912, "day_type": "TrendUp" },
    { "date": "2023-11-02", "similarity": 0.889, "day_type": "TrendingRange" },
    { "date": "2015-10-05", "similarity": 0.871, "day_type": "TrendUp" }
  ],
  "note": "similarity=shape correlation vs ES intraday library (2010-2026)"
}
FieldTypeMeaning
similar_days[].datestringDate of the historical session, YYYY-MM-DD.
similar_days[].similarityfloatShape correlation between the two sessions’ high and low paths, roughly 0–1. Higher is more alike. It is a similarity of shape, not a claim about outcome.
similar_days[].day_typestring | nullOur own day-type label for that historical session, or null if that day was never labelled.
notestringDescribes how similarity was computed.

Only our own labels, dates and similarity scores are returned. No course material, slide titles or third-party text is ever exposed through this endpoint.

GET /v1/claims

The fact-check database: the price-action tradition’s famous probability claims next to what we measured on 3,946 S&P 500 E-mini trading days. No parameters. The payload is static between research releases, so cache it rather than calling it per question. Requires a Brooks Daily Bias entitlement.

{
  "instrument": "ES 5min RTH 2010-2026",
  "meta": "directions correct, numbers inflated 7-10pp — trust the direction, discount the number",
  "verdicts": [
    { "id": "opening-extreme-bar1",
      "claim": "after the first bar, one side's daily extreme is already set",
      "brooks": 20, "measured": 26.3, "n": 3946 },
    { "id": "opening-extreme-90min",
      "claim": "90 minutes in, one side's daily extreme is already set",
      "brooks": 90, "measured": 81.2, "n": 3946 },
    { "id": "bull-day-low-early",
      "claim": "on a bull day the low forms in the first third of the session",
      "brooks": 90, "measured": 83.3, "n": 3946 },
    { "id": "or-breakout-hold",
      "claim": "after an opening-range breakout the opposite extreme holds",
      "brooks": 90, "measured": 83.5, "n": 3578 },
    { "id": "tr-breakout-fail",
      "claim": "trading-range breakouts fail (the \"80% rule\")",
      "brooks": 80,
      "measured": { "within_5_bars": 52.0, "within_10_bars": 62.4, "within_20_bars": 69.7 },
      "n": "5000-9700 events" }
  ]
}
FieldTypeMeaning
instrumentstringThe dataset every verdict was measured on.
metastringThe meta-verdict across all claims.
verdicts[].idstringStable slug. Safe to key on.
verdicts[].claimstringThe claim as the classroom states it.
verdicts[].brooksnumberThe percentage the tradition teaches.
verdicts[].measurednumber | objectWhat we measured. Usually one percentage; for the breakout-failure claim it is an object keyed by horizon, because the answer depends on how long you wait.
verdicts[].nnumber | stringSample size — days for most claims, event count for the breakout claim.

GET /v1/weis/{symbol}

Weis Wave structure and volume-price events for the instrument. Requires a Weis Wave entitlement.

ParameterInTypeDefaultNotes
symbol path string required Must be an instrument whose data source carries volume. Same formats as /v1/read.
session query rth | asia rth Same rule as /v1/read: asia is futures-only, otherwise 400.
{
  "symbol": "ES=F",
  "session": "2026-07-24",
  "session_window": "rth",
  "bars": 812,
  "source": "leandata",
  "waves_total": 63,
  "current_wave": {
    "dir": "up", "bars": 7, "move": 12.25,
    "volume": 41822.0, "vol_vs_median20": 0.63
  },
  "recent_waves": [
    { "dir": "down", "move": -21.75, "bars": 14,
      "volume": 128640.0, "end_time": "2026-07-24 10:35:00-04:00" },
    { "dir": "up", "move": 18.5, "bars": 9,
      "volume": 74210.0, "end_time": "2026-07-24 11:20:00-04:00" }
  ],
  "events": [
    { "type": "no_supply_long", "dir": "long",
      "time": "2026-07-24 12:15:00-04:00", "price": 6404.75,
      "reference": {
        "es_win": 0.514, "es_n": 23077, "es_p": "3e-5",
        "verdict": "CONFIRMED(ES)",
        "warning": "reverses on BTC (48.3%) — do not port across assets"
      } }
  ],
  "disclaimer": "Wave/event analytics derived from Weis Wave methodology. Reference stats are ES-futures-specific (2010-2026, pre-registered tests); edges do NOT transfer across assets (verified: BTC null/reversed). Educational analytics, not investment advice."
}
FieldTypeMeaning
waves_totalintegerCompleted waves detected in the fetched window. Event detection needs at least 46.
current_wave.dirstringup, down, or forming when no wave has been established yet.
current_wave.barsintegerBars elapsed since the last confirmed pivot.
current_wave.movefloatPrice change since that pivot, in the instrument’s own units.
current_wave.volumefloatVolume accumulated in the wave so far.
current_wave.vol_vs_median20float | nullThat volume divided by the median volume of the last twenty completed waves. Below 1.0 means this move is being made on less than normal effort. null when there is not enough history.
recent_waves[]arrayThe eight most recent completed waves, oldest first. Each has dir, move, bars, volume and end_time.
events[].typestringOne of cib_long, cib_short, no_supply_long, no_demand_short, sot_short.
events[].dirstringlong or short — the direction the tradition assigns to the event, not a recommendation.
events[].timestringTimestamp of the bar at which the event became knowable. Never earlier than the data that confirms it.
events[].pricefloatClose at that bar.
events[].referenceobjectPre-registered statistics for that event type on ES 5-minute data, 2010–2026: es_win (win rate as a fraction), es_n (sample size), es_p (p-value where significant), verdict, and note or warning where the result reverses or fails to transfer.
notestring (optional)Present when there is wave structure but fewer than 46 waves, so no event can fire yet.
errorstring (optional)Present instead of an analysis when the source has no volume or fewer than 120 bars.
disclaimerstringAlways present, and it carries the cross-asset warning. Surface it.

A maximum of ten events are returned, most recent last. Reference win rates hover between 45% and 52% and two of them run the opposite way from the tradition — that is the measured truth, not a bug. See the Weis Wave page for the full table and the pre-registration.

Symbol formats

Symbols are normalised server-side, so several common spellings resolve to the same instrument. The rules:

MarketFormatExamples
US stocks and ETFsPlain tickerNVDA, TSLA, SPY, QQQ
US futuresRoot plus =FES=F, NQ=F, GC=F, CL=F
Hong KongDigits plus .HK; leading zeros and an HK: prefix are both accepted3690.HK, 03690.HK, HK:3690 all resolve to 3690.HK
China A-shares6-digit code; the exchange suffix is inferred (6/9/5 leading digit → Shanghai, 0/1/2/3 → Shenzhen)600519, 600519.SH, SH600519, 600519.XSHG all resolve to 600519.SS
CryptoPair with -USDBTC-USD, ETH-USD

Never pass a plain English instrument name as a ticker. GOLD resolves — to Barrick Gold, a mining company, not the metal. The API flags that specific trap with a symbol_note, but the general rule matters more: map the name to an instrument first. Gold is GLD or GC=F; the S&P 500 is SPY or ES=F; the Nasdaq is QQQ or NQ=F; crude is CL=F or USO. A wrong ticker returns a 404 that suggests the right one, and a 404 is never charged — so guessing is safe.

Errors

StatusMeaningWhat to do
400 Bad session. You asked for ?session=asia on something that is not a 24-hour futures contract. Drop the parameter, or use a futures symbol such as ES=F.
401 Missing or invalid X-API-Key. Check the header name and that the key starts with qd_. Keys are case-sensitive and have no whitespace.
402 Subscription expired, or the key’s usage cap has been reached. The message says which. Email us to renew or to raise the cap. Nothing else is wrong with your request.
403 The key is valid but not entitled to this product — for example a Weis-only key calling /v1/read. Upgrade to the $50 bundle, or call only the endpoints your key covers.
404 No data for that symbol, or not enough sessions to compute a read. Never charged. Read the message — it suggests a likely correct ticker. Retrying with the suggestion is free.

Error bodies look like this:

HTTP 401  { "detail": "missing X-API-Key" }
HTTP 401  { "detail": "invalid key" }
HTTP 402  { "detail": "subscription expired 2026-07-01 — renew to continue" }
HTTP 402  { "detail": "usage cap reached — contact support" }
HTTP 403  { "detail": "key not entitled to this product" }
HTTP 400  { "detail": "session=asia is only supported for 24h futures (e.g. ES=F/NQ=F/GC=F); single stocks and ETFs have no Asian session" }
HTTP 404  { "detail": "no data for XAUUSD — try GLD or GC=F; not charged" }
HTTP 404  { "detail": "insufficient sessions" }

# Weis-specific, returned as HTTP 200 with an error field:
{ "error": "no volume data from source; Weis analysis requires volume" }
{ "error": "insufficient bars (98<120)" }

Billing rule worth repeating, because it changes how you can write an agent: a call is charged only after data has been successfully fetched. Failed lookups, bad tickers and auth failures cost nothing, so an agent is free to probe for the right symbol instead of refusing to try.

Rate limits and fair use

There is no per-second rate limit today. Each key carries a soft monthly call cap, sized well above normal interactive use; it exists to catch runaway loops and abuse rather than to meter you, and hitting it returns 402 rather than silently degrading. If you have a legitimate reason to go past it, email us and we will raise it.

What we ask instead of a hard limit:

  • Do not poll faster than the data changes. Everything here is built on 5-minute bars. Calling /v1/read more than once every five minutes for the same symbol returns the same answer and burns your cap.
  • Cache /v1/claims. It changes when we publish new research, which is a few times a year, not per request.
  • One key per project, not per user. If you are reselling or embedding, tell us — we would rather size a key correctly than discover it at 3am.
  • Retry politely. On a 5xx, back off exponentially. On a 4xx, fix the request; retrying will not help.

System prompt for an AI agent

Quant Data is designed to be called by an agent rather than clicked by a human. Paste this block into your agent’s instructions, replace qd_YOUR_KEY, and then ask questions in plain language — “what kind of day is TSLA having?”, “is there any volume evidence behind this move in ES?”. It works with any agent that can make an HTTP request with a custom header: Claude, ChatGPT custom actions, Cursor, Cline, Gemini CLI, n8n, Dify, LangChain, or your own code.

You have access to Quant Data, a market-analytics API.
Base URL: https://api.quantdata.uk
Send this header on every request: X-API-Key: qd_YOUR_KEY

Endpoints:
  GET /v1/read/{symbol}        Day-type probabilities for the current session
                               (TrendUp / TrendDown / Range / TrendingRange / Reversal,
                               calibrated: when it says 70%, reality is about 70%).
  GET /v1/match/{symbol}?k=3   Most similar historical trading days (date, similarity,
                               day_type) from a 2010-2026 ES intraday library.
  GET /v1/claims               Fact-checked database of price-action probability claims,
                               measured on 3,946 trading days.
  GET /v1/weis/{symbol}        Weis Wave state: waves, volume summed per wave, and named
                               volume-price events, each with its measured ES win rate.

Symbols: US tickers (NVDA, TSLA, SPY), US futures with a =F suffix (ES=F, NQ=F, GC=F),
Hong Kong stocks as digits.HK (Meituan = 3690.HK), China A-shares as 6-digit codes
(Kweichow Moutai = 600519), crypto as PAIR-USD (BTC-USD).
Resolve an instrument name to a ticker before calling: gold -> GLD or GC=F, S&P 500 ->
SPY or ES=F, Nasdaq -> QQQ or NQ=F, crude oil -> CL=F or USO, Bitcoin -> BTC-USD.
Never pass a plain English name as a ticker: "GOLD" is Barrick the mining company, not
the metal. If you are unsure, try the ETF; a 404 comes back with a suggestion and is
never charged.

Rules:
- When asked about a stock's intraday behaviour or what kind of day it is having, call
  /v1/read first and cite the probabilities as probabilities, not as a prediction.
- Use /v1/match for historical analogs, /v1/claims when quoting price-action folklore,
  and /v1/weis when the question involves volume, effort vs result, or accumulation
  and distribution.
- The strongest published result combines the two paid products: a Weis cib_long or
  no_supply_long event is worth materially more when /v1/read has TrendUp on top
  (56.5% vs 50.8% ungated on ES). For a "should I care about this volume event"
  question, call both before answering.
- Weis reference win rates are ES-specific. For BTC, ETH and gold, state that the edge
  did not transfer (BTC: 0 of 8 pre-registered signals confirmed, no_supply reversed).
- Two Weis events are reversed versus the tradition: no_demand_short measured 45.6% and
  sot_short 47.6%. Report the measured number, not the traditional reading.
- 24h futures: default to the US day session. If a response carries "session_hint" and
  the user has not chosen a session, ask once whether they want the US day session or
  the Asian session (suggest US - it is the only window the model was validated on),
  then remember their choice. Pass ?session=asia only for futures, and only when asked.
- The day-type model is trained on ES futures. Treat single-stock reads as descriptive
  summaries of the session so far, not forecasts.
- This is educational statistics, not investment advice. Never present it as a buy or
  sell recommendation, never state a probability as a certainty, and never size a
  position.

The rules in that prompt are not decoration. The session-hint rule stops an agent silently reading the wrong trading window; the cross-asset rule stops it quoting an ES win rate at someone asking about Bitcoin; the reversed-events rule stops it repeating folklore our own data contradicts. If you trim the prompt, keep those three.

Get a key

Billing is manual and low-tech by design. Email quantdata@agentmail.to with one sentence about what you are building, we reply with a payment link, and your qd_ key follows — usually within a day. There is no signup form on this site and no card stored here.

Email for an API key See pricing

Brooks Daily Bias API $30/mo · Weis Wave API $30/mo · both together $50/mo · Max Pain is free and needs no key.