Overview
This workflow generates a daily financial news digest by querying Scavio for each tracked ticker and sector keyword, extracting top headlines and AI Overview summaries, scoring news items by potential market impact, and compiling a prioritized digest. The output is a structured JSON feed that can be pushed to Slack, email, or a dashboard. Runs before market open to give traders a morning briefing.
Trigger
Cron schedule (daily at 7:30 AM EST)
Schedule
Runs daily at 7:30 AM EST before market open
Workflow Steps
Load ticker and sector watchlist
Read the list of tracked tickers and sector keywords from configuration.
Query news for each ticker
Search Scavio Google for each ticker with news-focused queries to get current headlines.
Extract AI Overview summaries
Pull AI Overview text for each query to get consensus analyst views and key developments.
Score and deduplicate headlines
Remove duplicate stories across tickers and score remaining headlines by impact keywords.
Compile and distribute digest
Format the ranked digest and push to Slack channel, email, or save as JSON.
Python Implementation
import requests
import json
from datetime import datetime
from pathlib import Path
API_KEY = "your_scavio_api_key"
IMPACT_WORDS = {"earnings", "beat", "miss", "guidance", "upgrade", "downgrade", "acquisition", "merger", "layoff", "fda", "sec", "investigation", "bankruptcy", "ipo", "split"}
def fetch_ticker_news(ticker: str) -> dict:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": f"{ticker} stock news today 2026", "ai_overview": True},
timeout=15,
)
res.raise_for_status()
data = res.json()
headlines = []
for r in data.get("organic", [])[:5]:
title = r.get("title", "")
snippet = r.get("snippet", "")
impact = len(set(title.lower().split()) & IMPACT_WORDS) + len(set(snippet.lower().split()) & IMPACT_WORDS)
headlines.append({"title": title, "snippet": snippet, "link": r.get("link", ""), "impact_score": impact})
return {
"ticker": ticker,
"ai_summary": data.get("ai_overview", {}).get("text", ""),
"headlines": sorted(headlines, key=lambda x: x["impact_score"], reverse=True),
}
def run():
date = datetime.utcnow().strftime("%Y-%m-%d")
tickers = ["NVDA", "AAPL", "TSLA", "MSFT", "GOOG", "META", "AMZN", "AMD"]
digest = {"date": date, "tickers": []}
for ticker in tickers:
news = fetch_ticker_news(ticker)
digest["tickers"].append(news)
Path(f"financial_digest_{date}.json").write_text(json.dumps(digest, indent=2))
print(f"Financial digest {date}: {len(tickers)} tickers scanned")
for t in digest["tickers"]:
top = t["headlines"][0]["title"] if t["headlines"] else "no news"
print(f" ${t['ticker']}: {top}")
if __name__ == "__main__":
run()JavaScript Implementation
const API_KEY = "your_scavio_api_key";
const IMPACT = new Set(["earnings","beat","miss","guidance","upgrade","downgrade","acquisition","merger","layoff"]);
async function fetchNews(ticker) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "google", query: `${ticker} stock news today 2026`, ai_overview: true }),
});
const data = await res.json();
const headlines = (data.organic ?? []).slice(0, 5).map((r) => {
const words = new Set(`${r.title ?? ""} ${r.snippet ?? ""}`.toLowerCase().split(/\s+/));
return { title: r.title ?? "", snippet: r.snippet ?? "", impact: [...IMPACT].filter((w) => words.has(w)).length };
});
return { ticker, headlines: headlines.sort((a, b) => b.impact - a.impact), aiSummary: data.ai_overview?.text ?? "" };
}
for (const t of ["NVDA", "AAPL", "TSLA"]) {
const news = await fetchNews(t);
console.log(`$${t}: ${news.headlines[0]?.title ?? "no news"}`);
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews