{"id":7147,"date":"2023-10-17T14:10:16","date_gmt":"2023-10-17T14:10:16","guid":{"rendered":"https:\/\/eodhd.com\/financial-academy\/?p=7147"},"modified":"2026-11-05T14:14:35","modified_gmt":"2026-11-05T14:14:35","slug":"how-to-check-financial-news-with-python-financial-library","status":"publish","type":"post","link":"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library","title":{"rendered":"Financial News API in Python: Filter, Clean and Score Stock News"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The EODHD Financial News API returns news articles for any ticker or topic, with the full text, the symbols each article mentions, topic tags and a sentiment score. Two related endpoints add daily sentiment per ticker and the most weighted words in a ticker&#8217;s coverage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide shows how to use the financial news API from Python: filtering by ticker, topic and date, paging through a period without duplicates, turning the results into a clean pandas table, and comparing article sentiment with daily sentiment. At the end, everything comes together in a script that builds a seven-day news digest for one company.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I ran every example on November 3, 2026. For Apple, the week of October 27 to November 2 returned 263 articles. After removing duplicates, 255 remained, and 112 of those named Apple or AAPL in the headline.<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><a class=\"maxbutton-1 maxbutton maxbutton-subscribe-to-api external-css btn\" target=\"_blank\" rel=\"noopener\" href=\"https:\/\/eodhd.com\/register\"><span class='mb-text'>Register &amp; Get Data<\/span><\/a><\/p>\n\n\n\n\n\n\n<h2 id=\"h-how-to-get-your-eodhd-api-key\" class=\"wp-block-heading\">How to get your EODHD API key<\/h2>\n\n\n\n<p class=\"bordered_paragraph wp-block-paragraph\">1. Use the \u201cdemo\u201d API key to test our data from a limited set of tickers without registering:<br>AAPL.US | TSLA.US | VTI.US | AMZN.US | BTC-USD | EUR-USD<br>Real-Time Data and all of the APIs (except Bulk) are included without API calls limitations with these tickers and the demo key.<br>2. Register to get your free API key (limited to 20 API calls per day) with access to:<br>End-Of-Day Historical Data with only the past year for any ticker, and the List of tickers per Exchange.<br>3. To unlock your API key, we recommend to choose the <a href=\"https:\/\/eodhd.com\/pricing\" target=\"_blank\" rel=\"noreferrer noopener\">subscription plan<\/a> which covers your needs.<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><a class=\"maxbutton-1 maxbutton maxbutton-subscribe-to-api external-css btn\" target=\"_blank\" rel=\"noopener\" href=\"https:\/\/eodhd.com\/register\"><span class='mb-text'>Register &amp; Get Data<\/span><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the news endpoints specifically, the demo key covers ticker queries, daily sentiment and word weights for the demo tickers. Queries by topic alone (the t parameter without s) need your own key. News, sentiment and word weights are included in every plan, the free one too, and each news request costs 5 API calls.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The scripts below read the key from an environment variable and fall back to the demo key:<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">import os<br><br>API_KEY = os.environ.get(\"EODHD_API_KEY\", \"demo\")<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<h2 id=\"h-financial-news-api-quick-start-with-the-python-library\" class=\"wp-block-heading\">Financial news API quick start with the Python library<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The official Python library wraps the news endpoint in one method. Install it with <a href=\"https:\/\/pypi.org\/project\/eodhd\/\" target=\"_blank\" rel=\"noreferrer noopener\">pip install eodhd<\/a> (version 1.0.32 at the time of writing):<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">import pandas as pd<br>from eodhd import APIClient<br><br>api = APIClient(\"demo\")  # replace with your API key<br>news = api.financial_news(s=\"AAPL.US\", from_date=\"2026-10-27\", to_date=\"2026-11-02\", limit=5)<br>df = pd.DataFrame(news)[[\"date\", \"title\"]]<br>print(df.to_string())<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<p class=\"wp-block-paragraph\">The first rows of the output:<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">                        date                                                                          title<br>0  2026-11-02T23:34:07+00:00  Apple beats sales and profit expectations but AI costs weigh on holiday sales<br>1  2026-11-02T23:25:32+00:00     Apple says it\u2019s \u2018hard to predict\u2019 when iPhone Duo constraints will improve<br>2  2026-11-02T23:17:54+00:00                      The Reaction to Apple Earnings Reveals a Sensitive Market<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<p class=\"wp-block-paragraph\">The method accepts s, t, from_date, to_date, limit and offset. For the direction parameter and the word weights endpoint, which the library doesn&#8217;t cover, the rest of this guide calls the API directly with requests.<\/p>\n\n\n\n<h2 id=\"h-filtering-the-financial-news-api-by-ticker-topic-and-date\" class=\"wp-block-heading\">Filtering the financial news API by ticker, topic and date<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">All requests go to https:\/\/eodhd.com\/api\/news. These are the parameters:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Parameter<\/th><th>What it does<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>s<\/td><td>Ticker, for example AAPL.US<\/td><td>Use s, t or both<\/td><\/tr><tr><td>t<\/td><td>Topic tag, for example earnings release<\/td><td>Matching is case-insensitive<\/td><\/tr><tr><td>from, to<\/td><td>Date range, YYYY-MM-DD, inclusive<\/td><td><\/td><\/tr><tr><td>limit<\/td><td>Articles per request<\/td><td>Default 50, range 1-1000<\/td><\/tr><tr><td>offset<\/td><td>Articles to skip<\/td><td>offset + limit up to 10,000<\/td><\/tr><tr><td>direction<\/td><td>0 newest first (default), 1 in database order<\/td><td>With 1, from and to are required, window up to 31 days<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In addition, each article comes back with date, title, content, link, symbols, tags and sentiment (polarity, neg, neu, pos).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Filtering by topic returns news across all companies. Here are ten articles tagged earnings release on November 2, 2026:<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">import os<br>import requests<br>import pandas as pd<br><br>API_KEY = os.environ.get(\"EODHD_API_KEY\", \"demo\")<br>params = {\"t\": \"earnings release\", \"from\": \"2026-11-02\", \"to\": \"2026-11-02\",<br>          \"limit\": 10, \"api_token\": API_KEY, \"fmt\": \"json\"}<br>news = requests.get(\"https:\/\/eodhd.com\/api\/news\", params=params, timeout=60).json()<br>df = pd.DataFrame(news)<br>df[\"us_tickers\"] = df[\"symbols\"].apply(lambda s: \", \".join(x for x in s if x.endswith(\".US\"))[:30])<br>print(df[[\"date\", \"title\", \"us_tickers\"]].assign(title=df[\"title\"].str[:60], date=df[\"date\"].str[11:16]).to_string(index=False))<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\"> date                                                        title                     us_tickers<br>23:10           Voya Financial (VOYA) Misses Q3 Earnings Estimates    RGA.US, VOYA-PB.US, VOYA.US<br>23:10 Tetra Technologies (TTI) Q3 Earnings and Revenues Beat Estim                KNTK.US, TTI.US<br>23:10                          Vornado (VNO) Tops Q3 FFO Estimates CLPR.US, VNO-PL.US, VNO-PM.US,<br>23:10                   UMH Properties (UMH) Q3 FFO Meet Estimates                 BRT.US, UMH.US<br>23:10 Inspire Medical Systems (INSP) Q3 Earnings and Revenues Beat               AMWL.US, INSP.US<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<p class=\"wp-block-paragraph\">Passing s and t together narrows the feed to one company and one topic. With s=AAPL.US and t=earnings release, all 100 articles in my sample carried the EARNINGS RELEASE tag and listed AAPL.US.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also, tags come in two kinds. There is a standard list (at the end of this guide), and the feed also adds AI-detected tags, so results carry values beyond that list, such as ARTIFICIAL-INTELLIGENCE, PRODUCT-LAUNCH or SUPPLY-CHAIN. Tags are returned in upper case. To find the exact spelling of a tag before you filter on it, pull a few articles for a ticker and look at their tags field.<\/p>\n\n\n\n<h2 id=\"h-paging-through-the-financial-news-api-without-duplicates\" class=\"wp-block-heading\">Paging through the financial news API without duplicates<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">With the default order (newest first), new articles arriving while you page can shift results between pages. For a complete pull of a past period, set direction=1 with from and to, then raise offset by limit on every request. Articles then come in the order they entered the database:<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">BASE = \"https:\/\/eodhd.com\/api\"<br><br>def fetch_news(ticker, date_from, date_to, page_size=100):<br>    \"\"\"Page forward through a period (max 31 days) without duplicates.\"\"\"<br>    articles, offset = [], 0<br>    while True:<br>        params = {<br>            \"s\": ticker, \"from\": date_from, \"to\": date_to,<br>            \"direction\": 1, \"limit\": page_size, \"offset\": offset,<br>            \"api_token\": API_KEY, \"fmt\": \"json\",<br>        }<br>        resp = requests.get(f\"{BASE}\/news\", params=params, timeout=60)<br>        resp.raise_for_status()<br>        page = resp.json()<br>        articles.extend(page)<br>        if len(page) &lt; page_size:<br>            return articles<br>        offset += page_size<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<p class=\"wp-block-paragraph\">For AAPL.US between October 27 and November 2, 2026, this took three requests and returned 263 articles. For longer periods, however, split the range into windows of up to 31 days. If a request has an invalid combination of parameters, the API answers with HTTP 422 and names the parameter, for example &#8220;The window between from and to must not exceed 31 days when direction=1.&#8221;<\/p>\n\n\n\n<h2 id=\"h-turning-news-into-a-clean-pandas-table\" class=\"wp-block-heading\">Turning news into a clean pandas table<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Three steps make the raw list usable: keep the fields you need, pull the polarity score out of the sentiment object, and remove duplicates. The same story often appears more than once, from different feeds or with a different link, so the second pass compares normalised titles:<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">def to_table(articles):<br>    df = pd.DataFrame(articles)<br>    df[\"date\"] = pd.to_datetime(df[\"date\"], utc=True)<br>    df[\"polarity\"] = df[\"sentiment\"].apply(lambda s: (s or {}).get(\"polarity\"))<br>    df[\"n_symbols\"] = df[\"symbols\"].apply(len)<br>    return df[[\"date\", \"title\", \"link\", \"symbols\", \"n_symbols\", \"tags\", \"polarity\"]]<br><br><br>def deduplicate(df):<br>    before = len(df)<br>    df = df.drop_duplicates(subset=\"link\")<br>    key = df[\"title\"].str.lower().str.replace(r\"[^a-z0-9 ]\", \"\", regex=True).str.strip()<br>    df = df.loc[~key.duplicated()]<br>    return df, before - len(df)<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<p class=\"wp-block-paragraph\">On the Apple week, deduplication removed 8 of the 263 articles. The n_symbols column matters more than it looks. An article returned for AAPL.US can be about Apple, or it can mention Apple among dozens of companies. In this sample the median article listed 15 symbols (this count includes Apple&#8217;s own listings on other exchanges, such as AAPL.MX and APC.F), and 32 articles listed exactly 50 (none listed more).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, a simple way to separate the two is to check whether the company or its ticker appears in the headline:<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">pattern = r\"\\b(?:Apple|AAPL)\\b\"<br>df[\"in_headline\"] = df[\"title\"].str.contains(pattern, case=False, regex=True)<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">                       date                                                              title  n_symbols  polarity  in_headline<br>2026-10-27 05:12:39+00:00 Apple responds to early screen flaws on $1,999 foldable iPhone Duo          2    -0.961         True<br>2026-10-27 07:00:00+00:00  Bull of the Day: Taiwan Semiconductor Manufacturing Company (TSM)         28     0.998        False<br>2026-10-27 09:11:06+00:00 Bending Spoons proposes $1.5B senior secured notes offering due 2032          3     0.896        False<br>2026-10-27 11:21:36+00:00             Apple customers say their folding iPhones are cracking         11    -0.945         True<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<p class=\"wp-block-paragraph\">112 of the 255 articles named Apple or AAPL in the headline. The other 143 are still useful for context, for example sector or supplier news, but they shouldn&#8217;t weigh as much in a company digest. Finally, exporting is one line; join the list columns first so they read well in a spreadsheet:<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">export = df.copy()<br>export[\"symbols\"] = export[\"symbols\"].str.join(\" \")<br>export[\"tags\"] = export[\"tags\"].str.join(\" \")<br>export.to_csv(\"aapl_news.csv\", index=False)<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<h2 id=\"h-article-sentiment-vs-daily-sentiment\" class=\"wp-block-heading\">Article sentiment vs daily sentiment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each article has a polarity score from -1 (negative) to 1 (positive). The Sentiment Data API at https:\/\/eodhd.com\/api\/sentiments returns one aggregated score per ticker and day, together with the number of articles behind it:<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">def fetch_daily_sentiment(ticker, date_from, date_to):<br>    params = {\"s\": ticker, \"from\": date_from, \"to\": date_to,<br>              \"api_token\": API_KEY, \"fmt\": \"json\"}<br>    resp = requests.get(f\"{BASE}\/sentiments\", params=params, timeout=60)<br>    resp.raise_for_status()<br>    rows = resp.json().get(ticker, [])<br>    return pd.DataFrame(rows).rename(columns={\"count\": \"api_count\", \"normalized\": \"api_sentiment\"})<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<p class=\"wp-block-paragraph\">To see how the two relate, I averaged the article polarity per day (after deduplication) and put it next to the daily score:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Day<\/th><th>Articles (deduplicated)<\/th><th>Average article polarity<\/th><th>Daily sentiment API<\/th><th>Articles counted by the API<\/th><\/tr><\/thead><tbody><tr><td>2026-10-27<\/td><td>30<\/td><td>0.733<\/td><td>0.7335<\/td><td>30<\/td><\/tr><tr><td>2026-10-28<\/td><td>30<\/td><td>0.673<\/td><td>0.6837<\/td><td>31<\/td><\/tr><tr><td>2026-10-29<\/td><td>10<\/td><td>0.658<\/td><td>0.6889<\/td><td>11<\/td><\/tr><tr><td>2026-10-30<\/td><td>29<\/td><td>0.484<\/td><td>0.5142<\/td><td>31<\/td><\/tr><tr><td>2026-10-31<\/td><td>10<\/td><td>0.892<\/td><td>0.9013<\/td><td>11<\/td><\/tr><tr><td>2026-11-01<\/td><td>14<\/td><td>0.180<\/td><td>0.1799<\/td><td>13<\/td><\/tr><tr><td>2026-11-02<\/td><td>132<\/td><td>0.536<\/td><td>0.5441<\/td><td>135<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The two track each other closely: on every day the scores differ by less than 0.035, and the article counts by three at most. In practice, the daily endpoint is the quick way to chart sentiment over months for one or several tickers in a single request (s accepts a comma-separated list). The article-level score is what you need to explain a day: which stories pulled it up or down, and whether they were about the company at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, take November 1. The daily score fell to 0.18 on 13 articles, and the article table shows which headlines produced that drop.<\/p>\n\n\n\n<h2 id=\"h-which-words-drove-the-coverage\" class=\"wp-block-heading\">Which words drove the coverage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The News Word Weights API at https:\/\/eodhd.com\/api\/news-word-weights returns the most relevant words in a ticker&#8217;s news over a date range. It processes hundreds of articles with AI, so give the request a long timeout:<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">params = {\"s\": \"AAPL.US\", \"filter[date_from]\": \"2026-10-27\", \"filter[date_to]\": \"2026-11-02\",<br>          \"page[limit]\": 15, \"api_token\": API_KEY}<br># The endpoint processes hundreds of articles, so allow a long timeout and retry once<br>for attempt in range(2):<br>    resp = requests.get(\"https:\/\/eodhd.com\/api\/news-word-weights\", params=params, timeout=180)<br>    if resp.ok and resp.text.strip():<br>        break<br>data = resp.json()<br>print(f\"Processed {data['meta']['news_processed']} of {data['meta']['news_found']} articles\")<br>for word, weight in data[\"data\"].items():<br>    print(f\"{word:&lt;10} {weight:.5f}\")<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">Processed 263 of 1677 articles<br>apple      0.01387<br>inc        0.01238<br>stock      0.01015<br>etf        0.00853<br>ai         0.00813<br>market     0.00735<br>billion    0.00700<br>companies  0.00691<br>earn       0.00674<br>report     0.00637<br>year       0.00607<br>share      0.00556<br>m          0.00551<br>revenue    0.00510<br>hold       0.00509<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<p class=\"wp-block-paragraph\">The request took about 30 seconds. For a quick read of what a week&#8217;s coverage was about, filter out generic words (inc, stock, market, companies) and look at what remains: here ai, billion, earn, report and revenue point to an earnings week with an AI angle. If a request takes too long, narrow the date range.<\/p>\n\n\n\n<h2 id=\"h-complete-script-a-seven-day-digest-with-the-financial-news-api\" class=\"wp-block-heading\">Complete script: a seven-day digest with the financial news API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This script puts everything together. It pulls a week of news for one ticker, removes duplicates, flags the articles that name the company in the headline, compares article and daily sentiment, saves a CSV and prints the most positive and most negative headlines about the company.<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">\"\"\"Seven-day news digest for one ticker with the EODHD Financial News API.<br><br>Usage: python news_digest.py AAPL.US Apple 2026-10-27 2026-11-02<br>Reads the key from EODHD_API_KEY; falls back to the demo key.<br>\"\"\"<br>import os<br>import re<br>import sys<br><br>import pandas as pd<br>import requests<br><br>API_KEY = os.environ.get(\"EODHD_API_KEY\", \"demo\")<br>BASE = \"https:\/\/eodhd.com\/api\"<br><br><br>def fetch_news(ticker, date_from, date_to, page_size=100):<br>    \"\"\"Page forward through a period (max 31 days) without duplicates.\"\"\"<br>    articles, offset = [], 0<br>    while True:<br>        params = {<br>            \"s\": ticker, \"from\": date_from, \"to\": date_to,<br>            \"direction\": 1, \"limit\": page_size, \"offset\": offset,<br>            \"api_token\": API_KEY, \"fmt\": \"json\",<br>        }<br>        resp = requests.get(f\"{BASE}\/news\", params=params, timeout=60)<br>        resp.raise_for_status()<br>        page = resp.json()<br>        articles.extend(page)<br>        if len(page) &lt; page_size:<br>            return articles<br>        offset += page_size<br><br><br>def fetch_daily_sentiment(ticker, date_from, date_to):<br>    params = {\"s\": ticker, \"from\": date_from, \"to\": date_to,<br>              \"api_token\": API_KEY, \"fmt\": \"json\"}<br>    resp = requests.get(f\"{BASE}\/sentiments\", params=params, timeout=60)<br>    resp.raise_for_status()<br>    rows = resp.json().get(ticker, [])<br>    return pd.DataFrame(rows).rename(columns={\"count\": \"api_count\", \"normalized\": \"api_sentiment\"})<br><br><br>def to_table(articles):<br>    df = pd.DataFrame(articles)<br>    df[\"date\"] = pd.to_datetime(df[\"date\"], utc=True)<br>    df[\"polarity\"] = df[\"sentiment\"].apply(lambda s: (s or {}).get(\"polarity\"))<br>    df[\"n_symbols\"] = df[\"symbols\"].apply(len)<br>    return df[[\"date\", \"title\", \"link\", \"symbols\", \"n_symbols\", \"tags\", \"polarity\"]]<br><br><br>def deduplicate(df):<br>    before = len(df)<br>    df = df.drop_duplicates(subset=\"link\")<br>    key = df[\"title\"].str.lower().str.replace(r\"[^a-z0-9 ]\", \"\", regex=True).str.strip()<br>    df = df.loc[~key.duplicated()]<br>    return df, before - len(df)<br><br><br>def main(ticker, company, date_from, date_to):<br>    raw = fetch_news(ticker, date_from, date_to)<br>    df = to_table(raw)<br>    df, dropped = deduplicate(df)<br><br>    # Headline relevance: is the company the subject, or one name in a long list?<br>    symbol = ticker.split(\".\")[0]<br>    pattern = rf\"\\b(?:{re.escape(company)}|{re.escape(symbol)})\\b\"<br>    df[\"in_headline\"] = df[\"title\"].str.contains(pattern, case=False, regex=True)<br><br>    df[\"day\"] = df[\"date\"].dt.strftime(\"%Y-%m-%d\")<br>    daily = df.groupby(\"day\").agg(<br>        articles=(\"title\", \"size\"),<br>        in_headline=(\"in_headline\", \"sum\"),<br>        avg_polarity=(\"polarity\", \"mean\"),<br>    ).round(3)<br>    sentiment = fetch_daily_sentiment(ticker, date_from, date_to)<br>    daily = daily.join(sentiment.set_index(\"date\"), how=\"left\")<br><br>    out = f\"{symbol.lower()}_news_{date_from}_{date_to}.csv\"<br>    export = df.copy()<br>    export[\"symbols\"] = export[\"symbols\"].str.join(\" \")<br>    export[\"tags\"] = export[\"tags\"].str.join(\" \")<br>    export.drop(columns=\"day\").to_csv(out, index=False)<br><br>    print(f\"{ticker} news, {date_from} to {date_to}\")<br>    print(f\"Fetched {len(raw)} articles, removed {dropped} duplicates, kept {len(df)}\")<br>    print(f\"{int(df['in_headline'].sum())} of {len(df)} name {company} or {symbol} in the headline\\n\")<br>    print(daily.to_string(), \"\\n\")<br>    print(\"Most positive and most negative headlines naming the company:\")<br>    named = df[df[\"in_headline\"]].dropna(subset=[\"polarity\"]).sort_values(\"polarity\")<br>    for _, row in pd.concat([named.tail(3).iloc[::-1], named.head(3)]).iterrows():<br>        print(f\"  {row['polarity']:+.2f}  {row['day']}  {row['title'][:90]}\")<br>    print(f\"\\nSaved {out}\")<br><br><br>if __name__ == \"__main__\":<br>    main(*sys.argv[1:5])<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<p class=\"wp-block-paragraph\">Run it with python news_digest.py AAPL.US Apple 2026-10-27 2026-11-02. The output:<\/p>\n\n\n\n            <div class=\"code__wrapper\">\n                <div class=\"code__content\">\n                    \n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background\"><code class=\"\">AAPL.US news, 2026-10-27 to 2026-11-02<br>Fetched 263 articles, removed 8 duplicates, kept 255<br>112 of 255 name Apple or AAPL in the headline<br><br>            articles  in_headline  avg_polarity  api_count  api_sentiment<br>day<br>2026-10-27        30           16         0.733         30         0.7335<br>2026-10-28        30           17         0.673         31         0.6837<br>2026-10-29        10            2         0.658         11         0.6889<br>2026-10-30        29           11         0.484         31         0.5142<br>2026-10-31        10            1         0.892         11         0.9013<br>2026-11-01        14            5         0.180         13         0.1799<br>2026-11-02       132           60         0.536        135         0.5441<br><br>Most positive and most negative headlines naming the company:<br>  +1.00  2026-11-02  Apple Sales Meet Estimates, China Is a Weak Spot<br>  +1.00  2026-10-28  Apple unveils groundbreaking MacBook Pro with PROLED XDR Display and Touch for the first t<br>  +1.00  2026-10-27  Apple (AAPL) vs. MSFT and GOOGL: Is the Post-Earnings Selloff Creating a Long-Term Buying<br>  -0.96  2026-10-27  Apple responds to early screen flaws on $1,999 foldable iPhone Duo<br>  -0.94  2026-10-27  Apple customers say their folding iPhones are cracking<br>  -0.72  2026-10-28  Apple in spotlight as Monness, Crespi, Hardt ups price target on new products<br><br>Saved aapl_news_2026-10-27_2026-11-02.csv<\/code><\/pre>\n\n                <\/div>\n                <div class=\"code__btns\">\n                    <button class=\"code__copy\" class=\"copy\" title=\"Copy url\">\n                        <svg class=\"code__copy__icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <use xlink:href=\"\/img\/icons\/copy.svg#copy\"><\/use>\n                        <\/svg>\n                        <img decoding=\"async\" class=\"code__copy__approve\" alt=\"\" src=\"\/img\/approve_ico.svg\" loading=\"eager\">\n                    <\/button>\n                <\/div>\n            <\/div>\n        \n\n\n<p class=\"wp-block-paragraph\">The digest used four requests: three pages of news and one sentiment call. It works with the demo key for the demo tickers; for any other ticker, set EODHD_API_KEY to your own key.<\/p>\n\n\n\n<h2 id=\"h-reading-the-results-with-care\" class=\"wp-block-heading\">Reading the results with care<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A few points help you read a digest like this one correctly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, each score describes an article, not just its headline. When a score drives a decision, read the article behind it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Second, relevance needs a filter of its own. A ticker query returns every article that mentions the ticker. For a company digest, the in_headline flag (or a minimum share of mentions in the content) separates news about the company from news that only mentions it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Third, volume moves with events. November 2 had 132 articles, more than four times any other day of the week, as coverage of Apple&#8217;s quarterly results arrived (headlines such as &#8220;Apple: Fiscal Q4 Earnings Snapshot&#8221;). A daily average over 10 articles and one over 132 articles carry different weight, so keep the article count next to the score.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, sentiment describes the tone of the coverage. It is a useful input for monitoring and research, not a trading signal on its own.<\/p>\n\n\n\n<h2 id=\"h-standard-news-tags\" class=\"wp-block-heading\">Standard news tags<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Besides the AI-detected tags, the API supports this standard list of topic values for the t parameter:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For more detail on every parameter and field, see the <a href=\"https:\/\/eodhd.com\/financial-apis\/stock-market-financial-news-api\" target=\"_blank\" rel=\"noreferrer noopener\">Financial News API documentation<\/a>. To measure how news moves prices, continue with <a href=\"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/analyzing-news-impact-on-stocks-with-python\" target=\"_blank\" rel=\"noreferrer noopener\">Analyzing News Impact on Stocks with Python<\/a>.<\/p>\n\n\n\n<h2 id=\"h-conclusion\" class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The EODHD Financial News API covers the full path from raw headlines to a usable dataset: ticker and topic filters, a paging mode that avoids duplicates, sentiment per article and per day, and word weights for a quick view of what the coverage was about. With about a hundred lines of Python you get a weekly digest that you can run for any ticker, extend to a watchlist, or feed into your own analysis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, try the demo key on AAPL, TSLA or AMZN, then switch to your own key for any other ticker or for topic queries.<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><a class=\"maxbutton-1 maxbutton maxbutton-subscribe-to-api external-css btn\" target=\"_blank\" rel=\"noopener\" href=\"https:\/\/eodhd.com\/register\"><span class='mb-text'>Register &amp; Get Data<\/span><\/a><\/p>\n\n\n\n<h2 id=\"h-faqs\" class=\"wp-block-heading\">FAQs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Q: Is there a free financial news API?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. News, sentiment and word weights are included in every EODHD plan, including the free one. Each news request costs 5 API calls, so the free plan&#8217;s 20 daily calls cover four news requests. The demo key works without registration for AAPL.US, TSLA.US, VTI.US, AMZN.US, BTC-USD and EUR-USD.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Q: How do I get stock news for a specific ticker in Python?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Call https:\/\/eodhd.com\/api\/news with s set to the ticker in TICKER.EXCHANGE format (for example AAPL.US), or use api.financial_news(s=&#8221;AAPL.US&#8221;) from the eodhd Python library. Add from and to to limit the dates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Q: How do I get more than 1,000 articles?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use offset to page through results. The sum of offset and limit can go up to 10,000. For a complete pull of a period, set direction=1 with from and to (up to 31 days) and raise offset by limit on each request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Q: What does the news sentiment score mean?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each article has a polarity from -1 (negative) to 1 (positive), plus the neg, neu and pos components. The Sentiment Data API returns one normalized score per ticker and day on the same scale, with the number of articles used.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Q: Can I filter news by topic instead of ticker?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Use the t parameter with a standard tag such as earnings release or an AI-detected tag such as ARTIFICIAL-INTELLIGENCE. Topic queries without a ticker need your own API key.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The EODHD Financial News API returns news articles for any ticker or topic, with the full text, the symbols each article mentions, topic tags and a sentiment score. Two related endpoints add daily sentiment per ticker and the most weighted words in a ticker&#8217;s coverage. This guide shows how to use the financial news API [&hellip;]<\/p>\n","protected":false},"author":36,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[42],"tags":[],"coding-language":[],"ready-to-go-solution":[],"qualification":[],"financial-apis-category":[],"financial-apis-manuals":[],"class_list":["post-7147","post","type-post","status-publish","format-standard","hentry","category-stocks-data-analysis-examples"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.9 (Yoast SEO v26.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Financial News API in Python: Filter, Clean and Score News<\/title>\n<meta name=\"description\" content=\"Use the EODHD financial news API in Python: filter stock news by ticker, topic and date, add sentiment and build a seven-day news digest.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Financial News API in Python: Filter, Clean and Score Stock News\" \/>\n<meta property=\"og:description\" content=\"Use the EODHD financial news API in Python: filter stock news by ticker, topic and date, add sentiment and build a seven-day news digest.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library\" \/>\n<meta property=\"og:site_name\" content=\"Financial Academy\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/eodhistoricaldata\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-17T14:10:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-05T14:14:35+00:00\" \/>\n<meta name=\"author\" content=\"Kevin Meneses Gonz\u00e1lez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@EOD_data\" \/>\n<meta name=\"twitter:site\" content=\"@EOD_data\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kevin Meneses Gonz\u00e1lez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library#article\",\"isPartOf\":{\"@id\":\"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library\"},\"author\":{\"name\":\"Kevin Meneses Gonz\u00e1lez\",\"@id\":\"https:\/\/eodhd.com\/financial-academy\/#\/schema\/person\/f085666760ee7f148d1923a296cf3fe3\"},\"headline\":\"Financial News API in Python: Filter, Clean and Score Stock News\",\"datePublished\":\"2023-10-17T14:10:16+00:00\",\"dateModified\":\"2026-11-05T14:14:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library\"},\"wordCount\":2024,\"publisher\":{\"@id\":\"https:\/\/eodhd.com\/financial-academy\/#organization\"},\"articleSection\":[\"Stocks Data Analysis Examples\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library\",\"url\":\"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library\",\"name\":\"Financial News API in Python: Filter, Clean and Score News\",\"isPartOf\":{\"@id\":\"https:\/\/eodhd.com\/financial-academy\/#website\"},\"datePublished\":\"2023-10-17T14:10:16+00:00\",\"dateModified\":\"2026-11-05T14:14:35+00:00\",\"description\":\"Use the EODHD financial news API in Python: filter stock news by ticker, topic and date, add sentiment and build a seven-day news digest.\",\"breadcrumb\":{\"@id\":\"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/eodhd.com\/financial-academy\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Financial News API in Python: Filter, Clean and Score Stock News\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/eodhd.com\/financial-academy\/#website\",\"url\":\"https:\/\/eodhd.com\/financial-academy\/\",\"name\":\"Financial APIs Academy | EODHD\",\"description\":\"Financial Stock Market Academy\",\"publisher\":{\"@id\":\"https:\/\/eodhd.com\/financial-academy\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/eodhd.com\/financial-academy\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/eodhd.com\/financial-academy\/#organization\",\"name\":\"EODHD (EOD Historical Data)\",\"url\":\"https:\/\/eodhd.com\/financial-academy\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/eodhd.com\/financial-academy\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/eodhd.com\/financial-academy\/wp-content\/uploads\/2023\/12\/EODHD-Logo.png\",\"contentUrl\":\"https:\/\/eodhd.com\/financial-academy\/wp-content\/uploads\/2023\/12\/EODHD-Logo.png\",\"width\":159,\"height\":82,\"caption\":\"EODHD (EOD Historical Data)\"},\"image\":{\"@id\":\"https:\/\/eodhd.com\/financial-academy\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/eodhistoricaldata\",\"https:\/\/x.com\/EOD_data\",\"https:\/\/www.reddit.com\/r\/EODHistoricalData\/\",\"https:\/\/eod-historical-data.medium.com\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/eodhd.com\/financial-academy\/#\/schema\/person\/f085666760ee7f148d1923a296cf3fe3\",\"name\":\"Kevin Meneses Gonz\u00e1lez\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/eodhd.com\/financial-academy\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/19dee2010941996b1cce342ad66f6964baa6eac898570992e3cddc1b00143a79?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/19dee2010941996b1cce342ad66f6964baa6eac898570992e3cddc1b00143a79?s=96&d=mm&r=g\",\"caption\":\"Kevin Meneses Gonz\u00e1lez\"},\"description\":\"Kevin Meneses Gonz\u00e1lez is a CRM consultant and technical content creator focused on Python, AI, and financial data. He writes practical tutorials on using APIs and automation to analyze markets and build investment research tools.\",\"sameAs\":[\"https:\/\/kevinmeneses.com\/en\",\"https:\/\/www.linkedin.com\/in\/kevin-meneses-gonzalez\/\",\"https:\/\/www.youtube.com\/@pythonia6131\"],\"url\":\"https:\/\/eodhd.com\/financial-academy\/author\/kevinmeneses\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Financial News API in Python: Filter, Clean and Score News","description":"Use the EODHD financial news API in Python: filter stock news by ticker, topic and date, add sentiment and build a seven-day news digest.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library","og_locale":"en_US","og_type":"article","og_title":"Financial News API in Python: Filter, Clean and Score Stock News","og_description":"Use the EODHD financial news API in Python: filter stock news by ticker, topic and date, add sentiment and build a seven-day news digest.","og_url":"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library","og_site_name":"Financial Academy","article_publisher":"https:\/\/www.facebook.com\/eodhistoricaldata","article_published_time":"2023-10-17T14:10:16+00:00","article_modified_time":"2026-11-05T14:14:35+00:00","author":"Kevin Meneses Gonz\u00e1lez","twitter_card":"summary_large_image","twitter_creator":"@EOD_data","twitter_site":"@EOD_data","twitter_misc":{"Written by":"Kevin Meneses Gonz\u00e1lez","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library#article","isPartOf":{"@id":"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library"},"author":{"name":"Kevin Meneses Gonz\u00e1lez","@id":"https:\/\/eodhd.com\/financial-academy\/#\/schema\/person\/f085666760ee7f148d1923a296cf3fe3"},"headline":"Financial News API in Python: Filter, Clean and Score Stock News","datePublished":"2023-10-17T14:10:16+00:00","dateModified":"2026-11-05T14:14:35+00:00","mainEntityOfPage":{"@id":"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library"},"wordCount":2024,"publisher":{"@id":"https:\/\/eodhd.com\/financial-academy\/#organization"},"articleSection":["Stocks Data Analysis Examples"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library","url":"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library","name":"Financial News API in Python: Filter, Clean and Score News","isPartOf":{"@id":"https:\/\/eodhd.com\/financial-academy\/#website"},"datePublished":"2023-10-17T14:10:16+00:00","dateModified":"2026-11-05T14:14:35+00:00","description":"Use the EODHD financial news API in Python: filter stock news by ticker, topic and date, add sentiment and build a seven-day news digest.","breadcrumb":{"@id":"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/eodhd.com\/financial-academy\/stocks-data-analysis-examples\/how-to-check-financial-news-with-python-financial-library#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/eodhd.com\/financial-academy\/"},{"@type":"ListItem","position":2,"name":"Financial News API in Python: Filter, Clean and Score Stock News"}]},{"@type":"WebSite","@id":"https:\/\/eodhd.com\/financial-academy\/#website","url":"https:\/\/eodhd.com\/financial-academy\/","name":"Financial APIs Academy | EODHD","description":"Financial Stock Market Academy","publisher":{"@id":"https:\/\/eodhd.com\/financial-academy\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/eodhd.com\/financial-academy\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/eodhd.com\/financial-academy\/#organization","name":"EODHD (EOD Historical Data)","url":"https:\/\/eodhd.com\/financial-academy\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/eodhd.com\/financial-academy\/#\/schema\/logo\/image\/","url":"https:\/\/eodhd.com\/financial-academy\/wp-content\/uploads\/2023\/12\/EODHD-Logo.png","contentUrl":"https:\/\/eodhd.com\/financial-academy\/wp-content\/uploads\/2023\/12\/EODHD-Logo.png","width":159,"height":82,"caption":"EODHD (EOD Historical Data)"},"image":{"@id":"https:\/\/eodhd.com\/financial-academy\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/eodhistoricaldata","https:\/\/x.com\/EOD_data","https:\/\/www.reddit.com\/r\/EODHistoricalData\/","https:\/\/eod-historical-data.medium.com\/"]},{"@type":"Person","@id":"https:\/\/eodhd.com\/financial-academy\/#\/schema\/person\/f085666760ee7f148d1923a296cf3fe3","name":"Kevin Meneses Gonz\u00e1lez","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/eodhd.com\/financial-academy\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/19dee2010941996b1cce342ad66f6964baa6eac898570992e3cddc1b00143a79?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/19dee2010941996b1cce342ad66f6964baa6eac898570992e3cddc1b00143a79?s=96&d=mm&r=g","caption":"Kevin Meneses Gonz\u00e1lez"},"description":"Kevin Meneses Gonz\u00e1lez is a CRM consultant and technical content creator focused on Python, AI, and financial data. He writes practical tutorials on using APIs and automation to analyze markets and build investment research tools.","sameAs":["https:\/\/kevinmeneses.com\/en","https:\/\/www.linkedin.com\/in\/kevin-meneses-gonzalez\/","https:\/\/www.youtube.com\/@pythonia6131"],"url":"https:\/\/eodhd.com\/financial-academy\/author\/kevinmeneses"}]}},"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/pdOdVT-1Rh","jetpack_sharing_enabled":true,"acf":[],"_links":{"self":[{"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/posts\/7147","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/comments?post=7147"}],"version-history":[{"count":3,"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/posts\/7147\/revisions"}],"predecessor-version":[{"id":7155,"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/posts\/7147\/revisions\/7155"}],"wp:attachment":[{"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/media?parent=7147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/categories?post=7147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/tags?post=7147"},{"taxonomy":"coding-language","embeddable":true,"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/coding-language?post=7147"},{"taxonomy":"ready-to-go-solution","embeddable":true,"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/ready-to-go-solution?post=7147"},{"taxonomy":"qualification","embeddable":true,"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/qualification?post=7147"},{"taxonomy":"financial-apis-category","embeddable":true,"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/financial-apis-category?post=7147"},{"taxonomy":"financial-apis-manuals","embeddable":true,"href":"https:\/\/eodhd.com\/financial-academy\/wp-json\/wp\/v2\/financial-apis-manuals?post=7147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}