DEV Community

Ken-Mutisya
Ken-Mutisya

Posted on

Get a Stock Earnings Calendar as Clean JSON (Earnings, Dividends, IPOs, Splits)

If you have ever tried to build anything around earnings season, a trading dashboard, a backtest, a Discord bot that pings the channel before a big report, you hit the same annoyance. The earnings calendar is everywhere on the web and nowhere as clean data. You either scrape a finance site that fights you, or you pay for a data plan that bundles fifty things you do not need.

The data itself is public. The problem is shape and delivery. So here is how I pull the whole forward calendar as plain JSON, no key and no browser.

The source

Nasdaq exposes a set of keyless JSON endpoints behind its calendar pages. They are not documented as a product, but they are stable and they return real rows if you send a normal User-Agent.

  • earnings for a day: /api/calendar/earnings?date=YYYY-MM-DD
  • dividends for a day: /api/calendar/dividends?date=YYYY-MM-DD
  • upcoming splits: /api/calendar/splits
  • IPOs for a month: /api/ipo/calendar?date=YYYY-MM

No login, no API key, no proxy. That last part matters. The moment a scraper needs a headless browser plus a residential proxy, the per run cost balloons and a thin data feed goes underwater. Pure HTTP over JSON stays cheap, so the margin works.

What a row looks like

One earnings row carries the symbol, company, report date, whether it reports pre market or after hours, the EPS estimate, how many analysts cover it, and last year's number for context.

{
  "eventType": "earnings",
  "symbol": "NKE",
  "companyName": "Nike, Inc.",
  "date": "2026-06-30",
  "reportTime": "after hours",
  "epsForecast": "$0.11",
  "numAnalystEstimates": 10,
  "lastYearEps": "$0.14"
}
Enter fullscreen mode Exit fullscreen mode

Dividends add ex date, record date, payment date and rate. IPOs add price, shares and deal value. Splits add the ratio. One stream, one shape per event type, filterable by a ticker watchlist.

A few things I learned

A normal browser User-Agent is required or the endpoint returns nothing. Earnings and dividends are per day, so you loop the range. Splits come as one list you filter locally, and IPOs are monthly. Dates come back as M/D/YYYY, so normalize them once at the edge or every downstream join hurts.

And always sanity check the row count before you trust it. An endpoint that quietly returns zero rows looks identical to a quiet news day until you compare against a date you know is busy.

If you would rather not run it yourself

I packaged this as a small pay per use scraper on Apify, the Stock Earnings Calendar Scraper. You give it a date range or a watchlist and it returns the same JSON above for earnings, dividends, IPOs and splits. First rows of every run are free so you can check the output before you pay. It is one of a growing set of keyless public data tools I keep shipping, and counting.

Either way, the takeaway is the same. The calendar is public data. With the right endpoint it is also clean data.

Top comments (0)