Free Earnings Calendar API
When US companies report results, from the filings themselves. A reported row is an 8-K with Item 2.02 (Results of Operations and Financial Condition) on EDGAR, exact to the day, for every filer since January 2023. An estimatedrow is last year's reported date plus 52 weeks (the same weekday), shown with the date it stands on, so the reader can judge it. No consensus numbers, no EPS: dates only, from the primary source.
Endpoints
/api/markets/earnings?from=2026-10-01&to=2026-10-31&status=estimated&ticker=NVDA&limit=500The calendar for a window, by date then ticker. Default: today to fourteen days ahead, reported and estimated rows. from and to open any window up to 120 days (a past window returns reported rows only); status keeps one kind; ticker one company; limit up to 2,000.
/api/markets/earnings/{ticker}One company: every reported date since 2023, newest first, each with its filing's accession number, and the next estimate with its basis. 404 when the company has no Item 2.02 filing on record.
/api/markets/earnings/csvsame parametersThe calendar window as CSV.
Example
import requests
r = requests.get("https://xoomar.com/api/markets/earnings", params={"status": "estimated", "to": "2026-10-31"})
for row in r.json()["data"]:
print(row["date"], row["ticker"], row["status"], "last year:", row["basis"])
nvda = requests.get("https://xoomar.com/api/markets/earnings/NVDA").json()["data"]
print(nvda["next"], [h["date"] for h in nvda["history"][:4]])Response Shape
Every endpoint returns the same JSON envelope: { data, updatedAt, source, docs }. The data field is an array of records with these fields:
| Field | Type | Description |
|---|---|---|
| date | string (date) | The reported date (filing date of the 8-K) or the estimated date |
| ticker | string | Ticker as EDGAR maps it (class shares as BRK-B) |
| company | string | Filer name as on the filing |
| cik | string | SEC Central Index Key of the filer |
| status | string | reported (an 8-K Item 2.02 on EDGAR) or estimated (last year's date plus 52 weeks) |
| basis | string (date) | null | For an estimate, last year's reported date it is built from; null for reported rows |
| accessionNo | string | null | The filing's accession number for reported rows; null for estimates |
A company keeps one estimate per quarter; when its 8-K arrives the estimate disappears and the reported row takes its place. Companies with no Item 2.02 filing in the last year get no estimate.
Numeric values arrive as strings where precision matters (prices, rates); parse with your language's decimal type for accounting-grade math. Rate limiting is fair-use per IP; a 429 response includes a Retry-After header. No authentication or API key needed. Attribution is appreciated: xoomar.com/markets.
Need more headroom? A free account raises your limit to 120 requests a minute with an X-API-Key header.
The per-company route returns an object instead of a list:
Response Shape
Every endpoint returns the same JSON envelope: { data, updatedAt, source, docs }. The data field is an object with these fields:
| Field | Type | Description |
|---|---|---|
| ticker | string | Ticker as requested, upper case |
| company | string | null | Filer name from the newest filing |
| cik | string | null | SEC Central Index Key |
| history | array | Reported dates newest first: { date, accessionNo }, up to 80 |
| next | object | null | { date, status: estimated, basis } for the next expected report, or null |
| lastReported | string (date) | null | Newest reported date |
Numeric values arrive as strings where precision matters (prices, rates); parse with your language's decimal type for accounting-grade math. Rate limiting is fair-use per IP; a 429 response includes a Retry-After header. No authentication or API key needed. Attribution is appreciated: xoomar.com/markets.
Need more headroom? A free account raises your limit to 120 requests a minute with an X-API-Key header.
Frequently Asked Questions
Where do the dates come from?
How good is the estimate?
Why is a company missing?
Is the time of day included?
What are the rate limits?
Data on this page is provided for informational purposes only and is not financial advice. See our editorial policy.