---
title: "List Stories"
method: GET
path: "/api/v1/stories"
tags: ["Stories"]
---

# List Stories

`GET /api/v1/stories`

## Request

- Base URL: `https://nordicfinancialnews.com`
- URL: `https://nordicfinancialnews.com/api/v1/stories`
- Auth: HTTP bearer

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.

## Query parameters

- `limit` integer
- `cursor` string
- `updated_after` string
- `q` string
- `sort` 'relevance' | 'latest'
- `mode` 'semantic'
- `country` string
- `category` string
- `sources` string
- `ticker` string
- `company` string
- `exchange` string
- `market` string
- `domicile` string
- `index` string
- `sector` string
- `market_segment` string
- `listed` string
- `watchlist` string
- `published_after` string
- `published_before` string
- `fields` string

## Headers

- `If-None-Match` string
- `If-Modified-Since` string

## Response `200`

Stories retrieved

- object
  - `stories` StorySummary[]
    - `id` string, required: Unique story identifier
    - `title` string, required: Story title
    - `summary` string, required: Story summary
    - `article_count` integer, required: Number of articles in this story (matches the length of article_ids)
    - `published_at` string, date-time, required: When the story's newest source article was published (ISO 8601). This is editorial time, not the time the story reached this API: a story about older news carries an older date. Use it to filter by when news happened, never to track what is new to you.
    - `updated_at` string, date-time, required: When this record last changed (ISO 8601). This is the clock incremental sync runs on. It only ever moves forward, unlike published_at. To sync: pass your last completed sync time as `updated_after`, drain every page via `pagination.next_cursor`, and only then advance your stored timestamp.
    - `article_ids` string[]: IDs of articles in this story, most relevant first
    - `country` string, nullable: Country code (ISO 3166-1 alpha-2)
    - `company_ids` string[]: IDs of companies mentioned in this story
    - `category` object: Story category
      - `id` string
      - `name` string
    - `event_id` string, nullable: ID of the event this story was generated from. An event that has since been merged or removed still answers `GET /events/{id}` with a tombstone rather than a 404.
  - `pagination` object
    - `count` integer
    - `next_cursor` string, nullable
  - `plan_limited` boolean: 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.

## Other responses

- `304`: Not Modified
- `401`: Unauthorized

---

[API](https://skmtc.dev/nordicfinancialnews/apis/nordic-financial-news-api.md) - [All operations](https://skmtc.dev/nordicfinancialnews/apis/nordic-financial-news-api/llms.txt) - [OpenAPI document](https://skmtc.dev/nordicfinancialnews/apis/nordic-financial-news-api/revisions/aa48db8c82fc?raw)
