2.2 KiB
2.2 KiB
Stock Monitoring API Research
Compiled 2026-01-29 8pm ET
Goal
Automated alerts for:
- Price movements >5% daily
- News headlines for specific tickers (NABL, MSFT, S, etc.)
API Comparison
| API | Free Tier | Rate Limit | Real-time | News | Best For |
|---|---|---|---|---|---|
| Finnhub | ✅ Yes | 60/min | ✅ | ✅ | Best free option |
| Alpha Vantage | ✅ Yes | 25/day | ❌ (15min delay) | ✅ | Technical indicators |
| Polygon.io | ✅ Yes | 5/min | ❌ (EOD) | ✅ | Historical data |
| yfinance | ✅ Free | ~2000/hr | ✅ | ❌ | Quick polling |
| TradingView | ❌ Paid ($15/mo) | N/A | ✅ | ❌ | Visual alerts |
Recommendation: Finnhub + yfinance combo
Finnhub (news + fundamentals)
- Free API key: https://finnhub.io/register
- 60 calls/minute = plenty for monitoring
- Has company news endpoint
- Has price target / analyst ratings
import finnhub
client = finnhub.Client(api_key="YOUR_KEY")
# Get quote
quote = client.quote('NABL') # c=current, pc=previous close, dp=% change
# Get news
news = client.company_news('NABL', _from="2026-01-01", to="2026-01-30")
yfinance (quick price checks, no API key)
import yfinance as yf
# Single quote
stock = yf.Ticker("NABL")
info = stock.info
price = info.get('currentPrice')
prev_close = info.get('previousClose')
pct_change = ((price - prev_close) / prev_close) * 100
# Multiple stocks at once
data = yf.download(['NABL', 'MSFT', 'S'], period='1d')
Implementation Plan
Simple cron-based monitor
- Run every 30 min during market hours (9:30am-4pm ET)
- Poll prices for watchlist
- Calculate daily % change
- If >5% move OR significant news → ping Signal
Watchlist
- NABL - Johan's ex-employer, PE takeover watch
- S - Johan's short position
- MSFT, NVDA, TSLA - Big tech moves
- GLD, SLV - Metals
- BTC - Crypto
No Built-in Webhooks
None of the free tiers offer "push when price hits X" functionality. Must poll and compare ourselves.
Next Steps
- Get free Finnhub API key
- Create
/home/johan/clawd/scripts/stock-monitor.py - Add cron job for market hours
- Integrate with James dashboard news feed
Research by James, ready for Johan's review