openapi: 3.2.0 info: title: Nordic Financial News Calendar Events API version: v1.0 contact: name: API Support email: hello@nordicfinancialnews.com description: 'Operations tagged Calendar Events across 2 of this provider''s published API definitions: nordic-financial-news-openapi-original.yml, nordic-financial-news-openapi.yml. Each path carries the servers of the definition it was published in.' servers: - url: https://nordicfinancialnews.com description: Production server tags: - name: Calendar Events paths: /api/v1/calendar_events: get: summary: List Calendar Events tags: - Calendar Events security: - bearer_auth: [] description: '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.' parameters: - name: limit in: query required: false description: Number of events to return per page (default 25, max 100). example: 25 schema: type: integer - name: cursor in: query required: false description: Opaque pagination cursor returned as `pagination.next_cursor` from a previous response. When continuing an `updated_after` sync, resend the same `updated_after` value alongside it. schema: type: string - name: fields in: query required: false description: 'Comma-separated list of fields to include in the response. Reduces payload size. `id` is always included. Available fields: `title`, `description`, `event_type`, `status`, `date_precision`, `fiscal_period`, `scheduled_at`, `timezone`, `local_time`, `scheduled_at_changed_at`, `source_article_id`, `source`, `company_id`, `company`, `country`, `dividend`, `updated_at`.' example: title,event_type,scheduled_at,company_id,dividend schema: type: string - name: updated_after in: query required: false description: 'ISO 8601 datetime. Returns only events updated after this timestamp. Use for incremental sync: store the timestamp of your last completed sync and pass it on the next request. Results are ordered by `updated_at` ascending and cursor-paginated. Drain `pagination.next_cursor` before advancing your stored timestamp. Passing this parameter also disables the default upcoming-only floor, so past events with newer updates are included.' example: '2026-03-01T00:00:00Z' schema: type: string - name: ticker in: query required: false description: Filter by company stock ticker (e.g. `VOLV-B`), comma-separated for several (matches any of them). Also accepts exchange-suffixed form (e.g. `VOLV-B.ST`); former tickers resolve. Matching is case-insensitive. Every value must resolve to a company, or the request is rejected with `400` naming the unknown values. A company outside the calendar's Nordic coverage resolves but returns no events. Combined with `company`, the two filters intersect. example: VOLV-B schema: type: string - name: company in: query required: false description: 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. A company outside the calendar's Nordic coverage resolves but returns no events. Combined with `ticker`, the two filters intersect. example: cmpny1234567 schema: type: string - name: country in: query required: false description: 'Filter by country using ISO 3166-1 alpha-2 code (e.g. `SE`, `DK`, `NO`, `FI`, `IS`). Comma-separated for multiple (e.g. `SE,NO`). Case-insensitive. This is the event''s country: the issuer''s, with source-country fallback.' example: SE schema: type: string - name: market in: query required: false description: Filter to events for an issuer 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 event's own country) and `domicile` (legal domicile). Includes foreign-domiciled but locally-listed issuers. example: SE schema: type: string - name: domicile in: query required: false description: Filter to events for an issuer 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. example: SE schema: type: string - name: exchange in: query required: false description: 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, or `XSTO,XCSE`). Only events for an issuer with an active listing on the exchange match. Case-insensitive. example: XSTO schema: type: string - name: index in: query required: false description: Filter by stock index id or symbol (e.g. `OMXS30`, `OMXC25`, `OMXH25`, `OBX`). Returns events only for companies in that index. Case-insensitive for symbols. example: OMXS30 schema: type: string - name: sector in: query required: false description: 'Filter by company sector. Must exactly match one of the standard sector names: `Communication Services`, `Consumer Discretionary`, `Consumer Staples`, `Energy`, `Financials`, `Health Care`, `Industrials`, `Information Technology`, `Materials`, `Real Estate`, `Utilities`.' example: Industrials schema: type: string - name: event_type in: query required: false description: 'Filter by calendar event type. Accepts a single value or a comma-separated list for multiple types. These are calendar event types (underscored) and are the only values accepted here. The hyphenated Events taxonomy slugs from `GET /api/v1/event_types` belong to `GET /api/v1/events` and are rejected. A few spellings overlap across the two vocabularies (e.g. `delisting`) while denoting different things: a calendar event is a dated, scheduled entry for one issuer; an Events slug classifies a narrative event that already happened.' example: earnings_report,earnings_call schema: type: string enum: - earnings_report - earnings_call - agm - egm - dividend - capital_markets_day - trading_update - conference_presentation - ma_announcement - ma_offer_deadline - ma_completion - listing - delisting - name: status in: query required: false description: 'Filter by lifecycle status. Omitted: returns `scheduled` + past `published` events and excludes `cancelled`. Pass `cancelled` to retrieve cancellations, or `scheduled`/`published` to narrow.' example: cancelled schema: type: string enum: - scheduled - published - cancelled - name: scheduled_after in: query required: false description: 'Window start. A bare date (`YYYY-MM-DD`) means that calendar date in each issuer''s own timezone, inclusive: `scheduled_after=2026-10-01&scheduled_before=2026-10-31` is October in every issuer''s local calendar. An ISO 8601 datetime (`Z` or a UTC offset) means an exact UTC instant, at or after. Passing this parameter disables the default upcoming-only floor, allowing past events to be returned.' example: '2026-10-01' schema: type: string - name: scheduled_before in: query required: false description: Window end. A bare date means that calendar date in each issuer's own timezone, inclusive. An ISO 8601 datetime means an exact UTC instant, exclusive (strictly before). Passing this parameter disables the default upcoming-only floor, allowing past events to be returned. example: '2026-10-31' schema: type: string - name: watchlist in: query required: false description: Restricts to events for companies in a single watchlist, identified by its `id` (from the List Watchlists endpoint). An unknown id returns no events. Requires `read:watchlist` scope. example: wl_8fk2a1b3c4d5 schema: type: string - name: If-None-Match in: header required: false description: ETag value from a previous response. Returns `304 Not Modified` if data has not changed. schema: type: string - name: If-Modified-Since in: header required: false description: HTTP date from a previous `Last-Modified` header. Returns `304 Not Modified` if nothing has changed since. schema: type: string responses: '200': description: Calendar events retrieved successfully content: application/json: examples: upcoming_events_with_dividend: value: calendar_events: - id: cale_q3volvo1 title: Volvo AB Q3 2026 interim report description: Publication of the interim report for Q3 2026 and earnings call at 10:00 CET. event_type: earnings_report status: scheduled date_precision: exact fiscal_period: q3_2026 scheduled_at: '2026-10-22T05:00:00.000Z' timezone: Europe/Stockholm local_time: '2026-10-22T07:00:00.000+02:00' scheduled_at_changed_at: null source_article_id: art_xyz45678 source: type: article name: Cision url: null article_id: art_xyz45678 company_id: w55fcw3pbg3p company: id: w55fcw3pbg3p name: Volvo AB ticker: VOLV-B country: SE dividend: null updated_at: '2026-03-01T09:00:00.000Z' - id: cale_dividlim1 title: Lime Technologies dividend 2026 description: Cash dividend resolved at AGM on 2026-04-23. event_type: dividend status: scheduled date_precision: day fiscal_period: null scheduled_at: '2026-04-24T22:00:00.000Z' timezone: Europe/Stockholm local_time: '2026-04-25T00:00:00.000+02:00' scheduled_at_changed_at: null source_article_id: art_limediv12 source: type: article name: Nasdaq Stockholm url: null article_id: art_limediv12 company_id: limeabxxx234 company: id: limeabxxx234 name: Lime Technologies AB ticker: LIME country: SE dividend: ex_date: '2026-04-25' record_date: '2026-04-28' payment_date: '2026-05-06' declaration_date: '2026-04-23' kind: ordinary updated_at: '2026-04-23T08:30:00.000Z' pagination: count: 2 next_cursor: IlVtcHByZXRPQVZTWnJrVS4uLiI= schema: type: object required: - calendar_events - pagination properties: calendar_events: type: array items: $ref: '#/components/schemas/CalendarEventSummary' pagination: type: object properties: count: type: integer example: 2 next_cursor: type: - string - 'null' description: Opaque cursor to fetch the next page. `null` when there are no more results. example: IlVtcHByZXRPQVZTWnJrVS4uLiI= plan_limited: type: boolean description: 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. example: true '304': description: Not Modified '400': description: Invalid parameter content: application/json: examples: invalid_event_type: value: type: https://docs.nordicfinancialnews.com/problems/invalid-parameter title: Invalid parameter status: 400 detail: 'Unknown event_type(s): not_a_type. Valid values: earnings_report, earnings_call, agm, egm, dividend, capital_markets_day, trading_update, conference_presentation, ma_announcement, ma_offer_deadline, ma_completion, listing, delisting' instance: urn:request:a1b2c3 parameter: event_type schema: $ref: '#/components/schemas/problem_details' '401': description: Missing or invalid API key content: application/json: examples: unauthorized: value: type: https://docs.nordicfinancialnews.com/problems/auth-invalid title: Authentication required status: 401 detail: Missing or invalid API key instance: urn:request:a1b2c3 schema: $ref: '#/components/schemas/problem_details' '403': description: Incremental sync is not available on this plan content: application/json: examples: plan_limit_forbidden: value: type: https://docs.nordicfinancialnews.com/problems/plan-limit-exceeded title: Incremental sync not available on your plan status: 403 detail: Syncing calendar events with updated_after requires a plan with full calendar access. Upgrade your account, or page through the calendar without updated_after. instance: urn:request:a1b2c3 schema: $ref: '#/components/schemas/problem_details' operationId: getApiV1CalendarEvents x-operation-id-source: derived servers: - url: https://nordicfinancialnews.com description: Production server /api/v1/calendar_events/{id}: parameters: - name: id in: path required: true description: The calendar event ID, as returned in the `id` field of list responses. example: cale_q3volvo1 schema: type: string get: summary: Get Calendar Event tags: - Calendar Events security: - bearer_auth: [] description: 'Fetches a single scheduled calendar event by ID. Cancelled or discarded events return 404. On plans with a capped calendar, only events inside your plan''s window are readable; anything outside it returns 403. Responses are cached with `ETag` and `Last-Modified` headers and a `private, max-age=300` `Cache-Control`; clients can send `If-None-Match` or `If-Modified-Since` to receive a `304 Not Modified`.' parameters: - name: If-None-Match in: header required: false description: ETag value from a previous response. Returns `304 Not Modified` if the event has not changed. schema: type: string - name: If-Modified-Since in: header required: false description: HTTP date from a previous `Last-Modified` header. Returns `304 Not Modified` if nothing has changed since. schema: type: string responses: '200': description: Calendar event retrieved content: application/json: examples: earnings_report: value: calendar_event: id: cale_q3volvo1 title: Volvo AB Q3 2026 interim report description: Publication of the interim report for Q3 2026 and earnings call at 10:00 CET. event_type: earnings_report status: scheduled date_precision: exact fiscal_period: q3_2026 scheduled_at: '2026-10-22T05:00:00.000Z' timezone: Europe/Stockholm local_time: '2026-10-22T07:00:00.000+02:00' scheduled_at_changed_at: null source_article_id: art_xyz45678 source: type: article name: Cision url: null article_id: art_xyz45678 company_id: w55fcw3pbg3p company: id: w55fcw3pbg3p name: Volvo AB ticker: VOLV-B country: SE dividend: null updated_at: '2026-03-01T09:00:00.000Z' schema: type: object required: - calendar_event properties: calendar_event: $ref: '#/components/schemas/CalendarEventDetail' '304': description: Not Modified '401': description: Missing or invalid API key content: application/json: schema: $ref: '#/components/schemas/problem_details' '404': description: Calendar event not found content: application/json: examples: not_found: value: type: https://docs.nordicfinancialnews.com/problems/not-found title: Not Found status: 404 detail: The requested resource could not be found instance: urn:request:a1b2c3 schema: $ref: '#/components/schemas/problem_details' '403': description: Calendar event is outside this plan's calendar window content: application/json: examples: plan_limit_forbidden: value: type: https://docs.nordicfinancialnews.com/problems/plan-limit-exceeded title: Calendar event not available on your plan status: 403 detail: This event is outside your plan's calendar window. Upgrade your account for the full calendar. instance: urn:request:a1b2c3 schema: $ref: '#/components/schemas/problem_details' operationId: getApiV1CalendarEventsById x-operation-id-source: derived servers: - url: https://nordicfinancialnews.com description: Production server components: schemas: CalendarEventDetail: allOf: - $ref: '#/components/schemas/CalendarEventSummary' CalendarEventSummary: type: object required: - id - title - event_type - status - scheduled_at - company_id properties: id: type: string description: Unique calendar event identifier example: cale_q3volvo1 title: type: string description: Event title as reported by the issuer or exchange example: Q3 2026 Interim Report description: type: - string - 'null' description: Optional long-form description example: Publication of the interim report for Q3 2026 and earnings call at 10:00 CET. event_type: type: string description: The kind of calendar event enum: - earnings_report - earnings_call - agm - egm - dividend - capital_markets_day - trading_update - conference_presentation - ma_announcement - ma_offer_deadline - ma_completion - listing - delisting example: earnings_report status: type: string description: 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`). enum: - scheduled - published - cancelled example: scheduled date_precision: type: string description: 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). enum: - exact - day - month example: day fiscal_period: type: - string - 'null' description: 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`). example: q3_2026 scheduled_at: type: string format: date-time description: '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.' example: '2026-10-22T05:00:00.000Z' timezone: type: string description: The issuer's IANA timezone, used to interpret `scheduled_at`. Resolved from the source article, falling back to the company's country zone. example: Europe/Stockholm local_time: type: string format: date-time description: '`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.' example: '2026-10-22T07:00:00.000+02:00' scheduled_at_changed_at: type: - string - 'null' format: date-time description: When `scheduled_at` last changed. Useful for change-feed consumers tracking date moves. example: '2026-03-15T10:00:00.000Z' source_article_id: type: - string - 'null' description: '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).' example: art_xyz45678 source: type: - object - 'null' description: 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. properties: type: type: string enum: - article - company_website example: article name: type: - string - 'null' description: 'The publisher: the outlet that carried the article, or the issuer''s investor relations site. `null` when the article is no longer available.' example: Cision url: type: - string - 'null' description: The investor relations calendar page, for `company_website`. `null` for `article`. example: null article_id: type: - string - 'null' description: ID of the article, for `article`. Matches `source_article_id`. `null` when the article is no longer available, and for `company_website`. example: art_xyz45678 company_id: type: string description: ID of the company this event relates to example: w55fcw3pbg3p company: type: - object - 'null' description: 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. properties: id: type: string description: Unique company identifier example: w55fcw3pbg3p name: type: string description: Company name example: Telefonaktiebolaget LM Ericsson ticker: type: - string - 'null' description: Primary stock ticker. `null` for an unlisted issuer. example: ERIC-B country: type: - string - 'null' description: Country ISO 3166-1 alpha-2 code example: SE dividend: type: - object - 'null' description: Dividend lifecycle dates. `null` for non-dividend events. `scheduled_at` follows the priority ex-date > record-date > payment-date, whichever is explicitly stated. properties: ex_date: type: - string - 'null' description: 'Ex-dividend date (YYYY-MM-DD). The market-event anchor: share price drops on this day.' example: '2026-04-25' record_date: type: - string - 'null' description: Record date (YYYY-MM-DD). Holders of record on this date receive the dividend. example: '2026-04-28' payment_date: type: - string - 'null' description: Payment date (YYYY-MM-DD). When the cash is distributed to shareholders. example: '2026-05-06' declaration_date: type: - string - 'null' description: Declaration / announcement date (YYYY-MM-DD). Metadata only, never used as the calendar anchor. example: '2026-03-20' kind: type: string enum: - ordinary - special description: 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. example: ordinary updated_at: type: string format: date-time description: When the event was last updated (ISO 8601). Use with `updated_after` for polling example: '2026-03-01T09:00:00.000Z' problem_details: type: object required: - type - title - status - detail - instance properties: type: type: string description: URI that identifies the problem type title: type: string description: Short human-readable summary status: type: integer description: HTTP status code detail: type: string description: Human-readable explanation instance: type: string description: URI that identifies the specific occurrence securitySchemes: bearer_auth: type: http scheme: bearer bearerFormat: API Key description: API Key authentication using Bearer token x-refined-from: - nordic-financial-news-openapi-original.yml - nordic-financial-news-openapi.yml