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

/api/news/
List news, page-paginated. Filters: ?symbol=NVDA, ?category=earnings, ?page=N (10 items per page).
/api/news/trending/
Top stories from the last 48h ranked by AI-assigned relevance.
/api/news/{uid}/
Fetch a single article by UID with full enrichment (per-ticker analysis, category, key entities).
/api/symbols/
List supported tickers with metadata (name, sector, exchange).
/api/symbols/{ticker}/
Fetch a single symbol with extended metadata.

Authenticate 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/.

enrichment.relevance_score

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.

enrichment.ai_trading_insights.ticker_analysis[].impact_analysis.sentiment

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.

enrichment.category

One topic bucket per article. Use ?category=earnings on /api/news/ to filter the feed.

earningsmergers_acquisitionsregulationmacro_economysector_analysistechnologycommoditiescryptoipogeopoliticsinsiderother
enrichment.tickers + ticker_analysis[].ticker

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.

Try 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.

Response
// click Send to fetch a live response

Priced 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.

PlanRequests / hourActive keys
Free101
Basic1001
Pro1,0005

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