---
title: "Search"
method: GET
path: "/api/v1/search"
tags: ["Search"]
---

# Search

`GET /api/v1/search`

## Request

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

Search across articles, stories, companies, countries, exchanges, and indices. Results are grouped by resource type and ranked by relevance. Use `type` to limit which resource types are searched.

## Query parameters

- `q` string, required
- `type` string
- `limit` integer

## Response `200`

Search results

- SearchResult
  - `results` object, required
    - `articles` ArticleSummary[]
      - `id` string, required: Unique article identifier
      - `title` string, required: Article title in English. Machine-translated when the source article is not in English.
      - `article_url` string, required: Link to the original article
      - `content_type` 'news' | 'analysis' | 'press_release' | 'market_commentary' | 'market_news' | 'trading_halt' | 'trading_event' | 'other', required: Type of article content
      - `published_at` string, date-time, required: When the article was published by its source (ISO 8601). This is editorial time, not the time the article reached this API. 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.
      - `category` object, required: Article category
        - `id` string
        - `name` string
      - `source` object, required: The news source that published this article
        - `id` string: Unique source identifier
        - `name` string
        - `domain` string
        - `source_type` 'news_publication' | 'wire_service' | 'press_release' | 'government' | 'trade_publication' | 'blog' | 'stock_exchange' | 'research'
      - `company_ids` string[], required: IDs of companies mentioned in the article
      - `country` string, nullable, required: Country code (ISO 3166-1 alpha-2)
      - `event_id` string, nullable: ID of the event this article belongs to. Null when the article has not been assigned to an event yet. An event that has since been merged or removed still answers `GET /events/{id}` with a tombstone rather than a 404.
    - `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.
    - `companies` CompanySummary[]
      - `id` string, required: Unique company identifier
      - `name` string, required: Company name
      - `slug` string, required: URL-friendly company name
      - `ticker` string, nullable: Primary stock ticker (null if unlisted)
      - `isin` string, nullable: ISIN of the primary listing. Null if unlisted or unknown.
      - `former_tickers` string[], required: Tickers the company was formerly listed under, from delisted or renamed listings, excluding any that are still a current ticker. Always present; empty when none. The ticker filter resolves former tickers as well as the current one, so a match on an old ticker still returns the company; this field tells you the ticker you searched by is historical.
      - `is_active` boolean: Whether the company is currently active/operating
      - `exchange` object, nullable: Primary exchange where the company is listed
        - `id` string: Exchange identifier
        - `name` string: Exchange display name
        - `mic_code` string: ISO 10383 Market Identifier Code
      - `market_segment` 'large_cap' | 'mid_cap' | 'small_cap' | 'first_north_premier' | 'first_north_growth', nullable: Cap segment of the primary listing. Set only for Nasdaq Nordic markets (Stockholm, Helsinki, Copenhagen, Iceland and First North); null elsewhere, when unlisted, or when `exchange` is null. `first_north_premier` and `first_north_growth` are First North's Premier and Growth markets.
      - `also_listed_on` object[], required: The company's other active listings, excluding the primary listing above: cross-listings on other exchanges and additional share classes (which may be on the same exchange). Always present; empty when the company is single-listed or unlisted. The row's ticker, isin and exchange fields are the primary listing only. Company detail stock_listings is the authoritative full set.
        - `ticker` string, required: Ticker on this secondary exchange
        - `isin` string, nullable: ISIN of this listing. Null when unknown.
        - `mic_code` string, required: ISO 10383 Market Identifier Code of this exchange
    - `countries` CountrySummary[]
      - `id` string, required: Unique country identifier
      - `name` string, required: Country display name
      - `iso2_code` string, required: ISO 3166-1 alpha-2 country code
    - `exchanges` ExchangeSummary[]
      - `id` string, required: Unique exchange identifier
      - `name` string, required: Exchange display name
      - `mic_code` string, required: ISO 10383 Market Identifier Code
      - `acronym` string, nullable: Exchange acronym
      - `country` object: Country where the exchange is located
        - `id` string
        - `name` string
        - `iso2_code` string
    - `indices` IndexSummary[]
      - `id` string, required: Unique stock index identifier
      - `name` string, required: Index display name
      - `symbol` string, required: Index symbol
      - `pan_nordic` boolean: True if the index spans multiple Nordic exchanges (e.g. OMXN40), false if tied to a single exchange (e.g. OMXS30)
      - `exchange` object, nullable: Exchange associated with this index
        - `id` string
        - `name` string
        - `mic_code` string
  - `pagination` object, required
    - `articles` object
      - `count` integer
      - `limit` integer
    - `stories` object
      - `count` integer
      - `limit` integer
    - `companies` object
      - `count` integer
      - `limit` integer
    - `countries` object
      - `count` integer
      - `limit` integer
    - `exchanges` object
      - `count` integer
      - `limit` integer
    - `indices` object
      - `count` integer
      - `limit` integer

## Other responses

- `400`: Invalid search query
- `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)
