Stories

List Stories

Returns a paginated list of published stories ordered by publication date (newest first). Each story synthesizes coverage of a single developing event from multiple source articles into one narrative.

Filtering

Supports filtering by country, category, source, and company ticker. Use GET /api/v1/sources to discover source IDs for the sources filter.

Search

Use q for full-text search: relevance-ranked by default, newest-first with sort=latest, or matched by meaning with mode=semantic.

Polling for updates

Use updated_after for incremental syncing.

Caching

Requests with updated_after are not cached: they return Cache-Control: no-cache, no-store and no ETag. The ETag reflects the response as served, not only record timestamps: it changes when plan limits alter the visible set, and when a story's visible article set changes, so a changed ETag does not necessarily mean a record was updated.

get/api/v1/stories

Request

Query parameters

limitinteger

Number of stories to return per page (default 25, max 100).

cursorstring

Opaque pagination cursor returned as pagination.next_cursor from a previous response. Mutually exclusive with q unless sort=latest is also given.

updated_afterstring

ISO 8601 datetime. Returns only stories updated after this timestamp. Use this for incremental sync: store the timestamp of your last completed sync, then request only newer results on each poll. Results are ordered by updated_at ascending and are cursor-paginated. Follow pagination.next_cursor, resending the same updated_after value, until it is null. Only advance your stored timestamp once you have drained every page (see the Real-Time Updates guide at https://docs.nordicfinancialnews.com). Mutually exclusive with sort=latest (with or without q). An updated_after walk is always ordered by updated_at.

qstring

Full-text search query (2-200 characters). By default, results are ranked by relevance instead of publication date, as a single page with no cursor. Mutually exclusive with cursor unless sort=latest is also given. Disables caching.

sort'relevance' | 'latest'

Result order for q. relevance (default) is a single relevance-ranked page with no cursor; it requires q, and returns 400 without one. latest turns q into a match filter under the endpoint's normal newest-first order (published_at descending) and the response is cursor-paginated like any other request; without q it is an accepted no-op (that's already the default order). Mutually exclusive with updated_after.

mode'semantic'

Set to semantic to match q by meaning rather than by keyword. The match runs over each story's title, summary and key entities. The narrative body is not part of the match, so it answers thematic questions a keyword match cannot ("defense contract wins", "battery cell capacity expansion").

Requires q, is mutually exclusive with sort, cursor and updated_after, and returns a single ranked page capped by limit; every other filter (country, category, sources, ticker, company, market, domicile, exchange, index, sector, market_segment, watchlist, published_after/published_before) remains a hard filter applied before the match, not after.

Each story gains a distance (raw cosine, lower is closer, rounded to 4dp). Compare it only within one response, never across responses: the scale is model-dependent. Ranking also blends in a small recency bonus that distance does not reflect. A server-side relevance floor drops weak matches, so a page is frequently shorter than limit and can be empty. Raising limit does not recover floored rows.

On restricted plans, the story age window narrows the candidate set and the story count cap applies as a clamp on this page, so a capped plan receives its closest matches rather than its newest stories; either restriction sets plan_limited: true.

The response pagination object carries count only. There is no next_cursor, since a distance ranking cannot be cursor-paginated, and the response is uncacheable (Cache-Control: no-cache, no-store, no ETag). If the query cannot be embedded the request returns 503 rather than silently falling back to keyword matching.

countrystring

Filter by country using ISO 3166-1 alpha-2 code (e.g. SE, NO, DK). Comma-separated for multiple (e.g. SE,NO). Case-insensitive.

categorystring

Filter by category id (from GET /api/v1/categories). Comma-separated for multiple (e.g. cat_earnings1,cat_mna000001); unknown ids are ignored.

sourcesstring

Comma-separated list of source IDs (max 25). Use GET /api/v1/sources to discover source IDs. Also accepts array form (sources[]=id1&sources[]=id2). Returns stories with at least one article from a listed source.

tickerstring

Filter by company stock ticker symbol, comma-separated for several (e.g. VOLV-B or VOLV-B,ERIC-B; matches any of them). Accepts full tickers with exchange suffix (e.g. VOLV-B.ST). Returns stories mentioning the company. Former tickers resolve too: a company that renamed or moved venues is still reachable by an old ticker; the returned company former_tickers lists any such historical tickers. Matching is case-insensitive. Every value must resolve to a company, or the request is rejected with 400 naming the unknown values. Combined with company, the two filters intersect.

companystring

Filter by company id (as returned by the companies endpoints), comma-separated for several (matches any of them). Complements ticker; use this to reach companies without a stock listing. Every value must resolve, or the request is rejected with 400 naming the unknown ids. Combined with ticker, the two filters intersect.

exchangestring

Filter by exchange using ISO 10383 Market Identifier Code, comma-separated for multiple (e.g. XSTO for Nasdaq Stockholm, XCSE for Nasdaq Copenhagen, XHEL for Nasdaq Helsinki, XOSL for Oslo Børs). Returns stories about companies actively listed there. Case-insensitive.

marketstring

Filter to stories about companies with an active equity listing in these countries' exchanges (ISO 3166-1 alpha-2, comma-separated, e.g. SE,NO). SE covers Nasdaq Stockholm, First North, Spotlight and NGM. Distinct from country (the source that reported it) and domicile (legal domicile). Includes foreign-domiciled but locally-listed issuers.

domicilestring

Filter to stories about companies legally domiciled in these countries (ISO 3166-1 alpha-2, comma-separated). Reaches unlisted companies; excludes foreign-domiciled but locally-listed issuers. Use market for market-coverage questions.

indexstring

Filter by stock index id or symbol (e.g. OMXS30, OMXC25, OMXH25, OBX). Returns stories about companies in that index. Case-insensitive for symbols.

sectorstring

Filter by company sector. Case-sensitive; must exactly match one of: Communication Services, Consumer Discretionary, Consumer Staples, Energy, Financials, Health Care, Industrials, Information Technology, Materials, Real Estate, Utilities.

market_segmentstring

Filter by the cap segment of a story company's primary listing. Comma-separated; a row matches any listed value: large_cap, mid_cap, small_cap, first_north_premier, first_north_growth (also in /meta market_segments). Case-sensitive; an unknown value returns 400. Segments exist only for Nasdaq Nordic markets (Stockholm, Helsinki, Copenhagen, Iceland and First North), so companies listed only elsewhere never match. Secondary listings don't count.

listedstring

When true, only return stories linked to at least one company with an active listing on any exchange. A company whose listings are all delisted does not count. Hidden and unverified companies do not count.

watchliststring

Restricts to stories mentioning companies in a single watchlist, identified by its id (from the List Watchlists endpoint). An unknown id returns no stories. Requires read:watchlist scope.

published_afterstring

ISO 8601 datetime, or YYYY-MM-DD for 00:00 UTC. Returns stories published on or after this timestamp.

published_beforestring

ISO 8601 datetime, or YYYY-MM-DD for 00:00 UTC. Returns stories published before this timestamp.

fieldsstring

Comma-separated list of fields to include in the response. Available fields: id, title, summary, published_at, updated_at, article_count, article_ids, country, category, company_ids.

Headers

If-None-Matchstring

ETag value from a previous response. Returns 304 Not Modified if data has not changed.

If-Modified-Sincestring

HTTP date from a previous Last-Modified header. Returns 304 Not Modified if nothing has changed since.

Response

Stories retrieved

plan_limitedboolean

Present and true when your plan restricted what this endpoint can return, so the result may be incomplete. Absent when your plan applies no restriction.

Example response

{
  "stories": [
    {
      "id": "story_volvo_q3",
      "title": "Volvo Reports Record Q3 Results",
      "summary": "Volvo reported record third-quarter earnings, beating analyst expectations...",
      "article_count": 4,
      "published_at": "2026-03-15T09:30:00.000Z",
      "updated_at": "2026-03-15T09:35:00.000Z",
      "article_ids": [
        "art_abc123def",
        "art_def456ghi"
      ],
      "country": "SE",
      "company_ids": [
        "uejazctgchj4"
      ],
      "event_id": "8fzq2rmtnk5c"
    }
  ],
  "pagination": {
    "count": 25
  },
  "plan_limited": true
}

Changes

No recorded changes to this operation across all 1 revision of this API.