finlight Logo
+

News API for Trading Systems

Two streams, one article. The raw stream delivers the headline the moment finlight ingests it. The enriched stream follows with sentiment, tickers, and entities about 28 seconds later. Your system reacts first and refines second.

How it works

The same article, twice

This is what the dual-stream pattern looks like on the wire. First the raw message, then the enriched version of the same article, matched by link.

Raw stream, wss://wss.finlight.me/raw
{
  "title": "S&P 500, Dow futures inch up as MidEast hopes offset SpaceX, AMD drag",
  "link": "https://www.reuters.com/business/...",
  "source": "www.reuters.com",
  "summary": "Contracts tracking the S&P 500 and the Dow edged up on Wednesday ...",
  "language": "en",
  "publishDate": "2026-08-05T09:32:26.959Z",
  "createdAt": "2026-08-05T09:32:41.103Z"
}
Enriched stream, ~28s later, same link
{
  "title": "S&P 500, Dow futures inch up as MidEast hopes offset SpaceX, AMD drag",
  "link": "https://www.reuters.com/business/...",
  "sentiment": "positive",
  "confidence": "0.9702919721603394",
  "categories": ["business", "markets"],
  "countries": ["US"],
  "companies": [
    {
      "ticker": "NVDA",
      "name": "NVIDIA Corporation",
      "exchange": "XNAS",
      "isin": "US67066G1040"
    },
    {
      "ticker": "AMD",
      "name": "Advanced Micro Devices, Inc.",
      "exchange": "XNAS",
      "isin": "US0079031078"
    }
  ]
}

Payloads abbreviated. Each company entity carries a primary listing plus cross-listings by exchange (MIC codes), so one article maps to instruments across markets. Full field reference in the docs. docs.

Get started

The dual-stream pattern in your language

Subscribe to both streams with one client. React on the raw message, enrich when the full data arrives. Only the API key is missing.

import { FinlightApi } from 'finlight-client'

const api = new FinlightApi(
  { apiKey: process.env.FINLIGHT_API_KEY! },
  { takeover: true },
)

const seen = new Map<string, number>()

// Raw stream: instant delivery, react immediately
api.rawWebsocket.connect({ language: 'en' }, (raw) => {
  seen.set(raw.link, Date.now())
  if (/earnings|acquisition|merger|FDA|rate decision/i.test(raw.title)) {
    console.log(`[SIGNAL] ${raw.title} (${raw.source})`)
    // your reaction logic here
  }
})

// Enriched stream: sentiment, entities, tickers
api.websocket.connect({ language: 'en', includeEntities: true }, (article) => {
  const t = seen.get(article.link)
  const delta = t ? `${((Date.now() - t) / 1000).toFixed(1)}s after raw` : 'new'
  console.log(`[ENRICHED] ${article.title} (${delta})`)
  console.log(
    `  sentiment=${article.sentiment} confidence=${article.confidence}`,
  )
  console.log(`  tickers=${article.companies?.map((c) => c.ticker).join(',')}`)
  seen.delete(article.link)
})

The SDKs handle reconnection, heartbeats, and connection rotation. Install with npm install finlight-client or pip install finlight-client.

Honest comparison

If you were going to build this yourself

A scraper fleet plus an RSS poller gets you headlines, and for a single source with no deduplication needs, that can be the right call. The cost shows up later: the same story arriving five times from five aggregators, publisher markup changes breaking parsers at 3 a.m., and a sentiment model you now maintain alongside your strategy. Generic news APIs remove the scraping but keep the noise, since ticker mapping and finance-relevant source curation are exactly the parts they skip. finlight's job is that middle layer: deduplicated ingestion, entity and ticker tagging, sentiment, and a stream architecture that separates reaction speed from data depth.

Latency

What "about 28 seconds" means, precisely

Latency claims in this market mix up four different clocks: when the publisher posted, when a provider discovered the article, when it was indexed, and when it reached you. We publish one number, and it is internally measured: on average, the raw stream delivers an article about 28 seconds before the enriched version of the same article. That is the enrichment pipeline cost (sentiment analysis, entity resolution, ticker matching), which the raw stream skips entirely. We do not publish an end-to-end publication-to-delivery figure, because that number depends on publisher timestamps we do not control. If a vendor gives you a single millisecond figure without saying which clock it measures, ask.

The dual-stream pattern turns that delta into an advantage: the raw message tells your system an article exists and lets a headline filter fire immediately. The enriched message arrives while your position logic is still warm and adds sentiment, confidence, and tagged instruments. If you only need enrichment for a subset of articles, skip the enriched stream and call GET /v2/articles/by-link on demand for the ones that matter.

Read the engineering story behind the raw stream: How I Cut 28 Seconds Off Financial News Delivery

Query language

Filter at the source, not in your code

The stream and the REST API share one query language. Filter by ticker:NVDA, exchange:NASDAQ, isin:US0378331005, by source domain, by language, with full boolean logic (AND, OR, NOT, parentheses, exclusions like -source:finance.yahoo.com). Server-side filtering means your system only processes messages it would have acted on anyway.

Example query
(+ticker:TSLA OR +ticker:NVDA) AND ("earnings" OR "guidance") AND NOT crypto

Reliability

Built for systems that run unattended

Connections rotate on a schedule, so the SDKs manage heartbeats and reconnection for you. Rate limits are enforced at the edge, so a misbehaving client fails fast instead of degrading your feed. REST access covers historical queries and backfill, so the same query that drives your live stream also drives your research notebook.

Running a desk-level deployment? Custom sources, annual invoicing, and priority onboarding are available. You name the source, we onboard it as part of your contract. Contact us

Pricing

Plans built for streaming

Streaming access starts on the Pro Standard plan. Plans differ in request volume, WebSocket connections, and dispatch quotas.

Pro Standard

1 concurrent WebSocket connection, streaming access included

Pro Scale

3 concurrent WebSocket connections for multi-stream setups

Compare all plans on the pricing page

Frequently Asked Questions

Trading Systems API Questions

Common questions about using finlight for trading system integrations.

Streaming access starts on the Pro Standard plan. Plans differ in request volume, WebSocket connections, and dispatch quotas. Current prices and limits are on the pricing page.

Test it against your own signal logic

The fastest way to evaluate a news feed is to point your filter at it. Get a key, run the dual-stream example, and watch the delta on live articles.

Running a desk-level deployment? Talk to us.