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.
{
"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"
}{
"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.
(+ticker:TSLA OR +ticker:NVDA) AND ("earnings" OR "guidance") AND NOT cryptoReliability
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
Other ways to connect
Beyond WebSocket streaming
The dual-stream pattern is one integration. finlight also offers REST and webhook delivery.
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.
Still Have Questions?
Our developer-first support team is here to help you integrate and scale.
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.
