Skip to content

HTTP API ​

Every reference endpoint is served as a GET /v3/... route on http://127.0.0.1:25503. The machine-readable contract is the bundled OpenAPI file; the human-readable contract is each reference page's HTTP tab.

bash
# Stock EOD across a date range
curl 'http://127.0.0.1:25503/v3/stock/history/eod?symbol=AAPL&start_date=2025-03-03&end_date=2025-03-06'

# Option quote snapshot for one contract
curl 'http://127.0.0.1:25503/v3/option/snapshot/quote?symbol=SPY&expiration=2025-03-21&strike=570&right=C'

# Intraday OHLC bars across a range (same route as single-date; supply start_date/end_date instead of date)
curl 'http://127.0.0.1:25503/v3/stock/history/ohlc?symbol=AAPL&start_date=2025-03-03&end_date=2025-03-06&interval=1m'

# Trading calendar
curl 'http://127.0.0.1:25503/v3/calendar/open_today'

Parameters ​

Query parameters use the registry names shown on each reference page — symbol, expiration, strike, right, interval, start_date, end_date, … Date parameters accept both YYYYMMDD and ISO YYYY-MM-DD. Strikes are dollars (570, 17.5); rights accept C / P / call / put.

Response formats ​

Add format= to any route:

formatContent typeShape
csv (default)text/csvRFC 4180 with a header row.
json / json_newapplication/jsonThe envelope below.
json_legacyapplication/jsonOne array per column, keyed by column name.
ndjson / jsonlapplication/x-ndjsonOne JSON object per row, newline-delimited.
htmltext/htmlA browser-viewable <table>, served inline.

The JSON envelope:

json
{
    "response": [ ... ]
}

Option market-data routes group the rows by contract, one block per contract in the order the contracts arrived:

json
{
    "response": [
        {
            "contract": { "symbol": "SPY", "expiration": "2025-03-21", "strike": 570.0, "right": "CALL" },
            "data": [ ... ]
        }
    ]
}

The CSV and NDJSON forms carry the contract columns inline on every row instead.

A failed request is answered with an HTTP status and a plain-text description; see server errors.

Flat files ​

Whole-universe daily archives stream through dedicated routes with chunked bodies (bounded server memory at any download size):

bash
curl 'http://127.0.0.1:25503/v3/option/flat_file/trade_quote?date=20250303&format=csv' -o trade_quotes.csv

See Flat Files for sizing guidance.

Terminal system routes ​

Mirrored 1:1 from the JVM terminal — unauthenticated GET, bare text/plain bodies.

MethodRouteDescription
GET/v3/terminal/shutdownKills the server process; returns the plain text OK.
GET/v3/terminal/fpss/statusStreaming-channel health: CONNECTED / DISCONNECTED.
GET/v3/terminal/mdds/statusMarket-data-channel health: CONNECTED / DISCONNECTED.

Concurrency behavior ​

Bursts queue, they don't fail. The HTTP edge admits up to 256 simultaneous requests; beyond that they queue and are served in order, and a client that disconnects or times out frees its place immediately. Genuine upstream exhaustion surfaces as 503 with Retry-After.

Released under the Apache-2.0 License.