List option expiries
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.
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.
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).
uuidResponse 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/expiries"{ "data": [ "string" ], "meta": { "asOf": "string", "source": "string", "stale": true }}{ "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 news events GET
The news stream for an instrument, newest first. Filter by published-date range and eventClass, and cap the page with limit. Every row carries isCompanyConfirmed: true means the company itself stood behind the event (an official release or filing), false means third-party-only reporting, so a consumer can weight a confirmed catalyst above a rumour. For the confirmed subset alone, use /events.
Get an option chain GET
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.