High Granular Tick Data API: US Stocks Learn more

Calendar API: Upcoming Dividends, Earnings, Trends, IPOs and Splits

The Corporate Events Calendar covers the scheduled events that move a price: earnings reports, analyst estimate revisions, IPOs, stock splits and dividend dates. Five endpoints sit under the same /api/calendar/ prefix and the same access right, each answering a different question, and each carrying history as well as what is still scheduled.

EndpointWhat it answersCoverage measured in August 2026
/api/calendar/earningsWho reports when, with actual EPS against the consensus estimateBack to the 1990s, and 26,414 reports already scheduled between today and the end of 2027 — dense through March 2027, thinning to a handful after that
/api/calendar/trendsConsensus EPS and revenue estimates, and how they have been revisedAbout 96 records per symbol for a large US name, anchored on fiscal periods from 2017 to 2027
/api/calendar/iposFilings, expected listings and priced dealsContinuous from February 2013, plus an isolated batch of 84 deals in early 2010. Forward visibility is short — about three weeks
/api/calendar/splitsEffective split and reverse-split ratiosContinuous from February 2013, plus 134 records in the first quarter of 2010. Announced splits reach into February 2027
/api/calendar/dividendsDividend dates for a symbol or a single dayDeep history and forward dates both — Apple’s 92 dividend dates start on 1987-05-11, and 347 symbols already carried a date on 2026-09-15

Those counts were measured on 18 August 2026 and grow with the feed. The calendar is part of the Fundamentals Data Feed and All-In-One plans, and is also sold on its own together with the news feed as Corporate Events Calendar & News Feed. Every request across all five endpoints costs one API call, whatever the size of the window.

Read this before your first request: on the earnings and splits endpoints the symbols parameter narrows a date window rather than replacing it, and when you omit from and to that window silently defaults to today through today + 7 days. A request for a single ticker with no dates therefore comes back with an empty list — the company almost certainly has no event in the next week. Always pass from and to alongside symbols. At the other end of the scale, more than ten years between the two bounds returns HTTP 422 with “Maximum date range is 10 years” on earnings, IPOs and splits alike — though that check is skipped when symbols is present, so a symbols query can span the whole archive.

Earnings

https://eodhd.com/api/calendar/earnings?from=2025-01-01&to=2025-01-31&api_token=YOUR_API_TOKEN&fmt=json

Reported and upcoming earnings, one record per company and fiscal period, with the actual EPS, the consensus estimate and the surprise already worked out for you.

Parameters

api_token string required
Your EODHD API token
from date optional
Start of the window, YYYY-MM-DD, matched against the report date. An unparseable value returns HTTP 422 (Default: today)
to date optional
End of the window, YYYY-MM-DD. Pass from alone and to becomes from + 7 days; pass to alone and from becomes today (Default: from + 7 days)
symbols string optional
One or more tickers in EODHD format, comma-separated, for example AAPL.US,MSFT.US,AI.PA. This filters the date window, it does not replace it — combine it with from and to
fmt enum optional
Response format. Allowed values: json, csv. Omitting the parameter returns CSV, whose column names differ from the JSON field names — Code, Report_Date, BeforeAfterMarket (Default: csv)

A window whose end precedes its start is not rejected: it returns HTTP 200 with an empty list. A symbol that does not exist, however, returns HTTP 404 with a body complaining about a missing “type” — a misleading message that means the ticker was not found. When you pass symbols the response echoes the symbols back instead of the from and to you used, and records are grouped by ticker; in a plain date window they arrive sorted by report date, one record per company and fiscal period, with no duplicates.

Keep earnings windows short. Nothing here is paginated, and this is the largest of the five datasets: one year is about 120,000 records and 21 MB, and a six-year window came back as a 158 MB payload after 45 seconds. Beyond roughly five years the request often fails outright with HTTP 500 and a bare “Error occurred” body, returned within ten seconds — the same window can succeed on one attempt and fail on the next, so treat the ten-year ceiling as a validation limit rather than a workable size. Slice long histories by month or quarter, or pass symbols to pull one company’s full record instead.

Request Example

https://eodhd.com/api/calendar/earnings?symbols=AAPL.US&from=2025-01-01&to=2025-12-31&api_token={YOUR_API_TOKEN}&fmt=json
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/calendar/earnings?symbols=AAPL.US&from=2025-01-01&to=2025-12-31&api_token={YOUR_API_TOKEN}&fmt=json"
(Sign up for free to get an API token)
$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://eodhd.com/api/calendar/earnings?symbols=AAPL.US&from=2025-01-01&to=2025-12-31&api_token={YOUR_API_TOKEN}&fmt=json',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'GET',
));

$data = curl_exec($curl);
curl_close($curl);

try {
    $data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
    var_dump($data);
} catch (Exception $e) {
    echo 'Error. '.$e->getMessage();
}
(Sign up for free to get an API token)
import requests

url = f'https://eodhd.com/api/calendar/earnings?symbols=AAPL.US&from=2025-01-01&to=2025-12-31&api_token={YOUR_API_TOKEN}&fmt=json'
data = requests.get(url).json()

print(data)
(Sign up for free to get an API token)
library(httr)
library(jsonlite)

url <- 'https://eodhd.com/api/calendar/earnings?symbols=AAPL.US&from=2025-01-01&to=2025-12-31&api_token={YOUR_API_TOKEN}&fmt=json'
response <- GET(url)

if (http_type(response) == "application/json") {
    content <- content(response, "text", encoding = "UTF-8")
    cat(content)
} else {
    cat("Error while receiving data\n")
}
(Sign up for free to get an API token)
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

Try it now (it's free)!

How to use it (YouTube)

Response Example

{
    "type": "Earnings",
    "description": "Historical and upcoming Earnings",
    "symbols": "AAPL.US",
    "earnings": [
        {
            "code": "AAPL.US",
            "report_date": "2025-01-30",
            "date": "2024-12-31",
            "before_after_market": "AfterMarket",
            "currency": "USD",
            "actual": 2.4,
            "estimate": 2.34,
            "difference": 0.06,
            "percent": 2.5641
        },
        {
            "code": "AAPL.US",
            "report_date": "2025-05-01",
            "date": "2025-03-31",
            "before_after_market": "AfterMarket",
            "currency": "USD",
            "actual": 1.65,
            "estimate": 1.62,
            "difference": 0.03,
            "percent": 1.8519
        },
        {
            "code": "AAPL.US",
            "report_date": "2025-07-31",
            "date": "2025-06-30",
            "before_after_market": "AfterMarket",
            "currency": "USD",
            "actual": 1.57,
            "estimate": 1.43,
            "difference": 0.14,
            "percent": 9.7902
        },
        {
            "code": "AAPL.US",
            "report_date": "2025-10-30",
            "date": "2025-09-30",
            "before_after_market": "AfterMarket",
            "currency": "USD",
            "actual": 1.85,
            "estimate": 1.77,
            "difference": 0.08,
            "percent": 4.5198
        }
    ]
}

Response Fields

FieldTypeDescription
codestringTicker in EODHD format
report_datedateDay the results are announced — the date the window filters on
datedateEnd of the fiscal period the figures belong to
before_after_marketstring or nullBeforeMarket or AfterMarket, null when the timing is unknown
currencystring or nullReporting currency of the EPS figures
actualnumber or nullReported EPS. Null for a report that has not happened yet
estimatenumber or nullConsensus EPS estimate, where analysts cover the name
differencenumberactual minus estimate — but 0, not null, whenever the estimate is missing. In the default seven-day window all 1,636 records without an estimate carried difference 0 and percent null, so test estimate rather than difference before you trust a surprise of zero
percentnumber or nullSurprise in percent against the estimate
https://eodhd.com/api/calendar/trends?symbols=AAPL.US&api_token=YOUR_API_TOKEN&fmt=json

Consensus estimates rather than results: EPS and revenue forecasts with their high, low and analyst count, plus the same EPS consensus as it stood 7, 30, 60 and 90 days ago and the count of revisions in each direction. This is the endpoint for tracking whether the street is walking a number up or down before the report lands.

The response is nested one level deeper than the other endpoints: trends is an array of arrays, and the n-th inner array holds the records for the n-th ticker in your symbols list. Each inner array is a history, not a snapshot — Apple returned 96 records anchored on 40 different fiscal period ends, from 2017 to 2027.

api_token string required
Your EODHD API token
symbols string required
One or more tickers in EODHD format, comma-separated. Required here — omitting it returns HTTP 422. This endpoint has no date parameters: pass from and to anyway and the response is byte-for-byte the same
fmt enum optional
Response format. Allowed values: json, csv. CSV is impractical here — it writes one line per symbol with the whole history on it, an 81 KB row for a single large-cap name (Default: csv)

Every numeric value in the trends payload arrives as a string, padded to four decimals — “9.5347”, “40.0000”, “523204888660.00”. Cast before you compute. Null appears where a figure is genuinely missing, so a parser has to handle both a quoted number and null in the same field.

https://eodhd.com/api/calendar/trends?symbols=AAPL.US&api_token={YOUR_API_TOKEN}&fmt=json
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/calendar/trends?symbols=AAPL.US&api_token={YOUR_API_TOKEN}&fmt=json"
(Sign up for free to get an API token)
$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://eodhd.com/api/calendar/trends?symbols=AAPL.US&api_token={YOUR_API_TOKEN}&fmt=json',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'GET',
));

$data = curl_exec($curl);
curl_close($curl);

try {
    $data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
    var_dump($data);
} catch (Exception $e) {
    echo 'Error. '.$e->getMessage();
}
(Sign up for free to get an API token)
import requests

url = f'https://eodhd.com/api/calendar/trends?symbols=AAPL.US&api_token={YOUR_API_TOKEN}&fmt=json'
data = requests.get(url).json()

print(data)
(Sign up for free to get an API token)
library(httr)
library(jsonlite)

url <- 'https://eodhd.com/api/calendar/trends?symbols=AAPL.US&api_token={YOUR_API_TOKEN}&fmt=json'
response <- GET(url)

if (http_type(response) == "application/json") {
    content <- content(response, "text", encoding = "UTF-8")
    cat(content)
} else {
    cat("Error while receiving data\n")
}
(Sign up for free to get an API token)
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

Try it now (it's free)!

How to use it (YouTube)
{
    "type": "Trends",
    "description": "Historical and upcoming earning trends",
    "symbols": "AAPL.US",
    "trends": [
        [
            {
                "code": "AAPL.US",
                "date": "2027-09-30",
                "period": "+1y",
                "growth": "0.0804",
                "earningsEstimateAvg": "9.5347",
                "earningsEstimateLow": "8.2400",
                "earningsEstimateHigh": "10.6700",
                "earningsEstimateYearAgoEps": "8.8027",
                "earningsEstimateNumberOfAnalysts": "40.0000",
                "earningsEstimateGrowth": "0.0832",
                "revenueEstimateAvg": "523204888660.00",
                "revenueEstimateLow": "483496000000.00",
                "revenueEstimateHigh": "594863000000.00",
                "revenueEstimateYearAgoEps": null,
                "revenueEstimateNumberOfAnalysts": "40.00",
                "revenueEstimateGrowth": "0.0955",
                "epsTrendCurrent": "9.5347",
                "epsTrend7daysAgo": "9.5490",
                "epsTrend30daysAgo": "9.6928",
                "epsTrend60daysAgo": "9.6669",
                "epsTrend90daysAgo": "9.6328",
                "epsRevisionsUpLast7days": "6.0000",
                "epsRevisionsUpLast30days": "8.0000",
                "epsRevisionsDownLast30days": "19.0000"
            }
        ]
    ]
}

One symbol, one inner array — the record above is the first of Apple’s 96, read on 18 August 2026, and the estimate fields in it move as analysts publish. It also shows what the endpoint is for: the consensus for fiscal 2027 stood at 9.5347 against 9.6928 a month earlier, with 19 analysts cutting their number in that month against 8 raising it. Ask for three tickers and the outer array holds three inner arrays, in the order you listed them.

FieldDescription
codeTicker in EODHD format
dateFiscal period end the estimate refers to — quarter end for a quarterly record, year end for an annual one
periodWhich horizon this record was: 0q current quarter, +1q next quarter, 0y current fiscal year, +1y next fiscal year. The same label repeats across many dates, because the file keeps the history
growth, earningsEstimateGrowth, revenueEstimateGrowthGrowth against the comparable prior period, as a ratio rather than a percentage
earningsEstimateAvg / Low / HighConsensus EPS and the range of individual estimates
earningsEstimateYearAgoEpsEPS actually delivered in the comparable prior period
earningsEstimateNumberOfAnalystsHow many analysts stand behind the EPS consensus
revenueEstimateAvg / Low / HighConsensus revenue and the range, in the reporting currency
revenueEstimateNumberOfAnalystsAnalyst count behind the revenue consensus
revenueEstimateYearAgoEpsRevenue in the comparable prior period. Frequently null
epsTrendCurrent, epsTrend7daysAgo, epsTrend30daysAgo, epsTrend60daysAgo, epsTrend90daysAgoThe same EPS consensus as it stood at those points — the drift is the signal
epsRevisionsUpLast7days, epsRevisionsUpLast30days, epsRevisionsDownLast30daysNumber of analysts who moved their EPS estimate up or down in that period

A symbol with no analyst coverage keeps its slot as an empty inner array rather than disappearing, so positions stay aligned with your symbols list — an ETF or a newly filed shell comes back as an empty group next to a populated one. Watch the size: Apple alone is 71 KB of JSON and two large caps 143 KB, so batch long lists.

Sign up & Get Data

IPOs

https://eodhd.com/api/calendar/ipos?from=2025-01-01&to=2025-01-31&api_token=YOUR_API_TOKEN&fmt=json

New listings from filing to pricing. A January 2025 window returned 161 deals — 108 still expected, 49 priced and 4 amended. The same listing reappears as it moves through the process: over the first half of 2025, 93 codes turned up more than once, among them 2613.HK, expected on 7 January with no price and priced at 31.8 two days later. Records are not sorted by date, so sort on your side.

Parameters

api_token string required
Your EODHD API token
from date optional
Start of the window, YYYY-MM-DD, matched against the expected or effective first trading date (Default: today)
to date optional
End of the window, YYYY-MM-DD (Default: from + 7 days)
fmt enum optional
Response format. Allowed values: json, csv. JSON carries every field (Default: csv)

This endpoint takes no symbols parameter. Passing one is accepted and silently ignored — you get the date window back, not the company you asked for. Filter by code on your side, or look the listing up in the Fundamental Data API once it trades.

Request Example

https://eodhd.com/api/calendar/ipos?from=2025-01-01&to=2025-01-31&api_token={YOUR_API_TOKEN}&fmt=json
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/calendar/ipos?from=2025-01-01&to=2025-01-31&api_token={YOUR_API_TOKEN}&fmt=json"
(Sign up for free to get an API token)
$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://eodhd.com/api/calendar/ipos?from=2025-01-01&to=2025-01-31&api_token={YOUR_API_TOKEN}&fmt=json',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'GET',
));

$data = curl_exec($curl);
curl_close($curl);

try {
    $data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
    var_dump($data);
} catch (Exception $e) {
    echo 'Error. '.$e->getMessage();
}
(Sign up for free to get an API token)
import requests

url = f'https://eodhd.com/api/calendar/ipos?from=2025-01-01&to=2025-01-31&api_token={YOUR_API_TOKEN}&fmt=json'
data = requests.get(url).json()

print(data)
(Sign up for free to get an API token)
library(httr)
library(jsonlite)

url <- 'https://eodhd.com/api/calendar/ipos?from=2025-01-01&to=2025-01-31&api_token={YOUR_API_TOKEN}&fmt=json'
response <- GET(url)

if (http_type(response) == "application/json") {
    content <- content(response, "text", encoding = "UTF-8")
    cat(content)
} else {
    cat("Error while receiving data\n")
}
(Sign up for free to get an API token)
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

Try it now (it's free)!

How to use it (YouTube)

Response Example

{
    "type": "IPOs",
    "description": "Historical and upcoming IPOs",
    "from": "2025-01-01",
    "to": "2025-01-31",
    "ipos": [
        {
            "code": "MCW.US",
            "name": "Mister Car Wash, Inc. Common Stock",
            "exchange": "Nasdaq",
            "currency": "USD",
            "start_date": "2025-01-02",
            "filing_date": null,
            "amended_date": null,
            "price_from": 15,
            "price_to": 17,
            "offer_price": 15,
            "shares": 0,
            "deal_type": "Expected"
        }
    ]
}

Response Fields

FieldTypeDescription
codestringTicker in EODHD format
namestring or nullCompany name as filed
exchangestring or nullListing venue, as a name rather than an EODHD exchange code
currencystring or nullOffering currency. Can also be an empty string
start_datedate or nullExpected or effective first trading date. This is the field the window filters on
filing_datedate or nullInitial filing date, where the feed carries it
amended_datedate or nullMost recent amended filing
price_from, price_tonumberIndicated price range. Both are 0 before a range is set — not null
offer_pricenumberFinal price. 0 until the deal prices
sharesnumberShares offered. 0 when unknown
deal_typestringWhere the deal stands. Four values appear: Expected, Priced, Amended and Filed — over 2024 the split was 1,180 / 426 / 102 / 13

Treat 0 as “not known yet” rather than as a real price, and re-read a window you have already stored: filings get amended, and both the date and the price range can change before the first trade.

Splits

https://eodhd.com/api/calendar/splits?symbols=TSLA.US&from=2010-01-01&to=2030-01-01&api_token=YOUR_API_TOKEN&fmt=json

Splits and reverse splits by effective date, as a share-count ratio. Announced splits run well ahead of today — in August 2026 the calendar already held effective dates into February 2027.

Parameters

api_token string required
Your EODHD API token
from date optional
Start of the window, YYYY-MM-DD, matched against the effective split date (Default: today)
to date optional
End of the window, YYYY-MM-DD (Default: from + 7 days)
symbols string optional
One or more tickers in EODHD format, comma-separated. Narrows the window rather than replacing it — a symbols-only request returns the next seven days for that ticker, which is normally nothing
fmt enum optional
Response format. Allowed values: json, csv (Default: csv)

Request Example

https://eodhd.com/api/calendar/splits?symbols=TSLA.US&from=2010-01-01&to=2030-01-01&api_token={YOUR_API_TOKEN}&fmt=json
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/calendar/splits?symbols=TSLA.US&from=2010-01-01&to=2030-01-01&api_token={YOUR_API_TOKEN}&fmt=json"
(Sign up for free to get an API token)
$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://eodhd.com/api/calendar/splits?symbols=TSLA.US&from=2010-01-01&to=2030-01-01&api_token={YOUR_API_TOKEN}&fmt=json',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'GET',
));

$data = curl_exec($curl);
curl_close($curl);

try {
    $data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
    var_dump($data);
} catch (Exception $e) {
    echo 'Error. '.$e->getMessage();
}
(Sign up for free to get an API token)
import requests

url = f'https://eodhd.com/api/calendar/splits?symbols=TSLA.US&from=2010-01-01&to=2030-01-01&api_token={YOUR_API_TOKEN}&fmt=json'
data = requests.get(url).json()

print(data)
(Sign up for free to get an API token)
library(httr)
library(jsonlite)

url <- 'https://eodhd.com/api/calendar/splits?symbols=TSLA.US&from=2010-01-01&to=2030-01-01&api_token={YOUR_API_TOKEN}&fmt=json'
response <- GET(url)

if (http_type(response) == "application/json") {
    content <- content(response, "text", encoding = "UTF-8")
    cat(content)
} else {
    cat("Error while receiving data\n")
}
(Sign up for free to get an API token)
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

Try it now (it's free)!

How to use it (YouTube)

Response Example

{
    "type": "Splits",
    "description": "Historical and upcoming splits",
    "from": "2010-01-01",
    "to": "2030-01-01",
    "symbols": "TSLA.US",
    "splits": [
        {
            "code": "TSLA.US",
            "split_date": "2020-08-31",
            "optionable": "N",
            "old_shares": 1,
            "new_shares": 5
        },
        {
            "code": "TSLA.US",
            "split_date": "2022-08-25",
            "optionable": "N",
            "old_shares": 1,
            "new_shares": 3
        }
    ]
}

Response Fields

FieldTypeDescription
codestringTicker in EODHD format
split_datedateEffective date of the split — the date the window filters on
optionablestringY or N, whether options trade on the name
old_sharesnumberShares held before the split
new_sharesnumberShares held after it

Read the two counts as a ratio in the direction old to new. Tesla’s 2020 event is 1 to 5 — a five-for-one split — while a reverse split arrives the other way round, as in the 10 to 1 on Korean listing 090150.KQ. Reverse splits are not rare: 36 of the 97 events in one August 2026 week ran that way, so branch on which number is larger instead of assuming a forward split. Ratios are not always tidy either — 1000 to 729 turns up on Taiwanese names — and a record can carry new_shares 0, which will divide by zero if you let it.

Dividend dates

https://eodhd.com/api/calendar/dividends?filter[symbol]=AAPL.US&api_token=YOUR_API_TOKEN&fmt=json

This one is built differently from its four siblings: filters are nested under filter, paging under page, and the payload is deliberately thin — a date and a symbol, nothing else. It answers “when”, not “how much”, and it goes back a long way: Apple returns 92 dividend dates starting on 1987-05-11.

For amounts, currencies, declaration and payment dates, use the Corporate Actions: Splits and Dividends API. This endpoint answers the narrower question — which symbols have a dividend on a given day — in one call, so you know what to fetch in detail. Future dates are covered as well as past ones: 347 symbols already carried a date on 2026-09-15.

Parameters

api_token string required
Your EODHD API token
filter[symbol] string optional
A single ticker in EODHD format. Either this or filter[date_eq] must be present, otherwise the request returns HTTP 422
filter[date_eq] date optional
One exact dividend date, YYYY-MM-DD — every symbol going ex-dividend that day. Required when filter[symbol] is absent
filter[date_from] date optional
Lower bound, inclusive. Only meaningful alongside filter[symbol]
filter[date_to] date optional
Upper bound, inclusive. Only meaningful alongside filter[symbol]
page[limit] integer optional
Records per page. Must be at least 1; values above the default are accepted rather than clamped, so 1001 comes back as 1001 (Default: 1000)
page[offset] integer optional
How many records to skip. Follow links.next instead of computing it yourself (Default: 0)
fmt enum optional
Ignored — this endpoint always answers in JSON, including when you ask for CSV (Default: json)

Request Example

https://eodhd.com/api/calendar/dividends?filter[symbol]=AAPL.US&filter[date_from]=2025-01-01&filter[date_to]=2025-12-31&api_token={YOUR_API_TOKEN}&fmt=json
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/calendar/dividends?filter[symbol]=AAPL.US&filter[date_from]=2025-01-01&filter[date_to]=2025-12-31&api_token={YOUR_API_TOKEN}&fmt=json"
(Sign up for free to get an API token)
$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://eodhd.com/api/calendar/dividends?filter[symbol]=AAPL.US&filter[date_from]=2025-01-01&filter[date_to]=2025-12-31&api_token={YOUR_API_TOKEN}&fmt=json',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'GET',
));

$data = curl_exec($curl);
curl_close($curl);

try {
    $data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
    var_dump($data);
} catch (Exception $e) {
    echo 'Error. '.$e->getMessage();
}
(Sign up for free to get an API token)
import requests

url = f'https://eodhd.com/api/calendar/dividends?filter[symbol]=AAPL.US&filter[date_from]=2025-01-01&filter[date_to]=2025-12-31&api_token={YOUR_API_TOKEN}&fmt=json'
data = requests.get(url).json()

print(data)
(Sign up for free to get an API token)
library(httr)
library(jsonlite)

url <- 'https://eodhd.com/api/calendar/dividends?filter[symbol]=AAPL.US&filter[date_from]=2025-01-01&filter[date_to]=2025-12-31&api_token={YOUR_API_TOKEN}&fmt=json'
response <- GET(url)

if (http_type(response) == "application/json") {
    content <- content(response, "text", encoding = "UTF-8")
    cat(content)
} else {
    cat("Error while receiving data\n")
}
(Sign up for free to get an API token)
New to coding? Our ChatGPT assistant can generate code in any language tailored to our API. Simply describe how you want to use our data, and get a working piece of code. Don’t forget to replace the API token with your own.

Try it now (it's free)!

How to use it (YouTube)

Response Example

{
    "meta": {
        "total": 4,
        "offset": 0,
        "limit": 1000,
        "symbol": "AAPL.US",
        "date_from": "2025-01-01",
        "date_to": "2025-12-31"
    },
    "data": [
        { "date": "2025-11-10", "symbol": "AAPL.US" },
        { "date": "2025-08-11", "symbol": "AAPL.US" },
        { "date": "2025-05-12", "symbol": "AAPL.US" },
        { "date": "2025-02-10", "symbol": "AAPL.US" }
    ],
    "links": {
        "next": null
    }
}

Response Fields

FieldTypeDescription
meta.totalintegerMatching records across all pages, not just this one
meta.limit, meta.offsetintegerThe paging you asked for, echoed back
metaobjectAlso echoes the filters you passed — only the ones you actually sent appear as keys
data[].datedateDividend date
data[].symbolstringTicker in EODHD format
links.nextstring or nullReady-made URL for the next page, null on the last one

Newest dates come first here, the opposite of the date-window endpoints. A ticker that does not exist is not an error either — you get HTTP 200 with total 0, whereas the other four endpoints answer an unknown symbol with a 404 whose body mentions a missing “type”. Both mean the same thing in practice: nothing matched.

Where to go next

The calendar tells you when something happens; three other feeds tell you what it did to the numbers. Dividend and split amounts, with declaration and payment dates, live in the Corporate Actions: Splits and Dividends API, and the whole market for one day at a time in the Bulk API. Reported financials behind an earnings date are in the Fundamental Data API, and prices around the event in the End-of-Day API.

To resolve a ticker before you query, use the Search API; to see how requests are counted against your plan, see API Limits. Headlines around the same events come from the Financial News API, which ships in the same standalone package as this calendar.

Compare plans and find your fit
Free and paid plans for individual and commercial use
Go to Pricing
Chat