XOOMAR

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

GET
/api/markets/earnings?from=2026-10-01&to=2026-10-31&status=estimated&ticker=NVDA&limit=500

The 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.

GET
/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.

GET
/api/markets/earnings/csvsame parameters

The 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:

FieldTypeDescription
datestring (date)The reported date (filing date of the 8-K) or the estimated date
tickerstringTicker as EDGAR maps it (class shares as BRK-B)
companystringFiler name as on the filing
cikstringSEC Central Index Key of the filer
statusstringreported (an 8-K Item 2.02 on EDGAR) or estimated (last year's date plus 52 weeks)
basisstring (date) | nullFor an estimate, last year's reported date it is built from; null for reported rows
accessionNostring | nullThe 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:

FieldTypeDescription
tickerstringTicker as requested, upper case
companystring | nullFiler name from the newest filing
cikstring | nullSEC Central Index Key
historyarrayReported dates newest first: { date, accessionNo }, up to 80
nextobject | null{ date, status: estimated, basis } for the next expected report, or null
lastReportedstring (date) | nullNewest 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?
Reported dates are the filing dates of 8-K forms with Item 2.02 on SEC EDGAR, read through EDGAR's full-text search twice a day. Estimates are computed from those filings: last year's date for the same quarter plus 52 weeks, which keeps the weekday.
How good is the estimate?
Most large companies report within a day or two of the same weekday a year earlier; the audit measures the share of estimates within one day of the actual and the hub page shows it once a season of history exists. Treat an estimate as a week, not a day, until the company announces the date.
Why is a company missing?
It has not filed an 8-K with Item 2.02 in the last year (foreign private issuers file 6-K instead; some small companies put results only in the 10-Q). A company that reported for the first time this year has no basis for an estimate until next year.
Is the time of day included?
No. The filing carries the date, not whether the release was before the open or after the close.
What are the rate limits?
30 requests per minute per IP without a key, 120 with a free account key.

Data on this page is provided for informational purposes only and is not financial advice. See our editorial policy.