API reference

Every endpoint, and what it costs you.

REST over HTTPS, JSON responses, one bearer token. The endpoint list below is generated from the API's own specification, and the limits are read from the table the rate limiter enforces — neither is retyped by hand.

Quickstart

curl
curl -H "Authorization: Bearer volar_sk_live_..." \
  https://api.volardata.com/v1/chains/BTC
python
import volar

client = volar.Client(api_key="volar_sk_live_...")

# the current chain, every active instrument
chain = client.get_chain("BTC")

# a daily Parquet partition, straight from storage
path = client.download_file("BTC", "2026-07-14")

Base URL https://api.volardata.com. Keys are created in your dashboard; Sandbox is free and needs no card. An interactive console lives at https://api.volardata.com/docs.

Authentication

Bearer token

Send your key as Authorization: Bearer <key> on every request. Keys look like volar_sk_live_…. We store only a hash, so a lost key is replaced rather than recovered.

One key per environment

Pro includes three. Revoking one takes only that environment down, which is the whole reason to separate them before you need to.

Limits by plan

Read from the same table the API enforces, so this page cannot advertise a ceiling that is not applied. Exceeding the request rate returns 429 with a Retry-After header.

PlanRequests / minConcurrent HistoryFiles / day Bulk windowCurrencies
Sandbox 10 1 14d BTC
Pro monthly 1,000 10 90d 2 7d AVAX BTC ETH HYPE SOL TRX XRP
Pro annual 1,000 10 full archive 50 31d AVAX BTC ETH HYPE SOL TRX XRP
Enterprise 5,000 50 full archive 10,000 365d AVAX BTC ETH HYPE SOL TRX XRP

Full plan comparison on pricing.

Endpoints

31 endpoints, generated from the running API's specification (v1.0.0). If it is listed here it exists; if it exists it is listed here.

analytics
GET /v1/analytics/{underlying}/butterfly Get Butterfly
GET /v1/analytics/{underlying}/iv-rv-spread Get Iv Rv Spread
GET /v1/analytics/{underlying}/max-pain Get Max Pain History
GET /v1/analytics/{underlying}/open-interest Get Open Interest
GET /v1/analytics/{underlying}/put-call-ratio Get Put Call Ratio History
GET /v1/analytics/{underlying}/realized-vol Get Realized Vol
GET /v1/analytics/{underlying}/skew Get Skew
GET /v1/analytics/{underlying}/term-structure Get Term Structure
GET /v1/surfaces/{underlying} Get Latest Surface
GET /v1/surfaces/{underlying}/history Get Surface History
chains
GET /v1/chains/{underlying} Get Latest Chain
GET /v1/chains/{underlying}/instrument/{symbol} Get Instrument History
GET /v1/chains/{underlying}/snapshots Get Chain Snapshots
dvol
GET /v1/dvol/{underlying}/history Get Dvol History
files
GET /v1/files/{underlying}/blocks/bulk Get Bulk Block Files
GET /v1/files/{underlying}/blocks/{month} Get Block File
GET /v1/files/{underlying}/bulk Get Bulk Files
GET /v1/files/{underlying}/liquidations/bulk Get Bulk Liquidation Files
GET /v1/files/{underlying}/liquidations/{month} Get Liquidation File
GET /v1/files/{underlying}/trades/bulk Get Bulk Trade Files
GET /v1/files/{underlying}/trades/{month} Get Trade File
GET /v1/files/{underlying}/{date} Get File
funding
GET /v1/funding/{underlying}/history Get Funding History
futures
GET /v1/futures/{underlying} Get Latest Futures
GET /v1/futures/{underlying}/history Get Futures History
instruments
GET /v1/instruments/{underlying} Get Instruments
GET /v1/instruments/{underlying}/expirations Get Expirations
ohlc
GET /v1/ohlc/{underlying} Get Ohlc History
other
GET / Health Check
settlement
GET /v1/settlement/{underlying}/history Get Settlement History
status
GET /v1/status Get Status

Max pain

GET /v1/analytics/{underlying}/max-pain reports, per expiry, the strike minimising total intrinsic value across outstanding open interest:

formula
pain(K) = Σ calls with strike < K of (K − strike) × OI
        + Σ puts  with strike > K of (strike − K) × OI

K ranges over the strikes actually listed for that expiry, never a synthetic grid. Ties resolve to the lower strike — arbitrary but fixed, so the number is reproducible rather than dependent on iteration order. There is more than one max-pain definition in circulation; this is the one that produces our number, so a figure compared against another vendor's can be checked against the formula that made it.

An expiry whose total open interest is zero returns null for that expiry rather than a fabricated strike — a degenerate book with no position to speak of, not an outage.

This endpoint is newly added — it may not yet appear in the generated list above until the evidence job next runs. The interactive console at https://api.volardata.com/docs already has it.

Errors

StatusMeaning
400Malformed parameter — the body names the one at fault.
401Missing or unrecognised key.
403Your plan does not reach this data. Includes asking for history older than your window, or a currency outside your plan.
404No such instrument, date or file.
429Over your request rate. Retry after the seconds given in Retry-After.
5xxOurs. It will appear on the operations record if it interrupted capture.
Before you write any of this. The schema lists every column with its measured null and zero rates, the sample is a real production file you can load without an account, and the coverage report shows every gap in what you would be buying.