Get an option chain
Listed contracts for an underlying with their latest observed quote and their Greeks, optionally narrowed by expiry, strike and right. Every Greek declares its greeksSource: provider is an observation, computed is a model output that additionally carries the model name and the spot, rate and dividend yield it was run with, so the number can be reproduced or falsified rather than merely trusted. A contract whose Greeks were neither supplied nor computable is returned WITH its quote and WITHOUT Greeks, naming the missing inputs - never zeros, and never nulls that read as measured. meta.greeksCoverage counts the observed / modelled / absent split across exactly the rows returned.
Listed contracts for an underlying with their latest observed quote and their Greeks, optionally narrowed by expiry, strike and right. Every Greek declares its greeksSource: provider is an observation, computed is a model output that additionally carries the model name and the spot, rate and dividend yield it was run with, so the number can be reproduced or falsified rather than merely trusted. A contract whose Greeks were neither supplied nor computable is returned WITH its quote and WITHOUT Greeks, naming the missing inputs - never zeros, and never nulls that read as measured. meta.greeksCoverage counts the observed / modelled / absent split across exactly the rows returned.
Authorization
ApiKeyAuth options:readPresent your API key as a bearer token: Authorization: Bearer pk_live_....
Two environments are issued per account. A pk_test_ sandbox key returns the SAME real historical data as a live key and does NOT consume your LIVE allowance, so learning the API is free. It has its own separate windows and can be rate limited on them. A pk_live_ key reads against your allowance.
Keys carry explicit scopes (instruments:read, prices:read, actions:read, fx:read, earnings:read, options:read, news:read, sentiment:read, events:read, analytics:read, correlations:read, technicals:read, macro:read) and are enforced fail-closed, so a leaked key is bounded to what it was issued for. Revocation is immediate.
In: header
Scope: options:read
Path Parameters
Instrument identifier (UUID).
uuidQuery Parameters
Only contracts expiring on this date. Omit for every listed expiry.
^\d{4}-\d{2}-\d{2}$Only contracts at this exact strike. A non-numeric value is rejected with 400 rather than quietly matching nothing.
0 < valueOnly calls, or only puts. Omit for both.
Value in
- "call"
- "put"
Knowledge cut-off. Returns the chain as it stood at this instant: for each contract, the most recent quote and Greeks ALREADY OBSERVED by then. Omit for the current chain. Use this to replay a past decision against the inputs it actually had — pricing a past structure with current quotes reports a result that was never obtainable.
date-timeResponse Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/instruments/497f6eca-6276-4993-bfeb-53cbbbba6f08/options"{ "data": [ { "contract": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "instrumentId": "48367a03-b541-4ea7-88a6-ae604df75c64", "contractSymbol": "string", "expiry": "string", "strike": 0, "right": "call", "multiplier": -9007199254740991, "isActive": true }, "quote": { "bid": 0, "ask": 0, "lastPrice": 0, "volume": 0, "openInterest": 0, "asOf": "string", "source": "string" }, "greeks": { "delta": 0, "gamma": 0, "theta": 0, "vega": 0, "rho": 0, "impliedVolatility": 0, "asOf": "string", "greeksSource": "provider", "model": { "name": "string", "spotPrice": 0, "riskFreeRate": 0, "dividendYield": 0 } }, "greeksUnavailable": { "reason": "not_supplied_and_not_computable", "missingInputs": [ "spotPrice" ], "detail": "string" } } ], "meta": { "asOf": "string", "source": "string", "stale": true, "greeksCoverage": { "provider": -9007199254740991, "computed": -9007199254740991, "unavailable": -9007199254740991 } }}{ "error": { "code": "invalid_request", "message": "string", "docsUrl": "http://example.com", "details": { "property1": [ "string" ], "property2": [ "string" ] } }}{ "error": { "code": "invalid_request", "message": "string", "docsUrl": "http://example.com", "details": { "property1": [ "string" ], "property2": [ "string" ] } }}{ "error": { "code": "invalid_request", "message": "string", "docsUrl": "http://example.com", "details": { "property1": [ "string" ], "property2": [ "string" ] } }}{ "error": { "code": "invalid_request", "message": "string", "docsUrl": "http://example.com", "details": { "property1": [ "string" ], "property2": [ "string" ] } }}{ "error": { "code": "invalid_request", "message": "string", "docsUrl": "http://example.com", "details": { "property1": [ "string" ], "property2": [ "string" ] } }}{ "error": { "code": "invalid_request", "message": "string", "docsUrl": "http://example.com", "details": { "property1": [ "string" ], "property2": [ "string" ] } }}List option expiries GET
Every expiry that has at least one listed contract for this underlying, ascending. Call this before the chain endpoint to drive an expiry picker without pulling every contract first. An underlying with no chain is refused with options_unavailable naming which case applies: not_optionable means the asset class has no listed options served here and never will, while not_ingested means the instrument can have options but we have not ingested a chain for it yet. That distinction is the point - an empty array would assert "no options exist", which is false in the second case.
Get a price series GET
Daily bars for a date range. Set adjusted=true to apply the corporate-action set server-side. The response carries actionSetVersion: re-request the same version and the numbers are identical, permanently. Supply asOf to adjust using only the actions known on that date, which is what makes a backtest reproducible rather than silently re-stated.