Financial News Sentiment
Fetch recent news for stock tickers from Google News, Yahoo Finance and SEC EDGAR and score each article bullish, neutral or bearish. Watchlist mode returns only new articles. Runs via Apify MCP; needs an Apify token, $5 per 1,000 articles.
Hosted MCP Server
npx add-mcp 'https://mcp.apify.com/?tools=scionic_dev/financial-news-sentiment'Installs into Claude Code, Codex, Cursor and more
Documentation
Financial News Sentiment Analyzer (scionic_dev/financial-news-sentiment) Actor
Multi-source financial sentiment analysis using VADER ($0.02/article) or LLM ($0.05/article) engines. Scrapes Yahoo, Google News, and SEC EDGAR. Features budget caps and live market enrichment (Price, P/E, Market Cap). Delivers structured JSON for trading systems and AI agents.
- URL: https://apify.com/scionic_dev/financial-news-sentiment.md
- Developed by: Scionic Tech (community)
- Categories: Automation, Developer tools, News
- Features: Limited permissions
- Stats: 56 total users, 6 monthly users, 100.0% runs succeeded, 2 bookmarks
- User rating: 5.00 out of 5 stars
Pricing
from $3.50 / 1,000 article analyzeds
This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events. Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.
Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event
What's an Apify Actor?
An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes. In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours, and optionally produces a well-defined JSON output, datasets with results, or files in key-value store. In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.
How to integrate an Actor?
If asked about integration, you help developers integrate Actors into their projects. You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.
For examples already wired to this Actor's own input schema, see the API section below.
Each client library has reference documentation the quickstart does not restate: JavaScript/TypeScript (npm install apify-client) and Python (pip install apify-client).
README
What does Financial News Sentiment Analyzer do?
Financial News Sentiment Analyzer scrapes financial news from multiple sources, runs AI-powered sentiment analysis on every headline, and outputs structured, machine-readable data enriched with live market data, confidence scores, and company classifications.
It is an affordable, pay-per-use alternative to Bloomberg Terminal ($24,240/year), Refinitiv Eikon ($22,000/year), and other institutional data providers. You pay $0.005 per article ($5 per 1,000) with the built-in AI sentiment model, with no subscriptions and no minimums. Run it once, or schedule it as a watchlist monitor that only charges for new articles and alerts you in Slack or Discord.
Key features:
- Multi-source aggregation — Yahoo Finance, Google News, SEC EDGAR filings, and AI-powered search in a single run
- AI sentiment by default — a financial sentiment model runs inside the Actor (~78% accurate on real 2026 headlines vs ~52% for word-list tools like VADER)
- LLM mode with reasons — Gemini AI (~91% accurate) adds sentiment per company, the news event type and a one-line reason, and skips quote pages without charging
- Live market data enrichment — Current price, price change %, market cap, P/E ratio, short interest, earnings dates per ticker
- Proprietary composite scoring — Sentiment weighted by source credibility and model confidence
- Deep Search — Full-text article extraction from any URL for superior sentiment accuracy
- Company & sector enrichment — Automatic ticker-to-company mapping with industry classification
- Language detection — 55+ languages detected, filter non-English noise automatically
- Watchlist monitor & alerts — Scheduled runs skip articles you've already paid for and post new headlines to Slack, Discord, n8n, Make or Zapier
- Budget protection — Automatically stops when your spending limit is reached, never overcharges
- Pay only for what you use — No monthly fees, no setup costs
Data sources
| Source | Type | Data | Cost |
|---|---|---|---|
| Yahoo Finance | RSS feed | Headlines, summaries, per-ticker news | Free |
| Google News | RSS feed | Aggregated headlines from 80,000+ sources | Free |
| SEC EDGAR | API | 8-K, 10-K, 10-Q, Form 4 filings | Free |
| AI Search | API | AI-curated financial articles missed by RSS | $0.04/search |
| Deep Search | URL scraper | Full article text from any URL (CNBC, Reuters, etc.) | $0.08/page |
What data do you get?
Each article in the output dataset contains:
| Field | Description | Example |
|---|---|---|
title | Article headline | "Top Analysts See Solid Upside in Nvidia Stock" |
source | Source identifier | google_news, sec_edgar, ai_search |
sentiment_label | Bullish / Bearish / Neutral | "bullish" |
sentiment_score | Continuous score (-1.0 to +1.0) | 0.850 |
sentiment_confidence | Model confidence (0.0 to 1.0) | 0.95 |
composite_score | Score × credibility × confidence | 0.547 |
sentiment_model | Which engine produced the score | "local", "llm" or "vader" |
sentiment_reason | One-line explanation (LLM mode) | "CEO ouster report hits the stock" |
event_type | News event type (LLM mode) | "analyst_rating", "earnings", "management" |
ticker_sentiment | Sentiment per company named (LLM mode) | {"NVDA": "bearish", "AMD": "bullish"} |
tickers | Mentioned stock tickers | ["NVDA"] |
companies | Resolved company names | ["Nvidia"] |
sectors | Sector classification | ["Technology"] |
industry | Industry classification | "Information Technology" |
source_credibility | Source reliability score | 0.70 |
published_at | Publication timestamp (UTC) | "2026-03-21T07:10:39Z" |
language | Detected language | "en" |
article_type | Category | "news", "filing", "press_release" |
mentioned_tickers | Additional tickers found in text | ["AMD", "INTC"] |
With market data enrichment enabled ($0.01/ticker):
| Field | Description | Example |
|---|---|---|
current_price | Live stock price | 172.70 |
price_change_pct | Change from previous close | -3.28 |
market_cap | Market capitalization (USD) | 4197473583104 |
pe_ratio | Trailing P/E ratio | 35.24 |
short_ratio | Short interest ratio | 1.32 |
earnings_date | Next earnings date | "2026-05-20" |
Pricing
| Event | Price | When charged |
|---|---|---|
| Article analyzed | $0.005 ($5 / 1,000) | Per article scored by the built-in AI model (or VADER) |
| Article analyzed (LLM) | $0.03 ($30 / 1,000) | Per article scored by Gemini, with reasons, events and per-company sentiment. If the LLM is unavailable, the article is scored by the built-in model and charged $0.005 instead |
| AI Search query | $0.04 | Per search query when AI Search source is enabled |
| Deep Search page | $0.08 | Per URL scraped for full-text extraction |
| Ticker enrichment | $0.01 | Per unique ticker enriched with live market data |
Paid Apify plans get automatic discounts on article events: Bronze $4.50, Silver $4.00, Gold $3.50 per 1,000 articles (LLM: $27 / $24 / $21). In watchlist monitor mode, articles seen in earlier runs are never charged again.
Cost examples:
| Use case | Configuration | Est. cost |
|---|---|---|
| Quick check, 1 ticker, 10 articles | Built-in AI model, Google News | ~$0.05 |
| Daily snapshot, 5 tickers, 50 articles | Built-in AI model, all free sources | ~$0.25 |
| Hourly watchlist monitor, 5 tickers (~30 new articles/day) | Built-in AI model, monitor mode, Slack alerts | ~$4.50 / month |
| Deep analysis with market data | LLM, AI Search, enrichment, 3 tickers, 30 articles | ~$1.05 |
| Full stack, 5 tickers, 50 articles | LLM, AI Search, Deep Search, enrichment | ~$2.15 |
Compare to alternatives:
| Provider | Annual cost | Sentiment | Market data | API access |
|---|---|---|---|---|
| Bloomberg Terminal | $24,240 | Limited | Yes | No |
| Refinitiv Eikon | $22,000 | Yes | Yes | Yes |
| Finnhub Premium | $6,000 | Basic | Yes | Yes |
| This Actor (built-in model) | ~$30-150 | Yes | Optional | Yes |
| This Actor (LLM) | ~$180-900 | Advanced | Optional | Yes |
How it works
Quick start
Step 1. Click Try for free and configure your run:
- Enter stock tickers (e.g.,
AAPL,TSLA,NVDA) - Choose news sources (default: all free sources)
- Pick the sentiment engine:
local(default) for speed and price,llmfor the most accurate labels with reasons - Optionally enable market data enrichment
Step 2. Run the Actor.
Step 3. Download results from the Dataset tab as JSON, CSV, or Excel.
🔔 Watchlist monitor & alerts
Turn the Actor into a news alert system for your portfolio:
- Enter your tickers (e.g.
NVDA,AAPL,TSLA) and enable Watchlist monitor: only new articles. - Paste a Slack incoming webhook, Discord webhook, or any URL that accepts JSON (n8n, Make, Zapier) into Alert webhook URL.
- Click Schedule in Apify Console and run it every hour or every morning.
Each run remembers what it has already analyzed (per watchlist), so you only pay for new articles. When new headlines arrive, you get a message like:
📰 6 new articles for NVDA: 🟢 2 bullish · ⚪ 3 neutral · 🔴 1 bearish
🔴 -0.59 [NVDA] Nvidia board weighs CEO Huang's future as leadership crisis deepens <link>
🟢 +0.57 [NVDA] Nvidia shares rebound ahead of earnings <link>
Use Watchlist ID to run several independent watchlists (e.g. tech-portfolio, energy), and alertMinScore to control which headlines are highlighted.
Sentiment engines compared
We tested each engine on 91 real headlines from 12 November 2026, which we labelled ourselves, and on 400 headlines labelled by independent annotators in the public Twitter Financial News dataset.
| Built-in AI model (default) | LLM (Gemini) | VADER (legacy) | |
|---|---|---|---|
| Accuracy, Nov 2026 headlines | ~78% | ~91% | ~52% |
| Accuracy, human-labelled set | ~80% | ~76% | ~45% |
| Price | $0.005 / article | $0.03 / article | $0.005 / article |
| Extra fields | — | Reason, event type, sentiment per company, quote pages skipped | — |
| Best for | High-volume monitoring | Research, alerts you act on, multi-company stories | Old workflows that expect VADER scores |
Example where it matters:
"Nvidia Stock Sinks as Jensen Huang Ouster Report Sends Investors Toward AMD, Broadcom"
- VADER: one label for the whole headline, driven by individual words
- LLM:
{"NVDA": "bearish", "AMD": "bullish", "AVGO": "bullish"}, eventmanagement, reason "CEO ouster report causes stock to sink"
Output example
{
"article_id": "cbb7559567eb174a",
"source": "google_news",
"source_url": "https://news.google.com/rss/articles/...",
"source_credibility": 0.7,
"title": "Apple Inc. Stock Position Raised by Groupama Asset Management",
"summary": "Apple Inc. Stock Position Raised by Groupama Asset Management",
"authors": ["MarketBeat"],
"published_at": "2026-03-22T11:17:21Z",
"scraped_at": "2026-03-22T14:30:12Z",
"tickers": ["AAPL"],
"companies": ["Apple Inc."],
"sectors": ["Technology"],
"sentiment_label": "bullish",
"sentiment_score": 0.850,
"sentiment_confidence": 0.95,
"sentiment_model": "llm",
"composite_score": 0.547,
"language": "en",
"language_confidence": 1.0,
"article_type": "news",
"topics": [],
"topic_confidence": 0.0,
"mentioned_tickers": [],
"current_price": 247.99,
"price_change_pct": -0.39,
"market_cap": 3644938780672,
"pe_ratio": 31.35,
"industry": "Computers, Phones & Household Electronics",
"short_ratio": 2.41,
"earnings_date": "2026-04-30"
}
Use cases
Algorithmic trading — Feed real-time sentiment signals into your trading system. The composite score combines sentiment, source credibility, and confidence into a single actionable number. Market data enrichment adds price context alongside sentiment.
Portfolio monitoring — Schedule daily runs across your holdings. Track sentiment trends over time. Detect negative news before it hits the price. Get notified when short interest or P/E ratios change.
Research & due diligence — Analyze sentiment around a company before investing. Compare sentiment across competitors in the same sector. Use Deep Search to extract full articles from any URL.
AI agents & automation — Structured JSON output works directly with AI agents, LangChain, and automation platforms. Schedule runs and pipe results into your workflow.
Portfolio news alerts — Use watchlist monitor mode to get Slack or Discord messages only when new bullish or bearish headlines hit your tickers.
Fintech products — Build sentiment dashboards, alerts, and newsletters. The standardized schema makes integration straightforward across all sources.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
tickers | string[] | ["AAPL", "TSLA"] | Stock tickers to analyze |
query | string | — | Free-text search query |
sources | string[] | All free sources | Which sources to scrape |
maxArticles | integer | 20 | Max articles per source, shared evenly across tickers |
sentimentModel | string | "local" | "local", "llm" or "vader" |
includeRawText | boolean | true | Include article summaries |
enrichWithMarketData | boolean | false | Add live price, market cap, P/E per ticker ($0.01/ticker) |
deepSearchUrls | string[] | — | URLs for full-text extraction ($0.08/page) |
onlyNewArticles | boolean | false | Watchlist monitor: skip (and never charge) articles seen in earlier runs |
watchlistId | string | — | Name for the watchlist's memory; defaults to tickers + query |
alertWebhookUrl | string (secret) | — | Slack, Discord or any JSON webhook for new-article alerts |
alertMinScore | number | 0.3 | Highlight articles with absolute composite score above this |
Integration examples
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("scionic_dev/financial-news-sentiment").call(
run_input={
"tickers": ["AAPL", "NVDA", "TSLA"],
"sources": ["google_news", "sec_edgar"],
"maxArticles": 20,
"sentimentModel": "llm",
"enrichWithMarketData": True,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
price = item.get("current_price", "N/A")
print(f"{item['sentiment_label']:>7s} {item['sentiment_score']:+.2f} ${price} | {item['title'][:50]}")
JavaScript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('scionic_dev/financial-news-sentiment').call({
tickers: ['AAPL', 'NVDA', 'TSLA'],
sources: ['google_news', 'sec_edgar'],
maxArticles: 20,
sentimentModel: 'llm',
enrichWithMarketData: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => {
console.log(`${item.sentiment_label} ${item.sentiment_score} $${item.current_price} | ${item.title}`);
});
n8n, Make and Zapier
Use the official Apify node/app: choose Run Actor, select scionic_dev/financial-news-sentiment, pass your tickers, then read the dataset items in the next step. For push-style workflows, set alertWebhookUrl to your n8n/Make/Zapier webhook URL and enable onlyNewArticles — the Actor will call your workflow only when there is new news.
AI agents (MCP) — Claude, ChatGPT, Cursor
This Actor works as a tool for AI agents through the Apify MCP server. Add scionic_dev/financial-news-sentiment to your MCP client and ask things like:
"What's the news sentiment on $TSLA this week, and which headlines are most bearish?"
"Compare news sentiment for NVDA, AMD and INTC and include their P/E ratios."
The agent runs the Actor and gets back structured, scored articles it can reason over.
FAQ
Is this financial advice? No. Sentiment scores are AI-generated and may be inaccurate. This tool is for informational and research purposes only. Always do your own due diligence.
How accurate is the sentiment analysis? On 91 headlines from 12 November 2026 that we labelled ourselves, the built-in AI model was right ~78% of the time, the LLM ~91% and VADER ~52%. On 400 independently labelled headlines from the public Twitter Financial News dataset: built-in model ~80%, LLM ~76%, VADER ~45%.
What about paywalled sources (Bloomberg, WSJ)? We do not scrape paywalled content. All sources are publicly accessible or use official APIs. Use Deep Search URLs to extract articles from sites you have access to.
How fresh is the data? Articles are scraped in real-time when the actor runs. Schedule it hourly or daily for continuous monitoring. Market data enrichment provides live prices at the time of the run.
Can I use this with my AI agent or LLM? Yes. The structured JSON output is designed for programmatic consumption. It works directly with LangChain, AutoGPT, Claude, and any tool that accepts JSON data.
How do I get alerts only for new articles?
Enable onlyNewArticles, add an alertWebhookUrl (Slack, Discord, n8n…), and schedule the Actor. Articles analyzed in previous runs of the same watchlist are skipped and not charged.
What happens if my budget runs out? The actor automatically stops processing and returns whatever articles it has already analyzed. You are never overcharged. Set a spending limit in the Apify Console to control costs.
What data do you keep? Besides your run's dataset, the analyzed article records (headline, link, short summary, tickers, sentiment and timestamps) are added to our own archive of public financial news sentiment. Your input, account details and webhook URLs are never stored there.
What happens if a source is down? Each source is fetched independently. If one fails, the others still return data. Errors are logged in the run stats.
Legal disclaimer
This actor only scrapes publicly available data. Article summaries are limited to 200 characters for legal compliance — full article text is never stored or distributed. SEC EDGAR data is explicitly public domain. All other data is derived analysis (sentiment scores) which is protected as transformative use.
Not affiliated with Yahoo Finance, Google, SEC, or any news publisher.
Changelog
This Actor's version history is a separate document: https://apify.com/scionic_dev/financial-news-sentiment/changelog.md
Actor input Schema
tickers (type: array):
List of stock tickers to analyze (e.g., AAPL, TSLA, MSFT). Leave empty to get general market news.
query (type: string):
Optional free-text search query (e.g., 'Federal Reserve interest rates'). Used alongside or instead of tickers.
sources (type: array):
Which news sources to scrape. Defaults to all available sources.
maxArticles (type: integer):
Maximum articles per source, shared evenly across your tickers. Controls cost. For a watchlist, about 10 × the number of tickers works well.
sentimentModel (type: string):
Local AI (default): a financial sentiment model running inside the Actor, ~78% accurate on real headlines vs ~52% for VADER. LLM: Gemini AI, ~91% accurate, plus sentiment per company, event type and a one-line reason; non-news pages are skipped and not charged. VADER: legacy word-list scoring, kept for older workflows.
includeRawText (type: boolean):
Include article summary (first 200 characters) in output. Disable for smaller dataset size.
dateFrom (type: string):
Only include articles published after this date (YYYY-MM-DD format).
dateTo (type: string):
Only include articles published before this date (YYYY-MM-DD format).
enrichWithMarketData (type: boolean):
Add live market data per ticker: price, market cap, P/E, sector, short ratio, earnings date. Charged $0.01 per unique ticker enriched.
deepSearchUrls (type: array):
Specific article URLs for full-text extraction and sentiment analysis. Charged $0.08 per URL. Best for CNBC, Reuters, MarketWatch articles that RSS can't access.
proxyConfiguration (type: object):
Apify proxy settings. Uses free datacenter proxies by default. Helps avoid rate limiting on Yahoo Finance.
onlyNewArticles (type: boolean):
Skip articles already analyzed in earlier runs of the same watchlist (same tickers + query, or the same Watchlist ID). Ideal for scheduled runs: you only pay for new articles.
watchlistId (type: string):
Optional name for this watchlist's memory, e.g. 'tech-portfolio'. Leave empty to derive it from tickers + query. Use different IDs for schedules that should track separately.
alertWebhookUrl (type: string):
When new articles are found, post a summary here. Supports Slack incoming webhooks, Discord webhooks, or any URL that accepts JSON (n8n, Make, Zapier).
alertMinScore (type: number):
Articles with strong sentiment (absolute composite score at or above this value, 0 to 1) are listed in the alert. Default 0.3.
Actor input object example
{
"tickers": [
"AAPL",
"TSLA",
"MSFT",
"GOOGL"
],
"sources": [
"yahoo_finance",
"google_news",
"sec_edgar"
],
"maxArticles": 20,
"sentimentModel": "local",
"includeRawText": true,
"enrichWithMarketData": true,
"proxyConfiguration": {
"useApifyProxy": true
},
"onlyNewArticles": false,
"alertMinScore": 0.3
}
Actor output Schema
articles (type: string):
One item per analyzed article: title, source, URL, tickers, sentiment label and score, composite score, topics and optional market data.
runStats (type: string):
Counts by source and sentiment, average sentiment and composite score, duplicates skipped and errors.
API
You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.
JavaScript example
import { ApifyClient } from 'apify-client';
// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
token: '<YOUR_API_TOKEN>',
});
// Prepare Actor input
const input = {
"tickers": [
"AAPL",
"TSLA"
],
"proxyConfiguration": {
"useApifyProxy": true
}
};
// Run the Actor and wait for it to finish
const run = await client.actor("scionic_dev/financial-news-sentiment").call(input);
// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
console.dir(item);
});
// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs
Python example
from apify_client import ApifyClient
# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")
# Prepare the Actor input
run_input = {
"tickers": [
"AAPL",
"TSLA",
],
"proxyConfiguration": { "useApifyProxy": True },
}
# Run the Actor and wait for it to finish
run = client.actor("scionic_dev/financial-news-sentiment").call(run_input=run_input)
# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item)
# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start
CLI example
echo '{
"tickers": [
"AAPL",
"TSLA"
],
"proxyConfiguration": {
"useApifyProxy": true
}
}' |
apify call scionic_dev/financial-news-sentiment --silent --output-dataset
MCP server setup
{
"mcpServers": {
"apify": {
"type": "http",
"url": "https://mcp.apify.com/?tools=fetch-actor-details,scionic_dev/financial-news-sentiment"
}
}
}
The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an Authorization: Bearer <APIFY_API_TOKEN> header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).
OpenAPI specification
Download the OpenAPI definition: https://api.apify.com/v2/actors/MJqE9QpI2jlFVZa3z/builds/e5LGwdNBMHTvshdse/openapi.json