Cernion Residual Load API

The Residual Load API from Cernion — 2 operation(s) for residual load.

Operations 2

POST /api/residual-load/net-residual-load Net residual load forecast (SMARD load − MaStR EE generation) #
POST /api/residual-load/load-forecast-regional Regional load forecast with LLM reasoning and real MaStR capacity anchors #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/cernion-de:cernion-de-residual-load-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

cernion-de-residual-load-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Cernion Energy Tools Residual Load API
  version: 0.99.22
  description: 'MicroService Agent System for Energy Markets - REST API with AI integration.


    CERNION_TOKEN: request at https://cernion.de/ or by email: dev@stromdao.com.


    For the public instance at https://api.cernion.de/, create your token at https://cernion.de/cet-token/.'
servers:
- url: https://api.cernion.de
  description: API Server
tags:
- name: Residual Load
paths:
  /api/residual-load/net-residual-load:
    post:
      summary: Net residual load forecast (SMARD load − MaStR EE generation)
      tags:
      - Residual Load
      operationId: residual_load_netResidualLoad
      parameters:
      - $ref: '#/components/parameters/TokenQuery'
      responses:
        '200':
          description: Residual load forecast generated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  summary:
                    type: object
                    properties:
                      region:
                        type: string
                        example: Ludwigshafen
                      isHistorical:
                        type: boolean
                        description: true when startDate is in the past (SMARD filter 410 + observed weather used)
                        example: false
                      dataMode:
                        type: string
                        enum:
                        - weather_forecast
                        - historical_observation
                        description: '"weather_forecast" for future dates, "historical_observation" for past dates'
                        example: weather_forecast
                      forecastPeriod:
                        type: object
                        properties:
                          start:
                            type: string
                            format: date-time
                          end:
                            type: string
                            format: date-time
                      resolution:
                        type: string
                        example: hourly
                      dataPoints:
                        type: number
                        example: 24
                      installedCapacity:
                        type: object
                        properties:
                          totalPV_MW:
                            type: number
                            example: 42.7
                          totalWind_MW:
                            type: number
                            example: 8.1
                          pvInstallations:
                            type: number
                            example: 1203
                          windInstallations:
                            type: number
                            example: 12
                      loadScaling:
                        type: object
                        properties:
                          populationUsed:
                            type: string
                            example: '170.000'
                          scalingFactorPct:
                            type: string
                            example: 0.202%
                          isActualData:
                            type: boolean
                            example: true
                          dataSource:
                            type: string
                            example: SMARD filter 410 (realized)
                      kpis:
                        type: object
                        properties:
                          peakResidualLoadMW:
                            type: number
                            example: 87.4
                          peakResidualAt:
                            type: string
                            format: date-time
                          minResidualLoadMW:
                            type: number
                            example: 31.2
                          avgResidualLoadMW:
                            type: number
                            example: 58.9
                          totalLoadMWh:
                            type: number
                            example: 1413.6
                          totalEEGenerationMWh:
                            type: number
                            example: 38.2
                          totalResidualLoadMWh:
                            type: number
                            example: 1375.4
                          avgEESharePct:
                            type: number
                            example: 2.7
                  forecast:
                    type: array
                    items:
                      type: object
                      properties:
                        timestamp:
                          type: string
                          format: date-time
                        loadMW:
                          type: number
                          description: Regional load in MW
                        pvGenerationMW:
                          type: number
                          description: PV generation in MW
                        windGenerationMW:
                          type: number
                          description: Wind generation in MW
                        eeGenerationMW:
                          type: number
                          description: Total EE generation in MW
                        residualLoadMW:
                          type: number
                          description: Net residual load in MW (= loadMW − eeGenerationMW)
                        eeSharePct:
                          type: number
                          description: EE share of total load in %
                  methodology:
                    type: object
                    properties:
                      loadModel:
                        type: string
                      eeModel:
                        type: string
                      residualFormula:
                        type: string
                        example: Residuallast = RegionaleLast − PV − Wind
                      interpolation:
                        type: string
            text/csv:
              description: CSV with metadata comments (when format=csv)
              example: '# Net Residual Load Forecast

                # Region: Ludwigshafen

                Timestamp,Load (MW),PV Generation (MW),Wind Generation (MW),EE Generation (MW),Residual Load (MW),EE Share (%)'
            application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:
              description: Excel XLSX with Forecast + Summary sheets (when format=xlsx)
              schema:
                type: string
                format: binary
        '400':
          description: Invalid request parameters
          content:
            application/json:
              example:
                success: false
                error:
                  code: RESIDUAL_LOAD_ERROR
                  message: region is required
      description: 'Calculates **net residual load** for a grid area or region — the electricity volume a Stadtwerk or EVU must procure on the EPEX spot market:


        **Residual Load = Regional Load − PV Generation − Wind Generation**


        **Data sources (all real API data, no LLM estimates):**

        - **Regional load**: SMARD.de national load × population ratio (no API key required)

        - **PV generation**: MaStR installed capacity × IEC 61853 solar model + Visual Crossing weather

        - **Wind generation**: MaStR installed capacity × IEC 61400 wind model + Visual Crossing weather


        **Time resolutions:**

        - `"hourly"` (default): 24 data points/day — intraday dispatch planning, trading

        - `"15min"`: 96 data points/day — §12 StromNZV Fahrplanlieferung and Bilanzkreisabrechnung


        **SMARD data availability:**

        | Period | Source | isActualData |

        |--------|--------|--------------|

        | Past/today | Filter 410 (realised, ~1h delay) | true |

        | D+1 | Filter 411 (day-ahead TSO forecast) | true |

        | D+2–D+14 | Filter 410, reference week −7 days | false |


        **⚠️ Known limitations:**

        - Load is approximated via population ratio — good for residential/SME, not large industrial consumers

        - Use `populationOverride` for known population figures (improves scaling accuracy)

        - EE accuracy ±10–20 % depending on weather forecast quality (degrades D+3 and beyond)

        **Historical mode (`startDate` in the past):**

        - SMARD automatically switches to filter 410 (realised load, no extra parameter needed)

        - Visual Crossing returns observed weather instead of a forecast — identical IEC calculation

        - Response gains `summary.isHistorical: true` and `summary.dataMode: "historical_observation"`

        - Historical responses are cached for **30 days** (immutable data, no additional API quota)

        **Use cases:**

        - **Day-ahead procurement**: Determine how much to buy on EPEX (residual load = required purchase)

        - **Intraday management**: Hourly/15-min profile for dispatch optimisation

        - **Grid planning**: Identify peak residual load periods for capacity planning

        - **Billing groups (§12 StromNZV)**: 15-min Fahrplan delivery to TSO/DSO'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: []
              properties:
                region:
                  type: string
                  description: City or region name for SMARD population scaling (e.g. "Ludwigshafen", "Bayern", "Heidelberg")
                  example: Ludwigshafen
                gridOperatorMastrId:
                  type: string
                  description: MaStR Netzbetreiber-ID (SNB/GNB...) for EE capacity query. Resolve via cernion_vnb_lookup.
                  example: SNB935578300972
                bundesland:
                  type: string
                  description: Federal state
                  example: Rheinland-Pfalz
                landkreis:
                  type: string
                  description: Landkreis name
                  example: Ludwigshafen am Rhein
                gemeinde:
                  type: string
                  description: Municipality name
                  example: Ludwigshafen
                postleitzahl:
                  type: string
                  pattern: ^[0-9]{5}$
                  description: 5-digit postal code
                  example: '67059'
                latitude:
                  type: number
                  description: Latitude for weather data
                  example: 49.4744
                longitude:
                  type: number
                  description: Longitude for weather data
                  example: 8.4349
                populationOverride:
                  type: number
                  description: Known population of the grid area. Overrides internal lookup. Important for industrial locations (e.g. BASF/Ludwigshafen).
                  example: 170000
                forecastDays:
                  type: number
                  minimum: 1
                  maximum: 14
                  default: 1
                  description: Number of forecast days (1–14)
                  example: 1
                resolution:
                  type: string
                  enum:
                  - hourly
                  - hour
                  - 15min
                  default: hourly
                  description: '`"hourly"` / `"hour"` = 24 pts/day (trading); `"15min"` = 96 pts/day (§12 StromNZV Fahrplan). `"hour"` is accepted as an alias for `"hourly"`.'
                  example: hourly
                installationType:
                  type: string
                  enum:
                  - solar
                  - wind
                  - all
                  default: all
                  description: Which EE types to subtract from load
                  example: all
                startDate:
                  type: string
                  pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$
                  description: 'Optional start date (YYYY-MM-DD). Omit for default tomorrow behaviour. Past dates switch to historical observation mode: SMARD filter 410 (realised) + observed weather, 30-day cache.'
                  example: '2026-02-10'
                format:
                  type: string
                  enum:
                  - json
                  - csv
                  - xlsx
                  default: json
                  description: Output format
                  example: json
                token:
                  type: string
                  description: Optional Cernion MCP token for this request. Overrides CERNION_TOKEN when provided.
            examples:
              dayAheadProcurement:
                summary: STROMDAO day-ahead procurement (15-min, tomorrow)
                value:
                  region: Ludwigshafen
                  gridOperatorMastrId: SNB935578300972
                  forecastDays: 1
                  resolution: 15min
                  installationType: all
              weeklyBavaria:
                summary: Weekly residual load for Bavaria (hourly)
                value:
                  region: Bayern
                  bundesland: Bayern
                  forecastDays: 7
                  resolution: hourly
              industrialSite:
                summary: Industrial site with known population override
                value:
                  region: Mannheim
                  populationOverride: 320000
                  forecastDays: 2
                  resolution: 15min
              csvExport:
                summary: Download residual load profile as CSV
                value:
                  region: Heidelberg
                  postleitzahl: '69115'
                  forecastDays: 1
                  resolution: hourly
                  format: csv
              xlsxExport:
                summary: Download residual load profile as Excel
                value:
                  region: Bayern
                  bundesland: Bayern
                  forecastDays: 3
                  resolution: 15min
                  format: xlsx
              historicalResidualLoad:
                summary: Historical residual load analysis (past date, realised SMARD data)
                value:
                  region: Ludwigshafen
                  gridOperatorMastrId: SNB935578300972
                  startDate: '2026-02-10'
                  forecastDays: 7
                  resolution: hourly
  /api/residual-load/load-forecast-regional:
    post:
      summary: Regional load forecast with LLM reasoning and real MaStR capacity anchors
      tags:
      - Residual Load
      operationId: residual_load_loadForecastRegional
      parameters:
      - $ref: '#/components/parameters/TokenQuery'
      responses:
        '200':
          description: Load forecast generated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    type: object
                    description: LLM-generated load forecast analysis with real MaStR capacity anchors
      description: 'LLM-based regional load forecast enriched with **real MaStR installation data** injected into the reasoning prompt.


        **What is real vs. LLM-estimated:**

        | Component | Data source |

        |-----------|-------------|

        | Installed PV capacity (MW, installation count) | MaStR (real) |

        | Installed wind capacity (MW, installation count) | MaStR (real) |

        | SMARD population scaling factor | SMARD.de (real) |

        | Load profile shape, calendar effects, procurement recommendation | LLM reasoning |


        **Graceful degradation:** If MaStR queries time out, the tool falls back to placeholder values and the LLM call still completes.


        **Use cases:**

        - Stadtwerk procurement planning with natural-language recommendations

        - KPI summaries for management dashboards

        - When full hour-by-hour time-series (see `netResidualLoad`) is not needed'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: []
              properties:
                region:
                  type: string
                  description: City or region name
                  example: Mannheim
                forecastDays:
                  type: number
                  minimum: 1
                  maximum: 7
                  default: 1
                  description: Number of days to forecast (1–7)
                  example: 1
                populationOverride:
                  type: number
                  description: Known population of the grid area. Improves load scaling accuracy.
                  example: 320000
                gridOperatorMastrId:
                  type: string
                  description: MaStR Netzbetreiber-ID for EE capacity lookup
                  example: SNB935578300972
                bundesland:
                  type: string
                  description: Federal state for MaStR capacity query
                  example: Baden-Württemberg
                postleitzahl:
                  type: string
                  description: 5-digit postal code for MaStR capacity query
                  example: '68159'
                additionalContext:
                  type: string
                  description: Extra context for the LLM (e.g. "large BASF industrial plant in area")
                  example: Large chemical plant (BASF) adds ~200 MW industrial base load
                token:
                  type: string
                  description: Optional Cernion MCP token for this request. Overrides CERNION_TOKEN when provided.
            examples:
              dayAheadMannheim:
                summary: Day-ahead load forecast for Mannheim
                value:
                  region: Mannheim
                  populationOverride: 320000
                  forecastDays: 1
              weeklyWithOperator:
                summary: 3-day forecast for a grid operator area
                value:
                  region: Ludwigshafen
                  gridOperatorMastrId: SNB935578300972
                  forecastDays: 3
              industrialContext:
                summary: Industrial site with additional LLM context
                value:
                  region: Ludwigshafen
                  populationOverride: 170000
                  additionalContext: Large chemical plant (BASF) adds ~200 MW industrial base load
                  forecastDays: 1
components:
  parameters:
    TokenQuery:
      name: token
      in: query
      required: false
      schema:
        type: string
      description: Optional Cernion MCP token as URL query parameter. If provided, it overrides CERNION_TOKEN for this request. Prefer Authorization Bearer header in production to reduce token exposure in URLs/logs.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: 'Optional Cernion MCP token. If not provided, falls back to CERNION_TOKEN from environment. Request token at https://cernion.de/ or by email: dev@stromdao.com.'