News for trading bots.
By the request.
The relevance-scored, ticker-linked feed that powers alphai, available as a REST API. Built for trading bots, agent backends, and dashboards. One header, one key, real-time enrichment.
curl https://alphai.io/api/news/ \
-H "Authorization: Bearer $ALPHAI_API_KEY" \
-G -d "symbol=NVDA" \
-d "category=earnings" \
-d "page=1"
# Response
# {
# "page": 1,
# "has_more": true,
# "results": [
# {
# "original": {
# "title": "Nvidia export curbs tighten...",
# "url": "https://reuters.com/...",
# "summary": "The White House is expected to...",
# "time_published": "2026-04-26T14:32:00Z",
# "authors": ["Reuters Staff"]
# },
# "enrichment": {
# "category": "macro",
# "tickers": ["NVDA"],
# "relevance_score": 9,
# "ai_trading_insights": { "ticker_analysis": [...] }
# }
# }
# ]
# }Fresh
New articles typically land within minutes of publication. Poll the feed on your own schedule.
Ticker-linked
Each article carries machine-extracted tickers and per-ticker analysis.
Relevance-scored
Every article carries an LLM-assigned relevance score (1–10). Filter at request time.
No SDK lock-in
Plain JSON over HTTPS. Bring your own HTTP client; no SDK to install or update.
Endpoints
stableAuthenticate with Authorization: Bearer ak_live_…. Quotas are hourly and counted against your account, not per-key. Looking for AI-agent integrations? See MCP.
What the fields mean.
Every news item ships an enrichment block produced by an LLM pass over the article. These are the four fields you'll use most.
Need the formal contract? Pull the OpenAPI spec at /api/schema/.
LLM's estimate of how market-moving a story is.
- 1–3 · minor noise, sector chatter, opinion pieces.
- 4–6 · sector context, secondary sources, useful but rarely actionable.
- 7–8 · actionable for the named tickers — earnings beats, guidance changes, regulatory steps.
- 9–10 · market-moving for the whole sector or index. Front-page stuff.
The /api/news/ feed defaults to ≥ 7; pass ?min_relevance=N to relax or tighten the filter.
Per-ticker price impact direction. Not earnings-positive vs earnings-negative — this is "where will the chart move on this story."
- positive — bullish
- neutral — sideways
- negative — bearish
Each ticker block also carries impact_analysis.confidence (high / medium / low) and a free-text reasoning field — handy when filtering automation pipelines on confident bullish/bearish signals only.
One topic bucket per article. Use ?category=earnings on /api/news/ to filter the feed.
Tickers extracted from the article. We only retain symbols that exist in our /api/symbols/ list of active equities — articles that don't mention any active ticker are filtered out before they reach the API. Each ticker also gets a dedicated ticker_analysis entry with sentiment and reasoning, so multi-ticker stories don't collapse to a single read.
What an API-connected bot can do.
Same JSON, your stack. From watchlist alerts to Telegram bots, the API stays out of your way.
"Claude, what moved NVDA today?"
alphai_news_search → MCP
Try it"Send only high-relevance earnings news for my watchlist."
/api/news/?category=earnings · min_relevance=7
Try it"Build a Telegram bot for market-moving news in 10 minutes."
/api/news/trending/ + your bot framework
Try it"Summarize all AI/chip-sector news before market open."
alphai_news_search?ticker=NVDA,AMD,TSM → MCP
Try it"Feed my agent relevance-scored financial news via MCP."
OAuth 2.1 · 5 tools · Streamable HTTP
Try itTry the API right here.
Calls run anonymously against the public endpoints (60 req/min/IP). No login, no API key. Sign up for higher limits and predictable headroom.
// click Send to fetch a live responsePriced for scale.
Hourly quotas are per account. When you hit 429 we return a Retry-After header. Anonymous traffic on the public news routes is rate-limited to 60 requests/minute per IP to deter scrapers.
| Plan | Requests / hour | Active keys |
|---|---|---|
| Free | 10 | 1 |
| Basic | 100 | 1 |
| Pro | 1,000 | 5 |
Push, not poll.
Register HTTPS endpoints in /account/webhooks and receive a signed POST every time a high-relevance news article hits one of your ticker subscriptions. Same article shape as GET /api/news/<uid>/.
- HMAC-SHA256 signature header (Stripe-style, identical scheme).
- Retry with exponential backoff (1m → 5m → 30m → 2h → 12h).
- SSRF guard refuses private and loopback targets.
- Up to 5 endpoints per Pro account.
- Auto-disable after 10 consecutive 5xx + email to the owner.
POST https://your-service.example.com/alphai-webhook
Content-Type: application/json
User-Agent: alphai-webhook/1.0
X-Alphai-Event: news.matched
X-Alphai-Delivery: 42
X-Alphai-Signature: t=1715932000,v1=<hex-HMAC-SHA256>
{
"id": "evt_42",
"type": "news.matched.v1",
"created_at": "2026-05-17T07:08:00Z",
"delivery_attempt": 1,
"data": {
"alert": { "ticker": "NVDA" },
"article": { ...same as GET /api/news/<uid>/ }
}
}import hashlib
import hmac
def verify(secret: str, signature_header: str, body: bytes) -> bool:
"""Return True iff X-Alphai-Signature header matches the body."""
parts = dict(p.split("=", 1) for p in signature_header.split(","))
ts, sig = parts["t"], parts["v1"]
expected = hmac.new(
secret.encode(),
f"{ts}.{body.decode()}".encode(),
hashlib.sha256,
).hexdigest()
return hmac.compare_digest(expected, sig)
# In your handler:
# verify(os.environ["ALPHAI_WEBHOOK_SECRET"], request.headers["X-Alphai-Signature"], request.body)Build on the beat.
Sign up for any plan, generate a key in your account, start shipping.
Get API key