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

*https://stockmarketstack.com/how-to/get-split-and-dividend-history-as-data · next to Stock Market Data APIs*

**Answer:** 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 tools that do this

*In the order this page recommends trying them. Paid placement does not affect this order.*

1. [Massive](https://stockmarketstack.com/tools/massive.md) — 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.
2. [EODHD](https://stockmarketstack.com/tools/eodhd.md) — 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.
3. [Sharadar](https://stockmarketstack.com/tools/sharadar.md) — 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.
4. [Alpha Vantage](https://stockmarketstack.com/tools/alpha-vantage.md) — Dividends with four dates, declared ones included, and splits as a factor, on the free key's 25 requests a day.
5. [Tiingo](https://stockmarketstack.com/tools/tiingo.md) — 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.

## 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](https://stockmarketstack.com/tools/massive), whose free key covers both endpoints for the last two years:

```python
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](https://stockmarketstack.com/guides/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](https://stockmarketstack.com/tools/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](https://stockmarketstack.com/tools/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](https://stockmarketstack.com/tools/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](https://stockmarketstack.com/tools/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](https://stockmarketstack.com/tools/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](https://stockmarketstack.com/how-to/track-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](https://stockmarketstack.com/glossary/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](https://stockmarketstack.com/tools/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](https://stockmarketstack.com/glossary/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](https://stockmarketstack.com/glossary/redistribution). The rest of the field is in
[market data APIs](https://stockmarketstack.com/categories/market-data-apis).

## 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

1. [Dividends — Stocks REST API](https://massive.com/docs/rest/stocks/corporate-actions/dividends) — Massive, read 2026-10-04
2. [Splits — Stocks REST API](https://massive.com/docs/rest/stocks/corporate-actions/splits) — Massive, read 2026-10-04
3. [Corporate Actions API: Dividend & Split History Since 1970](https://eodhd.com/financial-apis/api-splits-dividends) — EODHD, 2026-09-16
4. [Corporate Actions (actions) — Sharadar documentation](https://sharadar.com/docs/actions) — Sharadar, read 2026-10-04
5. [Dividends — Tiingo API documentation](https://www.tiingo.com/documentation/corporate-actions/dividends) — Tiingo, read 2026-10-04
6. [3M Completes Spin-off of Solventum](https://news.3m.com/2024-04-01-3M-Completes-Spin-Off-of-Solventum) — 3M, 2024-04-01

*Last updated 2026-10-04. A reference page, corrected in place — not a dated post.*
