What changed.

User-visible changes to the REST API, the MCP server, and the data pipeline — newest first. If it affects what your bot receives, it's here.

Summary endpoints validate tickers and resolve crypto

  • /api/symbols/{ticker}/sentiment-summary/ and /insider-summary/ now return 404 for a ticker no symbol owns, with a pointer at /api/symbols/?search= to look up the right one. Zeros in a 200 response always mean a quiet window for a real listing, never a misspelled symbol. Response codes are documented in the OpenAPI spec.
  • Both endpoints accept the same ticker forms as the rest of the API. A bare crypto name resolves to its <SYM>-USD listing, so /api/symbols/DOGE/sentiment-summary/ returns Dogecoin's rollup and echoes DOGE-USD as the ticker. Delisted and renamed symbols stay addressable, and a symbol a stock or ETF already owns keeps its meaning: BTC is still the Grayscale ETF, BTC-USD the coin.

Crypto and foreign tickers, plus symbol search

  • News queries accept every market's ticker form. US equities are the bare symbol (AAPL). Cryptocurrencies use the <SYM>-USD form (BTC-USD), and foreign listings use the Yahoo suffix (VOD.L). The symbol parameter on /api/news/ and the /api/symbols/{ticker}/ path document this in the OpenAPI spec.
  • A bare crypto name now resolves to its suffixed ticker. ?symbol=DOGE on /api/news/ returns Dogecoin instead of an empty page, browsing to /stock/DOGE opens the coin, and the MCP alphai_ticker_news tool does the same. A symbol a stock or ETF already owns is left as is: ?symbol=BTC still returns the Grayscale ETF, so pass BTC-USD for the coin.
  • New search on /api/symbols/. Pass ?search= to resolve a company name or ticker prefix to matching symbols, with ticker-prefix matches first. search=bitcoin returns BTC-USD and search=nvda returns NVDA. It matches the alphai_tickers lookup on MCP.

Delisted tickers keep their history, renames stay connected

  • /api/symbols/{ticker}/ now resolves delisted symbols and reports their lifecycle: status, delisted_at, and renamed_to with the ticker the company continues under after a rename (EchoStar's SATS points to ECHO). Field details are in the OpenAPI spec.
  • News queries follow renames. ?symbol= on /api/news/ and /api/news/insider/ returns a delisted symbol's history instead of an empty page, and querying a renamed company's current ticker also matches articles tagged with its former ticker. Tags on past articles stay exactly as published.
  • On MCP, alphai_ticker_news and alphai_insider_news now serve any known symbol and set delisted and renamed_to on the result. unknown_ticker is reserved for symbol strings we do not recognize at all.
  • Creating a news alert requires an active symbol on both REST and MCP. Updating or removing an existing alert on a delisted ticker keeps working.

alphai-tui, an official terminal client

  • alphai-tui is an official open-source terminal dashboard, written in Rust and MIT licensed. Live quotes and candlestick charts sit next to the scored news feed with per-ticker sentiment, and a separate view streams SEC Form 4 insider activity. Everything comes from the public REST API with a regular ak_live_ key, and a free key is enough: the app fetches only what the visible view needs and caches each response for five minutes.
  • Install with brew install makeev/tap/alphai-tui or cargo install alphai-tui; prebuilt binaries for macOS, Linux and Windows, with checksums, are on the releases page.
  • The new alphai.io/tui page covers installation and the first run, and shows how to pair the dashboard with an AI agent over MCP in a terminal multiplexer.

Structured trade data on the insider feed

  • Items on /api/news/insider/ now carry a structured insider block, so you can read the trade instead of parsing the headline: side (buy, sell, or other, with the raw SEC transaction_code), shares, avg_price_usd, total_value_usd, a 10b5-1 plan flag, the reporting owner and their role, and the transaction date. A multi-tranche filing arrives as one event: shares and value are summed, the price is value-weighted, and money fields are decimal strings.
  • The same endpoint now accepts min_relevance (1 to 10), matching the main feed. Insider rows are scored from the event's total dollar value, so this works as a size filter: min_relevance=7 keeps roughly the $10M+ trades.
  • The MCP tool alphai_insider_news returns the same block on every item. Full schema in the OpenAPI spec and on the developers page. The Python and TypeScript SDKs pick it up in 0.3.0 with typed models and the new parameter.

A new n8n briefing template you can import in one click

  • Our flagship n8n workflow is now published in the official n8n template library, so you can add it to your instance in one click instead of loading JSON by hand.
  • The template pulls news, sentiment, and SEC Form 4 insider activity for your watchlist, flags the movers with rule-based red flags, writes a short briefing with GPT, and sends it by email with an urgent Discord ping. A small watchlist runs inside the free tier.
  • It joins the three starter workflows in the n8n integration guide. Your key stays in an n8n credential, and the same flow runs on n8n Cloud or self-hosted.

SDK 0.2.0 and did-you-mean validation errors

  • SDK 0.2.0 (PyPI and npm) adds a page-size control to the news feeds: page_size=50 in Python, pageSize: 50 in TypeScript, available on news.list, news.insider, and both auto-paginating iterators. The API accepts 10 (the default) or 50 with a Pro key, so deep pagination through the SDKs now takes a fifth of the requests. Upgrade with pip install -U alphai-sdk or npm i alphai-sdk@latest.
  • Validation errors now point at the parameter an endpoint actually takes. Sending limit or per_page to /api/news/ still returns 400, but the error message adds Did you mean 'page_size'?, and offset or page suggest cursor. Nothing changes on /api/symbols/, where limit and offset are real parameters for slicing the ticker list.
  • The full parameter tables live in the OpenAPI spec (now 1.10.1), with per-language details in the SDK changelogs on PyPI and npm.

OAuth at connect and API keys on the MCP server

  • API keys now authenticate the MCP server. The same ak_live_ keys that call the REST API are accepted on mcp.alphai.io/mcp as a static Authorization: Bearer header, so headless clients (n8n, cron bots, CI) can skip the browser OAuth flow entirely. A key session sees the full toolset and shares the per-account MCP rate budget with OAuth sessions on the same plan.
  • Create a key under Account → API keys and see the “API key (headless)” tab on alphai.io/mcp for ready-made n8n, Claude Code, Cursor, and curl snippets. Keys travel in the header only; query-string keys are not accepted. Revoking a key cuts MCP access immediately.
  • The full mcp.alphai.io/mcp surface now authenticates at connect: initialize and tools/list require a Bearer token, and an unauthenticated request answers 401 with a WWW-Authenticate pointer to the protected-resource metadata. In practice: your client shows the alphai login as soon as the server is added — not at the first tool call. Anonymous catalog introspection is no longer served; the tool list is documented on alphai.io/mcp.
  • OAuth discovery documents are also served at the path-suffixed well-known URLs — /.well-known/oauth-protected-resource/mcp and /.well-known/oauth-authorization-server/mcp — matching how MCP clients derive them from the resource URL.
  • Loopback redirect URIs match port-agnostically at /oauth/authorize: a desktop client registered with http://localhost:<port>/… can come back on a different ephemeral port without re-registering.

Free-text search and forgiving page sizes on the MCP tools

  • alphai_news_search now takes a free-text query (alias q) alongside its structured filters: company names, ticker symbols, and topic words in the query resolve to ticker and category filters. Explicit tickers or category still take precedence when you pass both.
  • Paginated tools now accept limit as an alias for page_size, and a page request above your plan's ceiling is capped to it (10 on Free and Basic, 50 on Pro) — you get a full page plus a next_cursor instead of an error.
  • MCP responses now carry a standing note that AlphaAI output is AI-generated financial information for research, not investment advice.

Official Postman collection

  • The whole REST surface is now packaged as an official Postman collection — the /api/news/* feed, trending, insider transactions, single-article and related lookups, plus the /api/symbols/* directory, details, sentiment and insider summaries, and peers. Import the collection and environment, set bearerToken to your API key, and call every endpoint without writing a line of code.
  • Requests target api.alphai.io and authenticate with Authorization: Bearer out of the box. Linked from the developer docs.

Insider feeds are now SEC Form 4 only

  • category=insider, the /api/news/insider/ feed, and the MCP alphai_insider_news tool now return SEC Form 4 insider transactions only — company officers, directors, and 10%+ owners buying or selling their own stock. 13F / institutional-stake and executive-change stories no longer appear on these surfaces.
  • Those stories haven't gone away — they stay in the general feed under their own category (most as other), reachable via /api/news/ and alphai_news_search. Only the dedicated insider surfaces were narrowed.
  • The result is a clean, deterministic Form 4 signal: one row per filing event, aggregated (total shares, volume-weighted price, total value) with a relevance score derived from the event size and its buy / sell / 10b5-1 shape. Full contract in the OpenAPI spec.

ChatGPT deep research support — search and fetch join the MCP toolset

  • The MCP server now implements ChatGPT's connector contract: two new tools, search and fetch, alongside the eleven alphai_* tools (thirteen total). Add mcp.alphai.io as a source in ChatGPT deep research and it can search the enriched news feed and pull per-article digests on its own.
  • search takes a natural-language query — ticker symbols (NVDA, BTC-USD), company names, and topic words (insider, earnings, ipo, crypto…) all resolve to the right filters. fetch returns the enriched digest for one result id: summary, per-ticker analysis, category, relevance score, and a canonical article link. Agents with precise filters should keep using alphai_news_search.
  • Same OAuth flow, tiers, and rate limits as every other tool — nothing to reconfigure. Connected clients that cache the tool list need a refresh to see the new tools (in ChatGPT: Settings → Apps → alphai → Refresh). Setup per client on the MCP page.

The full archive goes Pro — tiered depth, richer limit errors, alert delivery modes

  • News-archive depth is now part of the plan matrix. Free keys page the feeds (/api/news/, /api/news/insider/) back 30 days and Basic 90; Pro walks the full enriched archive — every article with its relevance score, per-ticker analysis and category, deep enough to backtest against. MCP search follows the same axis (Pro was previously capped at 365 days; the cap is gone). Requesting a cursor past your horizon returns 403 with extra.reason: archive_horizon — first pages and everything inside the window are unaffected.
  • alphai_news_search (MCP) is filter-first: query by tickers, category, from_date / to_date and min_relevance. The free-text q parameter has been removed — resolve companies to tickers with alphai_tickers and filter, or match text client-side on the returned titles and summaries.
  • Capped responses now tell you what to do about them. A REST 429 (and the archive 403) carries your tier, its limit_per_minute / limit_per_day, retry_after_seconds and an upgrade block naming the higher tiers' caps; the MCP 429 adds the same tier + upgrade fields. Full shapes in the OpenAPI spec (v1.10.0). One number moved with this release: Pro's per-minute burst is now 150/min (was 300); the 100,000/day volume is unchanged.
  • Alert delivery is now a plan capability: instant per-article delivery (email and webhooks) is Pro; Basic alerts arrive as the 06:00 UTC daily digest. Alerts that existed before today keep the delivery mode they were created with. Pro accounts choose per alert via delivery_mode (instant | digest) on PATCH /api/news/alerts/{ticker}/ or in account settings.
  • The plan license is now explicit: Free is for personal, non-commercial use; Basic covers commercial use inside your own organization; Pro additionally covers redistributing the enriched feed as an integrated part of your own product, with attribution to alphai. Offering the data as a standalone feed, dataset, or API stays an Enterprise conversation. Stated on pricing and in the terms.

AlphaAI in n8n — ready-made workflow templates

  • You can now wire the feed into n8n with no code. A new n8n integration guide covers setup, and three ready-to-import templates live at github.com/makeev/alphai-n8n-templates.
  • The three templates: trending news to Discord (rich cards with AI sentiment, relevance score and likely price impact), a daily watchlist digest by email, and SEC Form 4 insider alerts to Discord — each alert linking back to the full analysis.
  • Each is built on n8n's HTTP Request node against api.alphai.io with Bearer Auth, so your key stays in an n8n credential — never in the workflow — and the same flow runs on n8n Cloud or self-hosted.

Interactive API reference, and bulk page size on the feed

  • The REST API now has an interactive reference at api.alphai.io/api/schema/swagger-ui/ — browse every endpoint, query parameter and response shape, and fire authorized test calls straight from the page with your Bearer ak_live_… key. Browsing needs no key; the raw OpenAPI spec is linked at the top.
  • GET /api/news/ and GET /api/news/insider/ now take a page_size query parameter. Pro keys can request page_size=50 to receive 50 articles per page instead of the default 10 — fewer round-trips to walk the feed. Free and Basic keys stay at 10.
  • Only 10 and 50 are accepted; any other value returns 400, and page_size=50 without a Pro key returns 400. Cursor pagination is otherwise unchanged — pass each response's next_cursor back as cursor regardless of page size.
  • This brings the REST feed in line with the MCP server, which already served Pro callers 50 results per page. Full parameter reference in the OpenAPI spec (now 1.9.0).

Crypto and global equities join the symbol universe

  • Cryptocurrencies are now first-class symbols. The top ~200 coins by market cap are returned by GET /api/symbols and the MCP alphai_tickers tool, with asset_type: "Crypto". Crypto tickers carry a -USD quote suffix — BTC-USD, ETH-USD, SOL-USD — so they never collide with the US spot-crypto ETF tickers.
  • The symbol shape gained two fields, country and currency, and ticker path parameters now accept the suffixed form (e.g. /api/symbols/BTC-USD/). Full reference in the OpenAPI spec (now 1.8.0).
  • Crypto news is now classified and tagged: an article about a coin lands under the crypto category with the coin's -USD ticker, so it flows into /api/news, alphai_ticker_news, and the other feed and ticker surfaces.
  • Foreign (non-US) equities are now in the universe too. Listings from global exchanges — London (LSE), Frankfurt (XETR), EURONEXT, Tokyo (TSE), Hong Kong (HKEX), Korea (KRX), … — are returned by GET /api/symbols and the MCP alphai_tickers tool. They carry the Yahoo-style ticker suffix — VOD.L, 7203.T, 0700.HK, 005930.KS, MC.PA — with exchange set to the venue prefix and country / currency populated.
  • News about a foreign-only company is tagged with its suffixed ticker, so it flows into /api/news, alphai_ticker_news, and the other ticker surfaces. For companies that also trade in the US, news prefers the US listing — e.g. Toyota coverage lands on TM, not 7203.T.

Two-layer rate limits: per-minute burst + per-day volume

  • REST and MCP rate limits are now two layers per tier — a per-minute burst cap and a per-day volume cap; a request passes only when both are under budget. Current limits, applied independently to REST and MCP: Free 20/min · 100/day, Basic 60/min · 10,000/day, Pro 300/min · 100,000/day.
  • The X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers now report your daily volume budget, with Reset at the next 00:00 UTC. A per-minute burst surfaces only as a 429 with a short Retry-After (a daily-cap block caps Retry-After at 3600s).
  • On MCP, a 429 body now includes a window field — "minute" or "day" — so you can tell a burst from a daily cap.
  • The Free tier is now for evaluation / non-commercial use; production or commercial workloads require a paid plan. See pricing.
  • Ticker discovery on MCP (alphai_tickers) now ranks ticker-prefix matches ahead of company-name matches for the q filter — so q=NV returns NVDA, NVAX, … first, then names that merely contain "nv".
  • The default relevance floor dropped from 6 to 4. /api/news/, the MCP query tools (alphai_news_search, alphai_ticker_news, alphai_insider_news, alphai_pair_analysis) and the site feeds now return articles scoring 4+ by default instead of 6+ — more depth per ticker. Pass a higher min_relevance to restore the stricter view. Trending (alphai_trending) keeps its 8+ bar.

Insider transactions: direct vs. indirect

  • Insider (SEC Form 4) news now carries an ownership_form field — "direct" or "indirect", and null on non-insider news. It sits at original.ownership_form on the REST feed and at the top level of every MCP news item.
  • One Form 4 can report a sale from an insider's direct holdings and from indirect holdings (e.g. a trust or fund) as two items that share the same filing URL and date. They are distinct economic events — sum them, don't dedupe by URL or accession number. Indirect items are now also flagged in the headline with (indirect holdings).
  • Full field reference in the OpenAPI spec.

Official Python and TypeScript SDKs

  • Typed clients now wrap all nine REST endpoints, so you can skip hand-rolling requests: pip install alphai-sdk (import alphai) or npm install alphai-sdk (import AlphaAI).
  • Both ship cursor auto-pagination, automatic retries on 429/5xx with Retry-After backoff, typed errors, and rate-limit inspection. They read ALPHAI_API_KEY from the environment and target api.alphai.io by default. The Python client offers sync and async; the TypeScript client runs on Node, browsers, edge, Deno, and Bun with zero runtime dependencies.
  • Get them on PyPI and npm, with quickstarts on the developers page. The REST contract is unchanged — the SDKs are entirely optional.

Story clustering — one row per story, not per reprint

  • When one event is reported by many outlets, you can now collapse the reprints into a single row. Pass ?collapse=story on /api/news/, or collapse_stories=true on the MCP alphai_news_search and alphai_ticker_news tools, to get one representative article per story instead of every syndicated copy.
  • Collapsed items carry three new fields: story_id (the representative's UID, resolvable via /api/news/{uid}/), sources_count (how many outlets ran the story — a corroboration signal), and sources (the distinct source domains). They are null in the default, uncollapsed feed.
  • Trending surfaces now collapse reprints by default: /api/news/trending/ and the MCP alphai_trending / alphai_actionable_now tools return one entry per story, keeping the highest-ranked copy.
  • Full field reference in the OpenAPI spec and on the developers page.

SEC 8-K corporate events in the feed

  • A new category, corporate_actions, surfaces issuer 8-K events straight from SEC EDGAR — earnings, material agreements, new debt, executive changes, and annual-meeting vote results — enriched with per-ticker analysis like the rest of the feed. On these rows source reads SEC EDGAR 8-K.
  • Filter them with ?category=corporate_actions on /api/news/ (CSV or repeated to combine with other buckets), or the category argument on the MCP alphai_news_search tool.
  • Relevance tracks event materiality: earnings and completed acquisitions score 7; material agreements, new debt, executive changes, and annual-meeting results score 6 — at the default min_relevance feed floor, so they appear without any filter.

Insider data, tickers, and quota headers in the contract

  • Form 4 insider news arrives one article per filing event: all of a filing's trades of one type (and holding form) collapse into a single item. The title carries the event's total dollar value; the summary carries total shares, the volume-weighted average price with the executed range, and the trade count — a 10b5-1 ladder sale is one article, not one per price tranche.
  • Relevance scores for Form 4 articles are computed from the whole event — tranches sum before the size bands apply — so a plan sale executed across dozens of small steps scores by its total, and min_relevance filters see it accordingly.
  • Every news response now carries enrichment.tickers — the validated symbols the article mentions (only tickers present in /api/symbols/), the same top-level list the MCP server returns. Per-ticker detail stays in ticker_analysis.
  • Every keyed response now carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, so you can watch your remaining budget without provoking a 429 — which still adds Retry-After.
  • Errors on the API surface are JSON end to end: unknown paths now answer {"message": "Not found."} with the same shape as every other API error.
  • /api/symbols/ takes optional limit and offset params — slice the ~10k-ticker list instead of downloading it whole. Without them the full bare array comes back unchanged; the list is alphabetical by ticker either way.
  • OpenAPI 1.3.0 at /api/schema/ now covers the per-ticker rollups: /api/symbols/{ticker}/sentiment-summary/ (7-day bullish / neutral / bearish counts) and /insider-summary/ (30-day Form 4 stats: buy/sell counts, dollar volumes, 10b5-1 share, top insiders) — with full response schemas.
  • Also added to the spec: the market_movers category (13 total), Symbol.exchange, and the exclude_categories filter on /api/news/.
  • alphai_actionable_now takes a new min_actionability parameter. The feed is gated to articles the enricher scored actionability="high" — a concrete decision to act on today — so an empty list outside US market hours means a quiet tape, not an error. Pass min_actionability="medium" to also include stories that shape a position over days or weeks; the default stays "high".
  • /developers gained a dedicated insider-data guide with live playground presets; /mcp now carries the full 11-tool reference — including alphai_actionable_now (breaking, high-actionability news) and alphai_pair_analysis (cross-ticker read-across) — plus a per-plan limits table.

Relevance scoring recalibrated

  • Scores now rate the article, not the company it mentions: a recap of a mega-cap's week-old earnings scores low; a small-cap's fresh FDA approval scores high.
  • Scoring is deterministic — the same article always gets the same score — and SEC Form 4 rows are scored from the transaction itself (size, buy vs. sell, 10b5-1 plan or not) rather than by the model.
  • If you filter on min_relevance, expect cleaner separation: derivative coverage drops out of the mid band, and the ≥8 band in /api/news/trending/ tightens to primary, market-moving disclosures.

api.alphai.io — a dedicated API host

  • New key-only base URL that bypasses the website CDN: no shared edge cache between your bot and the data, predictable latency. The same routes on alphai.io keep answering as before.
  • The OpenAPI spec at api.alphai.io/api/schema/ is downloadable without a key.

Public launch: REST API, MCP server, insider feed, alerts

  • REST API with API-key auth and hourly tiers — Free 100, Basic 1,000, Pro 10,000 — plus an OpenAPI 3.1 contract at /api/schema/.
  • MCP server at mcp.alphai.io: OAuth 2.1 with dynamic client registration and PKCE, Streamable HTTP, flat deterministic response shapes keyed by article uid.
  • SEC Form 4 insider transactions surfaced as first-class news rows (category=insider) shortly after EDGAR publication.
  • Ticker news alerts over email, with Pro webhooks: HMAC-SHA256-signed deliveries (Stripe-style X-Alphai-Signature) and exponential-backoff retries.

Earlier history predates the public API. Questions about a change? Get in touch.