---
title: "List Calendar Events"
method: GET
path: "/api/v1/calendar_events"
tags: ["Calendar Events"]
---

# List Calendar Events

`GET /api/v1/calendar_events`

## Request

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

Returns a paginated list of scheduled Nordic financial calendar events: earnings reports (Q1 / H1 / FY etc.), earnings calls, trading updates, AGMs/EGMs, capital markets days, conference presentations, dividends, and M&A milestones (announcements, offer deadlines, completions).

Each event is tied to a single company and is sorted by `scheduled_at` ascending (soonest first). `scheduled_at` is always in UTC; for local-time display use the `local_time` field (`scheduled_at` rendered in the issuer's `timezone`, ISO 8601 with offset). Prefer `local_time` for the calendar date. A day-precision event is stored at local midnight, so its UTC `scheduled_at` falls on the previous day for ahead-of-UTC (Nordic) zones. `title` and `description` are always English regardless of the source-article language.

## Dividends
Each dividend row carries a nested `dividend` object with `ex_date`, `record_date`, `payment_date`, `declaration_date`, and `kind`. `scheduled_at` follows the priority **ex-date > record-date > payment-date**, whichever is explicitly stated, in that order. `dividend` is `null` for non-dividend events.

## Default window
By default only upcoming events are returned, from today onward by the issuer's local date (so events scheduled for today stay listed throughout the day). Pass `scheduled_after` or `scheduled_before` to query a specific window. This also surfaces past events, which carry `status: published` (events flip from `scheduled` to `published` ~2 days after their date). An `updated_after` sync walk also lifts this floor, since sync must cover past events too.

## Status
List endpoints return `scheduled` + `published` events and **exclude `cancelled`** by default. Pass the `status` parameter to filter (`status=cancelled` to retrieve cancellations, or `scheduled`/`published` to narrow). Discarded events are never returned. Note: a `scheduled → cancelled` transition is *not* surfaced by default `updated_after` polling. To track cancellations, poll with `status=cancelled` or subscribe to cancellation alerts.

## Filtering
Compose `ticker`, `country`, `market`, `domicile`, `exchange`, `index`, `sector`, and `event_type` to narrow the result set. All filters are intersected.

## Polling for updates
Use `updated_after` with the timestamp of your last completed sync to fetch only events that have changed since. Results are then ordered by `updated_at` ascending and cursor-paginated: follow `pagination.next_cursor`, resending the same `updated_after`, until it is null. Advance your stored timestamp only once every page is drained. Incremental sync is not available on plans with a capped calendar. `updated_after` returns 403 there, because the capped window is recomputed per request and a change feed over it cannot be drained. The walk covers the full served dataset, including past events, so a first sync from an old watermark returns history rather than only upcoming events. Updates to past events that occurred before your currently stored watermark are not replayed; reset the watermark (or start a fresh sync) to backfill them.

## Pagination
List responses include `pagination.next_cursor` when more pages are available. Pass it back as the `cursor` parameter on the next request. Cursors are opaque. Do not parse them.

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

## Query parameters

- `limit` integer
- `cursor` string
- `fields` string
- `updated_after` string
- `ticker` string
- `company` string
- `country` string
- `market` string
- `domicile` string
- `exchange` string
- `index` string
- `sector` string
- `market_segment` string
- `event_type` 'earnings_report' | 'earnings_call' | 'agm' | 'egm' | 'dividend' | 'capital_markets_day' | 'trading_update' | 'conference_presentation' | 'ma_announcement' | 'ma_offer_deadline' | 'ma_completion' | 'listing' | 'delisting'
- `status` 'scheduled' | 'published' | 'cancelled'
- `scheduled_after` string
- `scheduled_before` string
- `watchlist` string

## Headers

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

## Response `200`

Calendar events retrieved successfully

- object
  - `calendar_events` CalendarEventSummary[], required
    - `id` string, required: Unique calendar event identifier
    - `title` string, required: Event title as reported by the issuer or exchange
    - `description` string, nullable: Optional long-form description
    - `event_type` 'earnings_report' | 'earnings_call' | 'agm' | 'egm' | 'dividend' | 'capital_markets_day' | 'trading_update' | 'conference_presentation' | 'ma_announcement' | 'ma_offer_deadline' | 'ma_completion' | 'listing' | 'delisting', required: The kind of calendar event
    - `status` 'scheduled' | 'published' | 'cancelled', required: Event lifecycle status. `scheduled` is upcoming; `published` means the event has occurred (events flip ~2 days after their date); `cancelled` means the issuer withdrew it. List endpoints return `scheduled` + `published` and exclude `cancelled` by default. Pass the `status` query parameter to filter (e.g. `status=cancelled`).
    - `date_precision` 'exact' | 'day' | 'month': Granularity of `scheduled_at`. `exact` = timestamp known; `day` = date only; `month` = only the month is known. Consumers that need a date should still use `scheduled_at` (set to a representative point inside the window).
    - `fiscal_period` string, nullable: Fiscal period slug (required for report-type events, e.g. `q3_2026`, `fy_2025`). For a split fiscal year the year is the one in which the fiscal year ends (2025/26 → `fy_2026`).
    - `scheduled_at` string, date-time, required: Scheduled date/time in UTC (ISO 8601). For the local calendar date use `local_time` instead: a day-precision event is stored at local midnight, so its UTC instant falls on the previous day for ahead-of-UTC (Nordic) zones.
    - `timezone` string: The issuer's IANA timezone, used to interpret `scheduled_at`. Resolved from the source article, falling back to the company's country zone.
    - `local_time` string, date-time: `scheduled_at` rendered in the issuer's `timezone` (ISO 8601 with offset). Use this for the correct local date/time. Its date is right even for day-precision events.
    - `scheduled_at_changed_at` string, date-time, nullable: When `scheduled_at` last changed. Useful for change-feed consumers tracking date moves.
    - `source_article_id` string, nullable: ID of the article the event was extracted from. `null` when the article is not retrievable (not live, or removed), or when the event was first found on a company website. If a company website later supplied the date, this still names the original article, and `source` names the website. Best-effort: on the free plan it may reference an article your plan can't fetch (premium source or outside the age window).
    - `source` object, nullable: Who published the current date. `article` is a news article or company announcement. `company_website` is the issuer's own investor relations calendar. `null` when our editors set the date.
      - `type` 'article' | 'company_website'
      - `name` string, nullable: The publisher: the outlet that carried the article, or the issuer's investor relations site. `null` when the article is no longer available.
      - `url` string, nullable: The investor relations calendar page, for `company_website`. `null` for `article`.
      - `article_id` string, nullable: ID of the article, for `article`. Matches `source_article_id`. `null` when the article is no longer available, and for `company_website`.
    - `company_id` string, required: ID of the company this event relates to
    - `company` object, nullable: The issuer this event belongs to, inlined so a calendar can be rendered without a lookup per row. `id` is the same value as `company_id`. `null` only when the issuer is not published by this API.
      - `id` string: Unique company identifier
      - `name` string: Company name
      - `ticker` string, nullable: Primary stock ticker. `null` for an unlisted issuer.
    - `country` string, nullable: Country ISO 3166-1 alpha-2 code
    - `dividend` object, nullable: Dividend lifecycle dates. `null` for non-dividend events. `scheduled_at` follows the priority ex-date > record-date > payment-date, whichever is explicitly stated.
      - `ex_date` string, nullable: Ex-dividend date (YYYY-MM-DD). The market-event anchor: share price drops on this day.
      - `record_date` string, nullable: Record date (YYYY-MM-DD). Holders of record on this date receive the dividend.
      - `payment_date` string, nullable: Payment date (YYYY-MM-DD). When the cash is distributed to shareholders.
      - `declaration_date` string, nullable: Declaration / announcement date (YYYY-MM-DD). Metadata only, never used as the calendar anchor.
      - `kind` 'ordinary' | 'special': Tranche type. `ordinary` for the recurring/regular dividend; `special` for an extra/bonus/one-off dividend. When an issuer proposes both for the same date, they are returned as two separate events.
    - `coverage_event` object, nullable: The news event that covered this calendar event, once its issuer-local date has arrived. `null` when the date is in the future, no news event matches, or your plan can't access the matched event. `id` is the event's ID: fetch it with `GET /api/v1/events/{id}`. `url` is the Nordic Financial News web page (sign-in required), not the REST endpoint or the publisher's article. Computed when you read: it does not advance `updated_at`, so `updated_after` sync does not deliver coverage-only changes. Revalidate with `If-None-Match`.
      - `id` string: Unique event identifier
      - `title` string: Event title
      - `significance` 'notable' | 'routine': Editorial importance of the event. `notable` = front-page-worthy; `routine` = factual ledger record. Commentary is never matched.
      - `url` string: The event's page on Nordic Financial News
    - `updated_at` string, date-time: When the event was last updated (ISO 8601). Use with `updated_after` for polling
  - `pagination` object, required
    - `count` integer
    - `next_cursor` string, nullable: Opaque cursor to fetch the next page. `null` when there are no more results.
  - `plan_limited` boolean: Present and `true` when your plan restricted the result to its upcoming-events window, so the result may be incomplete. Filters narrow within that window rather than searching the full calendar, so on a limited plan an issuer filter often returns an empty list. Absent when your plan applies no restriction.

## Other responses

- `304`: Not Modified
- `400`: Invalid parameter
- `401`: Missing or invalid API key
- `403`: Incremental sync is not available on this plan

---

[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)
