Reporting dates with a confidence value. /calendar/* is the read side; /earnings/* additionally exposes the source situation and the operational side.
What it is good for is on the product page: Earnings dates
/calendar/for-identifiersGET/calendar/upcomingGET/earnings/cacheDELETE/earnings/cache/{ticker}GET/earnings/calendar/{identifier}GET/earnings/confidence/{identifier}GET/earnings/coveragePOST/earnings/fetch/batchPOST/earnings/fetch/bulkGET/earnings/fetch/{identifier}GET/earnings/jobsGET/earnings/jobs/{job_id}POST/earnings/refresh/cachedPOST/earnings/sync/from-isinsPOST/earnings/sync/from-tickersPOST/earnings/sync/repairPOST/earnings/sync/stale/calendar/for-identifiersGiven an array of tickers and/or ISINs, return their calendar events within a window (today + days, or an explicit from/to range). ISINs are resolved to tickers via ticker_reference.
No parameters.
CalendarForIdentifiersRequest| Name | Type | Meaning |
|---|---|---|
identifiers | array required | Identifiers |
days | integer optional · default 14 | Days |
from_date | string optional | From Date |
to_date | string optional | To Date |
category | string optional | Category |
limit | integer optional · default 5000 | Limit |
curl -X POST "$API/calendar/for-identifiers" \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{ … }'/calendar/upcomingUpcoming calendar events (from calendar_events) within a date window — today, next 5d, 14d, or an explicit from/to range — enriched with ticker / name / ISIN.
| Name | Type | Meaning |
|---|---|---|
days | integer, in query optional · default 7 | Look ahead this many days from today |
from_date | string, in query optional | Override window start (YYYY-MM-DD) |
to_date | string, in query optional | Override window end (YYYY-MM-DD) |
category | string, in query optional | e.g. Ergebnisberichte, Dividenden, Hauptversammlungen |
limit | integer, in query optional · default 500 | — |
curl "$API/calendar/upcoming?days=14&category=earnings" \ -H "X-API-Key: $KEY"
{
"events": [
{ "isin": "FI0009000681", "name": "Nokia",
"date": "2026-09-17", "category": "earnings",
"confidence": 0.94, "sources": ["yf_info", "nasdaq", "marketscreener"] }
]
}/earnings/cacheList all tickers currently in the earnings MongoDB cache.
Ticker mit widerspruechlicher Identitaet werden ausgelassen und nur gezaehlt -- sie stehen im Cache, sind aber keiner Firma sicher zuzuordnen.
No parameters.
curl "$API/earnings/cache" \ -H "X-API-Key: $KEY"
/earnings/cache/{ticker}Manually invalidate the cached earnings for a ticker. The next call to /confidence or /fetch will re-fetch live data.
| Name | Type | Meaning |
|---|---|---|
ticker | string, in path required | — |
curl -X DELETE "$API/earnings/cache/SAP" \ -H "X-API-Key: $KEY"
/earnings/calendar/{identifier}Return the earnings calendar for a ticker, filtered by confidence.
This endpoint reads from MongoDB only — no live fetch. If the ticker is not yet cached, call first:
GET /earnings/fetch/{identifier}?origin=yf (fast, always saves)GET /earnings/confidence/{identifier} (all sources, saves if conf ≥ 0.9)Accepts: ticker, ISIN, CIK, WKN (prefix notation for all-digit WKNs: wkn:623100).
| Name | Type | Meaning |
|---|---|---|
identifier | string, in path required | — |
min_confidence | number, in query optional · default 0.9 | Minimum confidence threshold (default 0.9). Only reads from MongoDB cache. |
curl "$API/earnings/calendar/SAP" \ -H "X-API-Key: $KEY"
/earnings/confidence/{identifier}Fetch earnings from all sources and compute cross-source confidence scores. Results are cached in MongoDB for cache_hours hours.
| Score | Meaning |
|---|---|
| < 0.65 | Single source — provisional |
| 0.65–0.89 | 1–2 sources — verify before acting |
| 0.90–0.95 | 2 high-quality sources agree ✓ |
| > 0.95 | 3+ sources agree — high reliability ✓✓ |
| Name | Type | Meaning |
|---|---|---|
identifier | string, in path required | — |
force_refresh | boolean, in query optional · default False | Bypass cache and re-fetch |
cache_hours | integer, in query optional · default 24 | Max cache age in hours |
curl "$API/earnings/confidence/SAP" \ -H "X-API-Key: $KEY"
/earnings/coverageThe state of the dates lane in one call.
Answers: how many tickers have any dates at all, how many are confirmed, how large the repair backlog is, and which source actually delivers. This is the endpoint on which repair progress can be read off.
No parameters.
curl "$API/earnings/coverage" \ -H "X-API-Key: $KEY"
/earnings/fetch/batchBatch-fetch earnings for multiple identifiers in parallel (max 5 concurrent).
Accepts a list of identifiers — each can be ticker, ISIN, WKN (with wkn: prefix), CIK, or any format supported by the single-fetch endpoint.
origin applies to all items in the batch.
No parameters.
BatchFetchRequest| Name | Type | Meaning |
|---|---|---|
items | array required | Items |
origin | string optional · default all | Origin |
curl -X POST "$API/earnings/fetch/batch" \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{ … }'/earnings/fetch/bulkStart a background job that fetches earnings for a large list of identifiers.
Returns immediately with a job_id — poll GET /earnings/jobs/{job_id} for progress.
yf (fast, always saves) or all (5 sources, saves if confidence ≥ 0.9)``json {
"identifiers": ["AAPL", "MSFT", "DE0006231004", "isin:US5949181045"], "origin": "yf", "concurrency": 20
} ``
No parameters.
BulkFetchRequest| Name | Type | Meaning |
|---|---|---|
identifiers | array required | Identifiers |
origin | string optional · default tiered | Origin |
concurrency | integer optional · default 10 | Concurrency |
curl -X POST "$API/earnings/fetch/bulk" \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{ … }'/earnings/fetch/{identifier}Collect earnings data and save it to MongoDB.
origin=tiered (default) yfinance first; if it returns nothing, or
less than confidence 0.9, the remaining five sources follow. On a single lookup confirmation is worth the cost, so unlike in bulk mode this escalates even on a hit.
origin=yf yfinance.info only. A diagnostic mode. Unsuitable for
bulk runs, because only a single source is asked and an
empty result then looks like a genuine "no date" — use
tiered for that.origin=massive massive.com /v3/reference/tickers/{ticker}/earnings.
Returns full history plus all future quarters.
origin=all All six sources, always contacted.
Data is stored as soon as at least one date has been found; the quality sits in the quality sub-document (confirmed from confidence 0.9). A hit from only one source is therefore not lost, but stays recognisable as such.
Accepts any identifier:
| Format | Example |
|---|---|
| ISIN | DE0006231004 |
| CIK | 320193 |
| Ticker | AAPL, IFX.DE |
| WKN (auto) | A14YUR |
| WKN (digits) | wkn:623100 |
| Explicit | isin:DE0006231004 |
| Name | Type | Meaning |
|---|---|---|
identifier | string, in path required | — |
origin | string, in query optional · default tiered | 'tiered' → yfinance zuerst, bei Leerlauf/geringer Konfidenz die restlichen vier. 'yf' → nur yfinance.info — Diagnose-Modus. 'all' → immer alle fuenf Quellen. |
curl "$API/earnings/fetch/SAP" \ -H "X-API-Key: $KEY"
/earnings/jobsList the most recent bulk jobs (newest first).
| Name | Type | Meaning |
|---|---|---|
limit | integer, in query optional · default 20 | — |
curl "$API/earnings/jobs" \ -H "X-API-Key: $KEY"
/earnings/jobs/{job_id}Poll the status of a bulk fetch / refresh job.
status values:
pending — queued, not yet startedrunning — in progress (done / total shows progress)done — finished (check failed for partial errors)| Name | Type | Meaning |
|---|---|---|
job_id | string, in path required | — |
curl "$API/earnings/jobs/job_7f3c" \ -H "X-API-Key: $KEY"
/earnings/refresh/cachedStart a background job that re-fetches earnings for every ticker already in the MongoDB earnings_cache.
true, only re-fetch entries older than stale_hours/fetch/bulkReturns immediately with a job_id.
No parameters.
RefreshCachedRequest| Name | Type | Meaning |
|---|---|---|
origin | string optional · default tiered | Origin |
concurrency | integer optional · default 10 | Concurrency |
stale_only | boolean optional · default False | Stale Only |
stale_hours | integer optional · default 24 | Stale Hours |
curl -X POST "$API/earnings/refresh/cached" \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{ … }'/earnings/sync/from-isinsStart a background job that fetches earnings for all ticker_reference entries that already have an ISIN and match the requested security types.
Defaults:
market="stocks"active=truetype_filters=["CS", "ADRC"]include_untyped_stocks=falseADRS is accepted as an alias and normalized to ADRC.
No parameters.
SyncFromIsinsRequest| Name | Type | Meaning |
|---|---|---|
origin | string optional · default tiered | Origin |
concurrency | integer optional · default 10 | Concurrency |
market | string optional · default stocks | Market |
active | boolean optional · default True | Active |
type_filters | array optional · default ['CS', 'ADRC'] | Type Filters |
include_untyped_stocks | boolean optional · default False | Include Untyped Stocks |
curl -X POST "$API/earnings/sync/from-isins" \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{ … }'/earnings/sync/from-tickersStart a background job that fetches earnings for every ticker stored in the ticker_reference collection (populated via POST /tickers/sync).
Filters narrow down which tickers are included (default: active stocks). Returns immediately with a job_id — poll GET /earnings/jobs/{job_id}.
No parameters.
SyncFromTickersRequest| Name | Type | Meaning |
|---|---|---|
origin | string optional · default tiered | Origin |
concurrency | integer optional · default 10 | Concurrency |
market | string optional · default stocks | Market |
type_filter | string optional | Type Filter |
active | boolean optional · default True | Active |
curl -X POST "$API/earnings/sync/from-tickers" \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{ … }'/earnings/sync/repairFetches dates for tickers that have none yet, or only unconfirmed ones.
Two passes:
only_empty=true (default) — documents without any date at all. The$existspredicate ondates.0structurally excludes documents that already carry dates, so they cannot consume budget.
only_unconfirmed=true — documents that have dates but whosequality.confirmed is false. Here the fetch escalates until a second
source confirms.Resumable without offsets: the worklist is derived from probe_at and quality.empty_streak, sorted by probe_at ascending. Aborting mid-run costs nothing — the next call derives the remaining tickers afresh. When nothing is due any more the answer is 422; the cron loop treats that as success and therefore terminates on its own.
No parameters.
RepairRequest| Name | Type | Meaning |
|---|---|---|
origin | string optional · default tiered | Origin |
concurrency | integer optional · default 4 | Concurrency |
only_empty | boolean optional · default True | Only Empty |
only_unconfirmed | boolean optional · default False | Only Unconfirmed |
max_empty_streak | integer optional · default 6 | Max Empty Streak |
limit | integer optional · default 2000 | Limit |
curl -X POST "$API/earnings/sync/repair" \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{ … }'/earnings/sync/staleIncremental earnings sync. Walks ticker_reference and re-fetches only the tickers whose cached earnings in earnings_cache are missing or older than max_age_days (checked against earnings_cache.fetched_at).
Identifier resolution per ticker:
1.ticker_reference.isin→isin:<ISIN>2. fallbackyahoo_profiles.yahoo_symbol(joined on ticker) →ticker:<SYMBOL>3. last resort: the raw ticker →ticker:<TICKER>
Fetches in tiers (origin=tiered). Returns a job_id — poll GET /earnings/jobs/{job_id}.
No parameters.
SyncStaleRequest| Name | Type | Meaning |
|---|---|---|
origin | string optional · default tiered | Origin |
max_age_days | integer optional · default 14 | Max Age Days |
concurrency | integer optional · default 4 | Concurrency |
market | string optional · default stocks | Market |
active | boolean optional · default True | Active |
type_filter | string optional | Type Filter |
limit | integer optional | Limit |
curl -X POST "$API/earnings/sync/stale" \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{ … }'