Before you start
Generate an API key in API key settings under Settings > API Keys, and keep it in anAPI_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
q. Results rank exact ticker matches first, then exact name matches, then listed companies ahead of unlisted ones.
cURL
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
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 atitle, 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, fetchGET /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.
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.
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 flatGET /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
window matches when an event was last active, so an event that broke earlier and then developed is included:
cURL
source_type=stock_exchange keeps events with at least one exchange newsfeed article, the lowest-latency tier:
cURL
q here is always a filter: results keep the newest-first order and the cursor, so it combines with window:
cURL
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.
News for several companies
The company routes cover one company each. To follow several at once, switch to the flatGET /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
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
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.