Get price series for many instruments
The supported path for analytical workloads. One call rather than an N+1 fan-out across instruments, capped at 500 ids. Adjustment provenance is returned per instrument, since each has its own independent action-set counter.
The supported path for analytical workloads. One call rather than an N+1 fan-out across instruments, capped at 500 ids. Adjustment provenance is returned per instrument, since each has its own independent action-set counter.
Authorization
ApiKeyAuth prices: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: prices:read
Query Parameters
Comma-separated instrument ids, maximum 500.
1 <= lengthCalendar date, yyyy-mm-dd.
^\d{4}-\d{2}-\d{2}$Calendar date, yyyy-mm-dd.
^\d{4}-\d{2}-\d{2}$"false"Value in
- "true"
- "false"
Point-in-time knowledge cut-off. Returns the answer as it would have been known at this moment, excluding any corporate action that only became knowable afterwards. A date is treated as the end of that day; a full ISO instant is used exactly.
^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{1,3})?Z)?$Include corporate actions whose knowledge date is unknown (provenance = backfilled). Off by default, because such an action cannot honestly be presented as something a reader knew on your asOf date. Setting it true forces meta.provenance.pitValid to false whenever such an action actually contributed.
"false"Value in
- "true"
- "false"
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/prices/bulk?instrumentIds=string&from=string&to=string"{ "data": { "property1": [ { "barDate": "string", "openPrice": 0, "highPrice": 0, "lowPrice": 0, "closePrice": 0, "volume": 0, "quoteCurrency": "string", "quoteUnit": "string", "stale": true, "asOf": "string", "source": "string" } ], "property2": [ { "barDate": "string", "openPrice": 0, "highPrice": 0, "lowPrice": 0, "closePrice": 0, "volume": 0, "quoteCurrency": "string", "quoteUnit": "string", "stale": true, "asOf": "string", "source": "string" } ] }, "meta": { "asOf": "string", "source": "string", "stale": true, "adjusted": true, "provenance": { "observed": -9007199254740991, "vendor_pit": -9007199254740991, "announced": -9007199254740991, "backfilled": -9007199254740991, "pitValid": true }, "actionSetVersions": { "property1": -9007199254740991, "property2": -9007199254740991 }, "priceBases": { "property1": { "priceBasis": "raw", "adjustedThrough": "string", "actionsApplied": -9007199254740991, "actionsAlreadyReflected": -9007199254740991 }, "property2": { "priceBasis": "raw", "adjustedThrough": "string", "actionsApplied": -9007199254740991, "actionsAlreadyReflected": -9007199254740991 } }, "actionCoverages": { "property1": { "checked": true, "lastCheckedAt": "string", "source": "string", "coveredFrom": "string", "actionsFound": -9007199254740991, "coversSeries": true, "gap": "never_checked" }, "property2": { "checked": true, "lastCheckedAt": "string", "source": "string", "coveredFrom": "string", "actionsFound": -9007199254740991, "coversSeries": true, "gap": "never_checked" } }, "actionCoverage": { "checked": true, "coversSeries": true, "actionsFound": -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" ] } }}Resolve many instruments GET
Resolve up to 500 instruments by id in one call, the supported alternative to N+1-ing the single-instrument endpoint. An unknown id is absent from data rather than an invented row; the caller keys the result by id.
Get a correlation matrix GET
A pairwise correlation matrix over the stored daily returns of 2-20 instruments. Closes are read adjusted and converted to LOG returns (a correlation of price levels is spurious), then every pair is aligned on the dates all instruments share before correlating - pearson or spearman. The honesty is in the sample: each instrument reports its own observation count, assumptions.alignedObservations reports the common N behind every coefficient, and an instrument with too few overlapping bars is reported with that low count rather than dropped or padded with zeros. Fewer than two instruments with usable data is refused with invalid_request rather than answered with a fabricated matrix.