How to get split and dividend history as data
Corporate actions as their own table, with four dates per dividend and a ratio per split — and the spin-off that is neither, recorded three ways.
Ask for the events as their own table rather than reading them back out of an adjusted price. Massive, EODHD and Alpha Vantage return each dividend with its declaration, ex, record and pay dates and each split as a ratio; Sharadar adds spin-offs, ticker changes and ADR ratio changes. What breaks is the event that is neither a split nor a dividend: one vendor records a spin-off as an odd split ratio, another as two rows.
The short way
Ask for the events, not for the adjusted price. An adjusted series tells you an event happened by moving every number before it; a corporate-actions endpoint tells you what the event was, which is what anything that adjusts, reconciles or reports income actually needs. With Massive, whose free key covers both endpoints for the last two years:
import requests
BASE = "https://api.massive.com/stocks/v1"
params = {"ticker": "MMM", "limit": 1000, "apiKey": "YOUR_API_KEY"}
dividends = requests.get(f"{BASE}/dividends", params=params).json()["results"]
splits = requests.get(f"{BASE}/splits", params=params).json()["results"]
for d in dividends[:3]:
print(d["ex_dividend_date"], d["pay_date"], d["cash_amount"], d["distribution_type"])
Each dividend comes back with declaration_date, ex_dividend_date, record_date and
pay_date, the original cash_amount and a split_adjusted_cash_amount beside it, and a
distribution_type of recurring, special, supplemental, irregular or unknown. Each split
has split_from, split_to, an execution_date and an adjustment_type that separates
forward_split from reverse_split and stock_dividend. Results page at up to 5,000 rows through
next_url.
Store those rows in a table of their own, next to unadjusted prices, and derive whatever adjusted view you need from the two. Why adjusted close differs is the argument for that shape and the arithmetic behind it; this page is where to get the events.
What the options are
Separate endpoints with every date. Massive splits dividends and splits into
two endpoints and labels the awkward cases for you — a special dividend is special with a
frequency of 0, a reverse split says so. Records go back to 15 January 2000 for dividends and
25 October 1978 for splits, but the free Basic plan sees two years of either, at five calls a
minute; the $29 Starter plan opens all of it. Dividends here are cash only; a stock dividend
arrives on the splits endpoint.
One call per history, back to 1970. EODHD serves /api/div/{SYMBOL} and
/api/splits/{SYMBOL} at one API call per request however many rows come back, and a bulk route
for every event on one date across an exchange. Each dividend carries unadjustedValue, what one
share received, and value, the same payment restated in today's shares. Splits are a string,
"4.000000/1.000000", to be split on the slash and divided as floats. The declaration, record and
payment dates are complete for US listings and, by EODHD's own measurement, thin out outside North
America. Splits and dividends come with the $19.99 end-of-day plan and not with the Fundamentals
plan, which costs more.
One table for everything that changes a ticker. Sharadar's actions table
covers every active and delisted US ticker in its prices and fundamentals tables: splits, cash
dividends, spin-offs, ticker changes, ADR ratio changes, listing and delisting dates with the
reason, and the acquirer when a company disappears into another. It is the only option here that
answers "what happened to this ticker" rather than "what did it pay", and history runs to 1998. It
is one date per row and no more — no separate record or pay date — and it comes with the Prices plan under a personal-use licence: five years of
history for $9 a month, ten for $19, back to 1998 for $39.
Free, with declared dividends included. Alpha Vantage has DIVIDENDS,
historical and declared, with ex_dividend_date, declaration_date, record_date,
payment_date and amount, and SPLITS as an effective_date and a split_factor. Both are on
the free key, whose 25 requests a day is one ticker's two histories twelve times over — enough for
a portfolio, not for a universe.
Already in the price rows. Tiingo's daily prices carry divCash, non-zero on
a dividend's ex-date, and splitFactor, which is 1.0 except on the day a company splits, reverse
splits or pays a distribution. If you are pulling bars from Tiingo anyway, filter those two
columns and you have the events at no extra request. Its dedicated distributions and splits
endpoints, with pay, record and declaration dates and a cancelled status, are documented as an
early-release beta for beta-enabled and enterprise customers, by email to support.
Where this breaks
Four dates, and the wrong join. The declaration date is when the board announced it, the ex-date is the first day the stock trades without it, the record date decides who is entitled, and the pay date is when cash moves. Prices react on the ex-date and vendors adjust there; brokers credit cash on the pay date, often weeks later. A dividend joined to prices on its pay date lands the price drop in the wrong month, and an income report built on ex-dates counts money that has not arrived. Tracking dividends across brokers is the cash side of the same problem.
Declared is not paid. A future row is an announcement. Tiingo carries a cancelled code on both dividends and splits because announcements are withdrawn, and a calendar of declared dividends taken as a ledger will eventually record income that never came.
Two amounts for one payment. EODHD's value and Massive's split_adjusted_cash_amount are
restated for every later split; unadjustedValue and cash_amount are the original. EODHD's own
example is an Apple dividend from 1987 whose two figures differ by exactly 224, the product of
Apple's five splits since. Divide a restated dividend by an unadjusted price and the yield comes
out wrong by that factor.
Special dividends look like a policy change. A one-off payment ten times the usual size,
treated as recurring, puts a fantasy yield on the stock for a year. Massive labels it special
with a frequency of 0; Tiingo's frequency code can say irregular; Alpha Vantage and Sharadar give
you an amount and leave the inference to you.
Reverse splits are the same field pointing the other way. EODHD writes them as
"1.000000/8.000000", Massive as reverse_split with split_to smaller than split_from. Code
that reads only the numerator, or assumes a ratio above one, inverts every reverse split — and
reverse splits are what struggling companies do on the way to a delisting, so they cluster in
exactly the names a backtest most needs to get right.
A spin-off is neither, and each vendor records it its own way. 3M spun off Solventum at one
SOLV share for every four MMM shares held on the 18 March 2024 record date. On 4 October 2026
Sharadar's table held that as two rows dated 1 April 2024 — a spinoff with a ratio of 0.25 and
the SOLV ticker, and a spinoffdividend valued at 17.85. yfinance held it as a 1.196 stock
split on the same date, and restated the February 2024 dividend from $1.51 to $1.2625 to match.
EODHD warns that its split field carries spin-off adjustments too, with ratios such as
"1281.000000/1000.000000" for GE on 4 January 2023. Code that treats every ratio as a split
counts phantom shares; code that ignores them leaves the price series with an unexplained drop.
ADR ratio changes move the price and are nobody's split. When the number of foreign shares behind one ADR changes, the ADR's price jumps with no change in the company. Sharadar records these as their own action; an endpoint that knows only splits and dividends will not show it, and the price series will.
Tickers get renamed and reused. Every endpoint above takes a ticker, and a ticker is not an
identity: a renamed company's history may sit under its old symbol, and an old symbol may belong to
somebody else now. Sharadar's actions table records ticker changes and its permaticker
survives them; Tiingo carries a permaTicker on every event; for the rest, see
symbology.
Defaults truncate quietly. EODHD's default CSV returns only the date and the restated dividend;
the other six fields are JSON-only. Sharadar's from parameter defaults to one year ago, so a
request with no date range returns one year of a forty-year history. Massive pages at 100 rows
unless you raise limit. None of these is an error, and all three look like a short history.
If you outgrow this
You need every event for every name, every day. Then you are buying a feed rather than an endpoint — EODHD's bulk route by date, Sharadar's whole-table download, or the reference data a tick vendor such as Databento sells beside its prices.
You need the events to match what your vendor's adjusted prices did. Take both from one vendor, and check one known event by hand in both. Corporate action covers why two vendors can both be right and still disagree.
You are publishing yields or payout histories. Every option above is licensed for personal or internal use at its entry price; putting the figures in front of other people is a different licence — see redistribution. The rest of the field is in market data APIs.
The tools that do this
In the order this page recommends trying them. Paid placement does not affect this order.
Massive
Separate dividend and split endpoints with all four dates, a special-or-recurring label and a reverse-split type. Free plan reaches back two years.
Full-tick US equities, options and futures from a direct exchange feed.
$29/moFree tier
EODHD
One call per ticker for each history, back to 1970, with the paid and the restated amount side by side. Ask for JSON, or the CSV drops six fields.
End-of-day and fundamentals for 60+ exchanges worldwide, at a hobbyist price.
$19.99/moFree tier
Sharadar
One actions table for every US ticker, live and delisted, spin-offs and renames included. Five years for $9 a month, all of it for $39, personal use only.
Point-in-time US fundamentals, EOD prices and 13F tables — now sold direct to individuals.
$9/moFree tier
Alpha Vantage
Dividends with four dates, declared ones included, and splits as a factor, on the free key's 25 requests a day.
The API most people's first script talks to — free key, wide coverage, hard rate limits.
$49.99/moFree tier
Tiingo
A dividend and a split factor on every daily bar, keyed to the ex-date. The dedicated endpoints with pay and record dates are a beta you ask for by email.
End-of-day equity history back to 1962, plus crypto, forex and news, from $30 a month.
$30/moFree tier
FAQ
Which date should I key a dividend on?
The ex-date, if the question is about prices — it is the day the price drops by roughly the dividend and the day every vendor's adjustment is applied. The pay date, if the question is about cash — it is when money reaches an account, often weeks later. The record date decides who is entitled and matters mostly for reconciling a spin-off or a broker statement. Store all three; joining on the wrong one shifts every dividend by a few weeks.
Why does the same dividend have two amounts?
Because one is what a share received on the day and the other is that payment restated in today's shares, divided by every split since. EODHD calls them unadjustedValue and value, Massive cash_amount and split_adjusted_cash_amount. Use the restated amount beside adjusted prices and the original beside raw prices or a broker statement. Mixing the two puts a yield out by the product of every split since.
Can I get dividends that have been declared but not yet paid?
Yes, from most of these. Alpha Vantage's dividends endpoint returns historical and declared future distributions, Tiingo's beta endpoints return past, present and future events, and EODHD sends forthcoming ex-dates to its separate Calendar API rather than to the dividend history. Treat a future row as an announcement that can still change — Tiingo carries a cancelled status code for exactly that reason.
Sources
- Dividends — Stocks REST API — Massive, read
- Splits — Stocks REST API — Massive, read
- Corporate Actions API: Dividend & Split History Since 1970 — EODHD,
- Corporate Actions (actions) — Sharadar documentation — Sharadar, read
- Dividends — Tiingo API documentation — Tiingo, read
- 3M Completes Spin-off of Solventum — 3M,
The catalogue next door
This page names a handful of cards. The rest of them are in Stock Market Data APIs, each filled in against the same schema, with the fields to narrow it yourself.
Last updated . Corrected in place: this is a reference page, not a dated post.