Nord Pool ExchangeRate API

The ExchangeRate API from Nord Pool — 2 operation(s) for exchangerate.

OpenAPI Specification

nordpool-exchangerate-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Nord Pool Data Portal API (Public) Auction ExchangeRate API
  version: '1.0'
  description: The unauthenticated JSON API behind the Nord Pool Data Portal (data.nordpoolgroup.com), where Nord Pool publishes day-ahead electricity prices for the Nordic, Baltic, CWE, and UK bidding areas. These endpoints return the same day-ahead auction results shown on the public website, in 15-minute Market Time Unit resolution, and are widely used by open-source integrations such as Home Assistant. IMPORTANT - this API is not part of Nord Pool's officially documented, subscription-backed developer offering. It is not covered by an SLA or the API General Terms, and Nord Pool may change or restrict it at any time. The two operations below were observed live and verified returning data on 2026-07-11; request and response shapes are modeled from those observed responses rather than from official reference documentation. For supported programmatic access, use the Nord Pool Market Data API (data-api.nordpoolgroup.com) with a Power Data Services subscription.
  contact:
    name: Nord Pool
    url: https://data.nordpoolgroup.com/
servers:
- url: https://dataportal-api.nordpoolgroup.com
  description: Nord Pool Data Portal backend (public, unauthenticated)
tags:
- name: ExchangeRate
paths:
  /api/v2/ExchangeRate/Daily:
    get:
      tags:
      - ExchangeRate
      summary: Exchange rates
      description: "Returns the exchange rate used for a specific date.\n            \n### Nordic Day-ahead market and local currencies\nFor the Nordic Day-ahead market, local currency trading is allowed. At the auction day, a preliminary exchange rate is retrieved for local currencies to EUR (for example, SEK -> EUR) from a bank. This preliminary exchange rate is used to calculate order prices in EUR based on user provided input. If the user places an order with price 100 SEK and the SEK -> EUR **preliminary** exchange rate is 0.1, then the order value in EUR is 10. All orders are matched in EUR.\n            \n After the market coupling session is complete, on the first available banking day (on normal week days, this is the same day. On weekends, this usually means next Monday) Nord Pool performs a currency exchange hedging process. Here we get a **final** exchange rate based on how much local currencies are exchanged.\n            \nThe final local currency prices are then re-calculated using the final exchange rate, this time from EUR -> local currency. To continue the sample above, if our final EUR -> SEK exchange rate is  9.98, then the settled price will be 99.80 SEK rather than the original 100 SEK. If the final exchange rate would be 10.02, then the settled price would be 100.20 SEK.\n            \n### Other exchange rates (PLN, RON, GBP)\n\nOther currencies does not follow the same hedging flow as in the Nordics. Usually exchange rate is agreed upon before auctions happen and thus no price adjustments are needed.\n            \n### Response field descriptions\n**rates**: a list currency exchange rates for the day\n- **fromCurrency**: the currency exchanged from\n- **toCurrency**: the currency exchanged to\n- **rate**: the exchange rate used to transform fromCurrency -> toCurrency\n- **status**: Preliminary or Final. Preliminary rates can change, Final rates will not be changed. For usage, see the description above\n- **modified**: the last update time"
      parameters:
      - name: date
        in: query
        description: Delivery date, referring to CET date. Format yyyy-MM-dd, for example 2024-08-15
        required: true
        schema:
          type: string
          format: date
      responses:
        '200':
          description: OK
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/ApiExchangeRate'
            application/json:
              schema:
                $ref: '#/components/schemas/ApiExchangeRate'
            text/json:
              schema:
                $ref: '#/components/schemas/ApiExchangeRate'
        '401':
          description: Unauthorized
          content:
            text/plain:
              schema:
                type: string
            application/json:
              schema:
                type: string
            text/json:
              schema:
                type: string
        '403':
          description: Forbidden
          content:
            text/plain:
              schema:
                type: string
            application/json:
              schema:
                type: string
            text/json:
              schema:
                type: string
        '400':
          description: Bad Request
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails'
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails'
            text/json:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails'
  /api/v2/ExchangeRate/Yearly:
    get:
      tags:
      - ExchangeRate
      summary: Yearly Exchange rates
      description: "Returns the exchange rates for a specific year.\n            \n### Nordic Day-ahead market and local currencies\nFor the Nordic Day-ahead market, local currency trading is allowed. At the auction day, a preliminary exchange rate is retrieved for local currencies to EUR (for example, SEK -> EUR) from a bank. This preliminary exchange rate is used to calculate order prices in EUR based on user provided input. If the user places an order with price 100 SEK and the SEK -> EUR **preliminary** exchange rate is 0.1, then the order value in EUR is 10. All orders are matched in EUR.\n            \n After the market coupling session is complete, on the first available banking day (on normal week days, this is the same day. On weekends, this usually means next Monday) Nord Pool performs a currency exchange hedging process. Here we get a **final** exchange rate based on how much local currencies are exchanged.\n            \nThe final local currency prices are then re-calculated using the final exchange rate, this time from EUR -> local currency. To continue the sample above, if our final EUR -> SEK exchange rate is  9.98, then the settled price will be 99.80 SEK rather than the original 100 SEK. If the final exchange rate would be 10.02, then the settled price would be 100.20 SEK.\n            \n### Other exchange rates (PLN, RON, GBP)\n\nOther currencies does not follow the same hedging flow as in the Nordics. Usually exchange rate is agreed upon before auctions happen and thus no price adjustments are needed.\n            \n### Response field descriptions\n**dailyExchangeRates**: a list of exchange rates per delivery date\n            \nEach daily exchange rate contains\n\n**dateCET**: the delivery date in CET time the rate is used for\n            \n**rates**: a list currency exchange rates for the day\n- **fromCurrency**: the currency exchanged from\n- **toCurrency**: the currency exchanged to\n- **rate**: the exchange rate used to transform fromCurrency -> toCurrency\n- **status**: Preliminary or Final. Preliminary rates can change, Final rates will not be changed. For usage, see the description above\n- **modified**: the last update time"
      parameters:
      - name: year
        in: query
        description: Delivery year, referring to CET year. Format yyyy, for example 2024
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: OK
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/ApiYearlyExchangeRate'
            application/json:
              schema:
                $ref: '#/components/schemas/ApiYearlyExchangeRate'
            text/json:
              schema:
                $ref: '#/components/schemas/ApiYearlyExchangeRate'
        '401':
          description: Unauthorized
          content:
            text/plain:
              schema:
                type: string
            application/json:
              schema:
                type: string
            text/json:
              schema:
                type: string
        '403':
          description: Forbidden
          content:
            text/plain:
              schema:
                type: string
            application/json:
              schema:
                type: string
            text/json:
              schema:
                type: string
        '400':
          description: Bad Request
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails'
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails'
            text/json:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails'
components:
  schemas:
    ExchangeRateDataLake:
      type: object
      properties:
        rates:
          type: array
          items:
            $ref: '#/components/schemas/ExchangeRates'
          nullable: true
        dateCET:
          type: string
          format: date
        updatedAt:
          type: string
          format: date-time
      additionalProperties: false
    ApiAvailableStatus:
      enum:
      - Missing
      - Available
      type: string
    ValidationProblemDetails:
      type: object
      properties:
        type:
          type: string
          nullable: true
        title:
          type: string
          nullable: true
        status:
          type: integer
          format: int32
          nullable: true
        detail:
          type: string
          nullable: true
        instance:
          type: string
          nullable: true
        errors:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
          nullable: true
      additionalProperties: {}
    ExchangeRateStatus:
      enum:
      - Preliminary
      - Final
      type: string
    ApiYearlyExchangeRate:
      type: object
      properties:
        year:
          type: integer
          format: int32
        status:
          $ref: '#/components/schemas/ApiAvailableStatus'
        dailyExchangeRates:
          type: array
          items:
            $ref: '#/components/schemas/ExchangeRateDataLake'
          nullable: true
        updatedAt:
          type: string
          format: date-time
      additionalProperties: false
    ApiExchangeRate:
      required:
      - rates
      type: object
      properties:
        dateCET:
          type: string
          format: date
        status:
          $ref: '#/components/schemas/ApiAvailableStatus'
        updatedAt:
          type: string
          format: date-time
        rates:
          type: array
          items:
            $ref: '#/components/schemas/ExchangeRates'
          nullable: true
      additionalProperties: false
    ExchangeRates:
      type: object
      properties:
        fromCurrency:
          type: string
          nullable: true
        toCurrency:
          type: string
          nullable: true
        rate:
          type: number
          format: double
        status:
          $ref: '#/components/schemas/ExchangeRateStatus'
        modified:
          type: string
          format: date-time
      additionalProperties: false
externalDocs:
  description: Nord Pool Data Portal (public day-ahead prices site)
  url: https://data.nordpoolgroup.com/