List earnings across the market
The earnings calendar for every instrument that reports in a date window, earliest first. The market-wide counterpart to the per-instrument read, for callers building a calendar or scanning for upcoming catalysts rather than asking about one name. from and to are both REQUIRED and the span is capped at 365 days: an unbounded universe-wide scan is refused rather than served slowly. instrumentId narrows the same operation to one name. Every row carries the resolved symbol and display name, so a caller reading the whole market never has to fan out one instrument lookup per row. Each row otherwise carries only what the calendar table holds - report date, session and fiscal period. There is deliberately no EPS estimate, actual, consensus or confirmation flag: the ingest does not carry them, and returning nulls in their place would let a caller mistake absence for a measured zero.
The earnings calendar for every instrument that reports in a date window, earliest first. The market-wide counterpart to the per-instrument read, for callers building a calendar or scanning for upcoming catalysts rather than asking about one name. from and to are both REQUIRED and the span is capped at 365 days: an unbounded universe-wide scan is refused rather than served slowly. instrumentId narrows the same operation to one name. Every row carries the resolved symbol and display name, so a caller reading the whole market never has to fan out one instrument lookup per row. Each row otherwise carries only what the calendar table holds - report date, session and fiscal period. There is deliberately no EPS estimate, actual, consensus or confirmation flag: the ingest does not carry them, and returning nulls in their place would let a caller mistake absence for a measured zero.
Authorization
ApiKeyAuth earnings: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: earnings:read
Query Parameters
Earliest report date, inclusive. Required.
^\d{4}-\d{2}-\d{2}$Latest report date, inclusive. Required.
^\d{4}-\d{2}-\d{2}$Narrow the scan to one instrument. Omit for every instrument that reports in the window.
uuidMaximum events to return, soonest first. Defaults to 250, capped at 1000 so a market-wide scan cannot return an unbounded body.
0 < value <= 1000250Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/earnings?from=string&to=string"{ "data": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "instrumentId": "48367a03-b541-4ea7-88a6-ae604df75c64", "symbol": "string", "displayName": "string", "reportDate": "string", "reportTime": "string", "fiscalPeriod": "string", "epsActual": 0, "epsEstimate": 0 } ], "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 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.
Get an economic event GET
One economic event by id, with its provider-formatted numbers. Returns 404 for an unknown id - never an invented event. actual/forecast/previous are returned exactly as the provider formatted them.