Options Data for US Stocks: End-of-Day and Historical Learn more

Financial News Feed and Stock News Sentiment data API

The Financial News API aggregates financial news from major sources and adds in-house sentiment analysis. It continuously processes the leading financial news portals, giving you constantly updated articles and daily sentiment scores for stocks, ETFs, Forex, and cryptocurrencies, based on positive and negative mentions.

This page documents three related endpoints: the Financial News feed, the Sentiment Data API, and the News Word Weights API. All three are authenticated with your api_token and return JSON.

Financial News API

Test Drive with "DEMO" Key
  1. You can start with "DEMO" API key to test the data for a few tickers only: AAPL.US, TSLA.US, VTI.US, AMZN.US, BTC-USD.CC and EURUSD.FOREX. For these tickers, all of our types of data (APIs), including Real-Time Data, are available without limitations.
  2. Register for the free plan to receive your API key (limited to 20 API calls per day) with access to End-Of-Day Historical Stock Market Data API for any ticker, but within the past year only. Plus a List of tickers per Exchange is available.
  3. We recommend to explore our plans, starting from $19.99, to access the necessary type of data without limitations.

Returns financial news articles for a given ticker or topic tag, updated in real time. Filter by ticker with the s parameter or by topic with the t parameter. If both are omitted, the endpoint returns the latest general news feed. Results support date filtering and pagination.

GET https://eodhd.com/api/news

Parameters

api_token string required
Your EODHD API token
s string optional
Ticker code to filter news, for example AAPL.US. Provide s or t; if both are omitted the latest general feed is returned
t string optional
Topic tag to filter news, for example technology. Provide s or t
from date optional
Start date in YYYY-MM-DD format, inclusive
to date optional
End date in YYYY-MM-DD format, inclusive
limit integer optional
Number of articles to return (Default: 50, Range: 1-1000)
offset integer optional
Number of articles to skip, for pagination (Default: 0)

Request Example

https://eodhd.com/api/news?s=AAPL.US&offset=0&limit=10&api_token=your_api_token
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/news?s=AAPL.US&offset=0&limit=10&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/news?s=AAPL.US&offset=0&limit=10&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/news?s=AAPL.US&offset=0&limit=10&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/news?s=AAPL.US&offset=0&limit=10&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

[
  {
    "date": "2026-07-15T10:37:18+00:00",
    "title": "Alibaba shares jump as China clears Apple's Qwen-powered AI system",
    "content": "Investing.com -- Shares of Alibaba Group in the U.S. rose around 5% in premarket trading ...",
    "link": "https://finance.yahoo.com/technology/ai/articles/alibaba-shares-jump-china-clears-103718143.html",
    "symbols": ["2RR.F", "9988.HK", "AAPL.US"],
    "tags": ["ARTIFICIAL-INTELLIGENCE", "CHINA-MARKET", "REGULATION", "TECH"],
    "sentiment": { "polarity": 0.987, "neg": 0.007, "neu": 0.89, "pos": 0.103 }
  }
]

Response Fields

FieldTypeDescription
datestringPublication date and time of the article, ISO 8601
titlestringHeadline of the article
contentstringFull article body
linkstringDirect URL to the original article
symbolsarrayTicker symbols mentioned in the article
tagsarrayTopic tags assigned to the article, may be empty
sentimentobjectSentiment scores: polarity, neg, neu, pos

News Tags

Besides a standard list of 50 tags, the feed adds AI-detected tags, so you can query by almost any topic related to your area of interest, for example artificial intelligence, mergers and acquisitions, or agritech. Query tags with the t parameter.

Standard tags — 50 supported topic values

balance sheet, capital employed, class action, company announcement, consensus eps estimate, consensus estimate, credit rating, discounted cash flow, dividend payments, earnings estimate, earnings growth, earnings per share, earnings release, earnings report, earnings results, earnings surprise, estimate revisions, european regulatory news, financial results, fourth quarter, free cash flow, future cash flows, growth rate, initial public offering, insider ownership, insider transactions, institutional investors, institutional ownership, intrinsic value, market research reports, net income, operating income, present value, press releases, price target, quarterly earnings, quarterly results, ratings, research analysis and reports, return on equity, revenue estimates, revenue growth, roce, roe, share price, shareholder rights, shareholder, shares outstanding, split, strong buy, total revenue, zacks investment research, zacks rank

Sign up & Get Data

Sentiment Data API

Returns daily aggregated sentiment scores for one or more instruments (stocks, ETFs, Forex, crypto), calculated from news and social media and normalized from -1 (very negative) to 1 (very positive). Pass one or several comma-separated tickers.

GET https://eodhd.com/api/sentiments

Parameters

api_token string required
Your EODHD API token
s string required
One or more comma-separated tickers, for example AAPL.US,BTC-USD.CC
from date optional
Start date in YYYY-MM-DD format, inclusive
to date optional
End date in YYYY-MM-DD format, inclusive

Request Example

https://eodhd.com/api/sentiments?s=btc-usd.cc,aapl.us&from=2026-06-01&to=2026-06-30&api_token=your_api_token
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/sentiments?s=btc-usd.cc,aapl.us&from=2026-06-01&to=2026-06-30&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/sentiments?s=btc-usd.cc,aapl.us&from=2026-06-01&to=2026-06-30&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/sentiments?s=btc-usd.cc,aapl.us&from=2026-06-01&to=2026-06-30&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/sentiments?s=btc-usd.cc,aapl.us&from=2026-06-01&to=2026-06-30&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

{
  "AAPL.US": [
    { "date": "2026-07-15", "count": 10, "normalized": 0.6829 },
    { "date": "2026-07-14", "count": 64, "normalized": 0.7071 },
    { "date": "2026-07-13", "count": 64, "normalized": 0.6146 }
  ]
}

Response Fields

Sentiment data is grouped by ticker symbol. Each daily entry contains:

FieldTypeDescription
datestringAggregation date, YYYY-MM-DD
countintegerNumber of articles used for sentiment on that day
normalizednumberSentiment score from -1 (very negative) to 1 (very positive)

News Word Weights API

Returns a weighted list of the most relevant words in news articles about a given ticker over a date range. Each word is scored by frequency and significance across the processed articles, which is useful for trend analysis, NLP input, and thematic clustering.

This endpoint uses AI to process hundreds or thousands of articles, so responses can take longer. If a request times out, narrow the date range to reduce the volume of data processed.

GET https://eodhd.com/api/news-word-weights

Parameters

api_token string required
Your EODHD API token
s string required
Ticker to analyze, for example AAPL.US
filter[date_from] date optional
Start date in YYYY-MM-DD format, inclusive
filter[date_to] date optional
End date in YYYY-MM-DD format, inclusive
page[limit] integer optional
Number of top-weighted words to return

Request Example

https://eodhd.com/api/news-word-weights?s=AAPL.US&filter[date_from]=2026-06-01&filter[date_to]=2026-06-15&page[limit]=10&api_token=your_api_token
(Sign up for free to get an API token)
curl --location "https://eodhd.com/api/news-word-weights?s=AAPL.US&filter[date_from]=2026-06-01&filter[date_to]=2026-06-15&page[limit]=10&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/news-word-weights?s=AAPL.US&filter[date_from]=2026-06-01&filter[date_to]=2026-06-15&page[limit]=10&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/news-word-weights?s=AAPL.US&filter[date_from]=2026-06-01&filter[date_to]=2026-06-15&page[limit]=10&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/news-word-weights?s=AAPL.US&filter[date_from]=2026-06-01&filter[date_to]=2026-06-15&page[limit]=10&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

{
  "data": {
    "stock": 0.02227,
    "apple": 0.01224,
    "companies": 0.01029,
    "year": 0.0097,
    "market": 0.00945
  },
  "meta": {
    "news_processed": 300,
    "news_found": 4126
  },
  "links": {
    "next": null
  }
}

Response Fields

FieldTypeDescription
dataobjectKeywords with their corresponding weights, as key-value pairs
meta.news_foundintegerTotal number of articles matched
meta.news_processedintegerNumber of articles actually processed
links.nextstring or nullURL to the next page of results, if available
Compare plans and find your fit
Free and paid plans for individual and commercial use
Go to Pricing
Chat