nordfeed API
Nordic regulatory press releases as structured JSON, seconds after publication. Base URL: the host you were given. Every timestamp is UTC. OpenAPI · status
Authentication
Send your key in the X-API-Key header (or Authorization: Bearer). For the stream, ?api_key= is accepted because browsers cannot set headers on EventSource.
curl -H "X-API-Key: $KEY" "$HOST/v1/reports?limit=5"
The envelope
Every item, whatever its type, has the same outer shape. payload depends on type.
{
"id": "evt_10545",
"type": "report",
"company": "Bilia",
"isin": "SE0009921588",
"tickers": ["XSTO:BILI A"],
"market": "SE",
"published": "2026-07-17T06:00:00Z", // the source's publication time
"received": "2026-07-17T06:00:01Z", // our poller saw it
"structured": "2026-07-17T06:00:03Z", // parsing done
"source": "mfn",
"source_url": "https://mfn.se/a/bilia/andra-kvartalet-2026",
"correction": false,
"review_status": "auto", // or "needs_review"
"confidence": 0.95,
"payload": { ... }
}
review_status is needs_review when confidence is below 0.85: key fields missing, the model and the rules disagree, or a sanity check fired. Treat those as provisional.
Reports
GET /v1/reports
| parameter | meaning |
|---|---|
isin | one company |
ticker | e.g. BILI A or XSTO:BILI A |
company | name contains |
latest=1 | one item per company, the newest report |
period | 2026-Q2, 2026-H1, 2026-9M, 2026-FY |
sector | general, real_estate, bank, investment_company, insurance |
since, until | publication time, RFC 3339 or a date |
review_status | auto or needs_review |
limit | default 50, max 500 |
Report payload: figures per field with unit, comparison and confidence. Units are MSEK, KSEK, MEUR and so on; per-share fields carry the bare currency. yoy is the change against the comparison figure the release itself gives.
"payload": {
"period": "2026-Q2", "report_period": "2026-Q2", "sector": "general", "currency": "SEK", "unit": "MSEK",
"fields": {
"revenue": { "value": 10908, "unit": "MSEK", "yoy": 0.034, "confidence": 0.95, "source": "prose+model" },
"ebit": { "value": 362, "unit": "MSEK", "yoy": 0.121, "confidence": 0.95, "source": "prose+model" },
"net_income": { "value": 230, "unit": "MSEK", "yoy": 0.198, "confidence": 0.95, "source": "prose+model" },
"eps_basic": { "value": 2.50, "unit": "SEK", "yoy": 0.202, "confidence": 0.95, "source": "prose+model" }
},
"stages": ["prose", "model_verify"]
}
| sector | fields |
|---|---|
| general | revenue, ebit, ebita, ebitda, profit_before_tax, net_income, eps_basic, operating_cash_flow; _adjusted variants when the release states them |
| real_estate | rental_income, net_operating_income, property_management_income, property_value_change, nav_per_share, net_income, eps_basic |
| bank | net_interest_income, net_commission_income, total_income, ebit, credit_losses, cost_income_ratio, cet1_ratio, return_on_equity, net_income, eps_basic |
| investment_company | nav_per_share, nav_total, value_change, net_income, eps_basic |
| insurance | premiums, underwriting_result, combined_ratio, solvency_ratio, profit_before_tax, net_income, eps_basic |
A field's period is set only when it differs from the report period (a half-year figure in a quarterly report).
Events
GET /v1/events
Same parameters as reports, plus type (comma separated). Extracted payloads exist for profit warnings, directed issues, rights issues, orders, bids, acquisitions, trading updates and flaggings; other types carry the classification and headline.
{ "type": "directed_issue", "company": "Moank Fintech Group AB", ...,
"payload": {
"event": "directed_issue",
"headline": "Moank Fintech Group meddelar att riktad emission om 150 MSEK är övertecknad",
"fields": { "amount": 150, "currency": "SEK", "price": 160, "shares": 937500, "discount_pct": null, "bookbuilding": false, "investors": [] },
"confidence": 0.94
} }
{ "type": "profit_warning", "company": "Envar Holding AB", ...,
"payload": {
"event": "profit_warning",
"headline": "Envar Holding AB Issues a Reverse Profit Warning Following a Significant Increase in Operating Profit",
"fields": { "direction": "positive", "metric": "EBIT", "period": "Q2 2026", "previous_guidance": null },
"confidence": 0.96
} }
Feed and polling
GET /v1/feed
Reports and events together, newest first. To poll, pass after=evt_N: you get everything structured after that id, oldest first, and next_after to use on the next call. Nothing is skipped and nothing repeats.
curl -H "X-API-Key: $KEY" "$HOST/v1/feed?after=evt_12345&limit=200"
GET /v1/feed/:id
One envelope.
Stream
GET /v1/stream
Server-Sent Events. Each envelope arrives as one event with id set to the envelope id and event set to the type. Reconnect with Last-Event-ID and you resume where you were. Filters: type, isin.
curl -N -H "X-API-Key: $KEY" "$HOST/v1/stream?type=report,profit_warning"
id: evt_12346
event: report
data: {"id":"evt_12346","type":"report", ...}
Webhooks
POST /v1/subscriptions
curl -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" "$HOST/v1/subscriptions" \
-d '{"name":"nordic smallcap","url":"https://example.com/hooks/nordfeed","types":["report","profit_warning"],"isins":["SE0009921588"]}'
Omit types or isins to receive everything. The response includes the signing secret once. Each delivery is a POST with the envelope as body and headers X-Timestamp, X-Delivery-Id and X-Signature: sha256=HMAC_SHA256(secret, timestamp + "." + body). Answer 2xx within 10 seconds. Otherwise we retry after 1 min, 5 min, 30 min, 2 h, 6 h and 24 h; after the seventh failure the delivery is marked failed and shows on the status page.
GET /v1/subscriptions
DELETE /v1/subscriptions/:id
Types
| type | what |
|---|---|
| report | interim and year-end reports, figures extracted |
| profit_warning | profit warnings and reverse profit warnings |
| directed_issue, rights_issue | share issues, terms extracted |
| order | orders and contracts, value extracted |
| bid | public offers |
| acquisition | acquisitions and divestments |
| trading_update | volume and sales updates ahead of the report: metric, value, unit, period, change |
| flagging | major holding notifications: holder, share and vote percentages, previous holding, threshold, direction |
| management_change, buyback, insider, agm, bond, nav, rating, voting_rights, ex_date, research, annual_report | classified, headline delivered |
Corrections: a release marked as a correction repeats the envelope with correction: true. Duplicate language versions of the same release are collapsed to one envelope.