Skip to main content
Nordic business news is scattered across dozens of local-language sources, and speaking one Nordic language doesn’t cover the other four. This API collapses that into one request: pass a ticker to get a company’s news in English, translated within minutes of publication and grouped into events.

Before you start

Generate an API key in API key settings under Settings > API Keys, and keep it in an API_KEY environment variable. Every request below sends it as Authorization: Bearer $API_KEY against https://nordicfinancialnews.com/api/v1. See Authentication for scopes and rate limits.

Step 1: Find the company

Every company route takes a company ID or a ticker as its path identifier. Plain symbols, exchange-suffixed forms, and former tickers all resolve. Matching is case-insensitive.
cURL
If you only have a name, search with q. Results rank exact ticker matches first, then exact name matches, then listed companies ahead of unlisted ones.
cURL
A few symbols are shared by more than one company. The API returns the one holding a listing on a Nordic exchange, then the one with an active listing, then the most recently listed. Pass the company id when the lookup has to be unambiguous.
When you already hold identifiers, resolve them as a batch rather than one at a time. company takes up to 25 company id values and ticker up to 25 tickers, so a page of events costs one request per 25 distinct companies rather than one per company.
cURL
Rows come back in name order rather than the order you asked for, so key each one by its own id. Every value has to resolve, or the request fails with a 400 naming the ones that did not. Here a shared symbol resolves to every issuer using it instead of tie-breaking to one, so a batch can return more rows than it sent: follow next_cursor rather than assuming a single page. Cross-listings and multiple share classes are common in the Nordics, so check also_listed_on on company detail to see a company’s other venues.

Step 2: Get the company’s events

An event groups related coverage of one development, such as an earnings report, an acquisition, or a CEO change, with the source articles attached. An announcement covered by a filing, a newswire, and three local papers arrives once. Each event carries a title, an event_type, a significance tier, the company_ids involved, and an article_count.
Response
significance sorts events into three tiers. notable marks material developments, routine covers ledger records such as scheduled filings, and commentary holds opinion, analysis, and market wraps. The route returns all three unless you filter, and for a widely covered company, commentary can outnumber everything else. significance=notable,routine drops the commentary, and significance=notable keeps only material developments. The route returns events in which the company is a principal party, such as the subject, acquirer, target, or partner. Events where it only advised, was quoted, or was mentioned in passing are left out. Add include_peripheral=true to include them as well. event_type can be null, so guard for it as the examples above do. Events come back newest first, ordered by when each was first reported, and are cursor-paginated. See Pagination for the cursor walk. Events sometimes merge when two turn out to be the same development. Poll with updated_after and a merged event comes back as a short tombstone whose merged_into names the survivor; List events covers the sync contract.
An event appears only when at least one of its articles falls inside your plan’s source list and recency window. article_count counts every article, so it can be higher than the number your plan can fetch. plan_limited: true means your plan caps how many events this feed returns. A company request returns that company’s newest events rather than a slice of the platform feed, so the filters below narrow within the company’s own set. See the pricing page for current limits.

Step 3: Open an event

The list row is enough for a feed. For the full record, fetch GET /events/{id}. The detail adds a summary that updates as coverage develops, and companies with each company’s name and ticker. article_ids lists the articles your plan can reach, oldest first. primary_disclosure_article_id points at the earliest official source your plan can reach, such as a stock exchange notice or a company release on a newswire. On a restricted plan it can be a later official copy, or null.
An article is a single news item from a single source. It carries an English title, a summary, key_points, the publishing source, a content_type, and article_url pointing at the full original-language article. Pass an event’s article_ids to ids to fetch up to 100 in one request. Each article also carries event_id (null when it belongs to no event), so you can walk back from an article to its event. A story is a longer AI-synthesized narrative, written for larger developments and built from the same sources. When one exists, its ID is in the event’s story_ids. Fetch GET /stories/{id} for the full account, which arrives as Markdown in the content field.
An event’s title and summary, and an article’s title, summary, and key_points, are AI-generated from machine-translated coverage. They are not verbatim quotations and they are not human-verified. Link to article_url when a reader needs the original wording.

Events, articles, or stories?

The company’s full article feed is available at GET /companies/{identifier}/articles, and its stories at GET /companies/{identifier}/stories.

Step 4: Filter the feed

The events route takes the same filters as the flat GET /events feed, applied to the company in the path. The ones you reach for first: Add fields to trim the payload. category takes IDs from GET /categories. Event type slugs are hyphenated, and an unrecognized one returns 400. The calendar’s underscored event_type values are a different vocabulary, so don’t reuse one for the other. The company’s material earnings and M&A news:
cURL
What happened this week. window matches when an event was last active, so an event that broke earlier and then developed is included:
cURL
Only developments with an exchange disclosure behind them. source_type=stock_exchange keeps events with at least one exchange newsfeed article, the lowest-latency tier:
cURL
A keyword search inside the company’s events. Unlike on articles, q here is always a filter: results keep the newest-first order and the cursor, so it combines with window:
cURL
The articles route has its own filters for working at the report level: published_after, published_before, primary_only, content_type, and relevance-ranked q. content_type says what kind of item an article is: Only the company’s press releases:
cURL
source_type takes news_publication, wire_service, press_release, government, trade_publication, blog, stock_exchange, or research on both routes. Coverage lists which publishers fall into each group.
The company routes reject parameters that would describe a different company or listing: ticker, company, watchlist, listed, exchange, market, domicile, index, and sector. Sending one returns 400. The path already fixes the company. To cover several companies, see below.

News for several companies

The company routes cover one company each. To follow several at once, switch to the flat GET /events feed. There, ticker and company each take a comma-separated list of up to 25 values and match any of them. Send both and they intersect, like any other pair of filters. The flat GET /articles and GET /stories feeds take the same lists.
cURL
To select companies by group rather than by name, the same feeds take watchlist, index (OMXS30), sector, exchange, market, and domicile, alongside every filter from step 4. Use market for companies listed on a country’s exchanges and domicile for those legally registered there. This week’s earnings reports across the OMXS30:
cURL
Every value in a ticker or company list has to resolve to a company the API publishes. One typo fails the whole request with a 400 and Unknown ticker(s): VOLVB, rather than quietly dropping that company from the feed. index and exchange go the other way. An unrecognized code there never errors: it drops out of the filter, or returns an empty page when nothing in it matches.

Next steps

Real-time updates

Poll with updated_after to keep a local mirror in sync.

Caching

Send If-None-Match and skip the payload when nothing changed.

CLI

Run nfn companies articles VOLV-B without writing code.

MCP server

Ask an AI assistant what happened to a company, grouped by event type.
Last modified on September 30, 2026