List news events
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.
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.
Authorization
ApiKeyAuth news: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: news:read
Path Parameters
Instrument identifier (UUID).
uuidQuery Parameters
Earliest published date, inclusive. Omit for no lower bound.
^\d{4}-\d{2}-\d{2}$Latest published date, inclusive. Omit for no upper bound.
^\d{4}-\d{2}-\d{2}$Only events of this catalyst class, e.g. earnings. Omit for every class.
1 <= lengthMaximum rows to return, newest first. Defaults to 100, capped at 500 so a single call cannot become an unbounded scan.
0 < value <= 500100Response 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/news"{ "data": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "instrumentId": "48367a03-b541-4ea7-88a6-ae604df75c64", "eventClass": "string", "headline": "string", "source": "string", "url": "string", "publishedAt": "string", "isCompanyConfirmed": true, "createdAt": "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" ] } }}Get an intraday bar series GET
Sub-daily bars at 1min, 5min, 15min, 30min or 1hour resolution. These bars are RAW and are NOT corporate-action adjusted - there is no adjusted parameter, because adjustment is a daily-series concern and applying a split ratio to sub-daily bars inside a live session produces numbers no exchange ever printed. Use the daily price endpoint with adjusted=true for an adjusted series. Served for equity, etf, index and crypto instruments; every other asset class is refused with 400 rather than answered from a chain that cannot serve sub-daily data. A provider that cannot serve the requested resolution is skipped by failover, never substituted with a coarser series, so the returned interval always equals the requested one.
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.