Skip to main content

Documentation Index

Fetch the complete documentation index at: https://api-docs.rabot.energy/llms.txt

Use this file to discover all available pages before exploring further.

This page provides an overview of how pricing data can be retrieved and used to support pricing visualisation and asset optimisation. It explains the different types of pricing data available, how they relate to each other, and how they can be applied to optimise energy consumption and asset behaviour.

Retrieving Pricing Data

RABOT provides two endpoints for retrieving pricing data, each serving a different purpose:
  • EPEX Spot Price — raw market prices sourced from the EPEX energy exchange, independent of any contract. Useful for price visualisation, market analysis, and building price forecasting logic.
  • Working Price — contract-specific pricing that combines the EPEX spot price with procurement costs, grid fees, and levies. This is the price a customer actually pays per kWh and is the data required for asset optimisation.

EPEX Spot Price

GET /partner/v1/day-ahead-prices/limited
See the API Reference for full request and response schema details. The EPEX Spot Price endpoint returns raw day-ahead market prices sourced from the EPEX SPOT exchange. These prices are not contract-specific — they reflect the wholesale electricity market price for Germany and are the same for all customers.
This endpoint is most useful for price transparency displays, customer-facing price charts, or as an input to your own pricing models. For asset optimisation against actual customer costs, use the Working Price endpoint instead.

Query Parameters

ParameterTypeFormatDescription
fromstringYYYY-MM-DDDate of retrieved spot market prices data

Data Availability

Day-ahead spot prices are published by EPEX daily at 16:00 CET for the following day. The from field in the response confirm the date of the data returned.

Response Structure

Spot prices are returned in cent/kWh (pricesUnit.main: "Cent", pricesUnit.per: "Kwh"). Each day is represented as 96 intervals of 15 minutes, with each interval identified by a timestamp in YYYY-MM-DD HH:mm format.
Spot prices are returned as net (netto) values — VAT is not included. This is in contrast to the Working Price endpoint, where all values are gross. Account for this difference if combining data from both endpoints in your own models.
FieldTypeDescription
data.pricesKindstringIndicates the price type. "Net" = netto, VAT not included.
data.pricesUnit.mainstringPrimary unit of measurement ("Cent").
data.pricesUnit.perstringPer-unit denominator ("Kwh").
data.fromdatetimeDate of retrieved spot market prices data (YYYY-MM-DD).
data.pricesarrayArray of 96 price entries per day.
data.prices[].atdatetimeTimestamp of the 15-minute interval (YYYY-MM-DD HH:mm).
data.prices[].pricedecimalEPEX spot price for the interval in cent/kWh (netto).

Example Response

{
  "isSuccess": true,
  "message": null,
  "error": null,
  "data": {
    "pricesUnit": {
      "main": "Cent",
      "per": "Kwh"
    },
    "pricesKind": "Net",
    "from": "2026-03-30 00:00",
    "to": "2026-03-31 00:00",
    "prices": [
      {
        "at": "2026-03-30 00:00",
        "price": 1.7760
      },
      {
        "at": "2026-03-30 00:15",
        "price": 0.9430
      },
      {
        "at": "2026-03-30 00:30",
        "price": 0.5170
      }
    ]
  }
}
The example above shows 3 of the 96 intervals returned for a full day. A complete day response contains one entry per 15-minute interval from 00:00 to 23:45.

Working Price

GET /partner/v1/customers/{customerNumber}/contracts/{contractNumber}/dayaheadworkingprice
See the API Reference for full request and response schema details. The Working Price endpoint provides contract-specific, 15-minute interval electricity working price data. It combines the EPEX spot price with procurement costs, grid fees, and levies into a per-interval working price using the same pricing logic RABOT uses for its own asset optimisation of dynamic tariff contracts. This endpoint decouples working price data from billing computation, ensuring reliable availability independent of load profile forecast dependencies that can affect other pricing endpoints.
The working price returned by this endpoint is not identical to the billed settlement price a customer will see on their invoice. The billing engine calculates a consumption-weighted average of realised spot prices using the customer’s Standard Load Profile (SLP), which results in a different effective working price than the interval-by-interval values provided here. This endpoint is the correct data source for asset optimisation and consumption steering — do not use it to derive or display billed prices to customers.

Path Parameters

ParameterTypeDescription
customerNumberstringThe customer number associated with the contract.
contractNumberstringThe contract number to retrieve price data for.

Query Parameters

ParameterTypeFormatDescription
fromstringYYYY-MM-DDStart of the date range (inclusive).
tostringYYYY-MM-DDEnd of the date range (exclusive).
The to parameter is exclusive. To retrieve data for a single day, set to to the following day. For example, to retrieve data for 2026-03-30, use from=2026-03-30&to=2026-03-31.Both from and to are required. Omitting either parameter will result in a 500 error.

Data Availability and Time Window

The endpoint returns working price data across a rolling three-day window:
DayLabelAvailability
YesterdayDay X-1Available at all times
TodayDay XAvailable at all times
TomorrowDay X+1Available from 16:00 CET daily
The dataAvailableAt field in the response indicates the datetime from which the next day’s data becomes available.
Requesting data outside the three-day window (Day X-1 to Day X+1) will return a 500 error with a period validation message. See Error Reference below.

Response Structure

All prices are returned in cent/kWh (unit: "cent/kWh"). Each day is represented as 96 intervals of 15 minutes, identified by timestamp and interval: "15min".
All price values — including all component sub-fields — are gross (brutto), VAT inclusive. The workingPrice.vat field indicates the applicable VAT rate (e.g. 0.19 = 19%) and is included for informational purposes only — it is not an additional charge to apply on top of the component values, but rather a reference to allow you to derive netto values or validate your own calculations if required.

Working Price Components

Component groupFieldChangesDescription
workingPricetotalPer intervalTotal working price per kWh including VAT.
workingPricevatStableVAT rate applied (e.g. 0.19 for 19%).
tariffTypeStableThe tariff type for the contract. Expected value is "dynamic".
energyPricetotalPer intervalTotal energy price component.
energyPricespotPricePer intervalEPEX spot market price (gross) — the primary variable driving price changes between intervals.
procurementCoststotalForecasted over extended forward horizonTotal procurement cost component.
procurementCostsexchangeFeeForecasted over extended forward horizonFee charged for energy exchange transactions.
procurementCostsgreenCertificatesSurchargeForecasted over extended forward horizonSurcharge for renewable energy certificates.
procurementCostsriskPremiumForecasted over extended forward horizonRisk premium applied to the procurement cost.
gridFeestotalSee noteTotal grid fee. Stable unless §14a Module 3 is active.
gridFeesvariableGridFeeTime-variable (if Module 3) or StableThe grid fee component. When §14a Module 3 is active, this varies within the day across peak, off-peak, and standard tariff windows and must be consumed dynamically. When Module 3 is not active, this equals gridFees.total and can be treated as a stable offset, forecasted over extended forward horizon
leviesAndTaxestotalForecasted over extended forward horizonTotal levies and taxes component.
leviesAndTaxesoffshoreFeeForecasted over extended forward horizonOffshore surcharge (Offshore-Netzumlage).
leviesAndTaxesp19FeeForecasted over extended forward horizon§19 StromNEV surcharge for avoided grid fees.
leviesAndTaxespowerHeatCouplingFeeForecasted over extended forward horizonCHP surcharge (KWK-Umlage).
leviesAndTaxespowerIndividualConcessionFeeForecasted over extended forward horizonConcession fee (Konzessionsabgabe).
leviesAndTaxesshutdownFeeForecasted over extended forward horizonShutdown/decommissioning surcharge.
leviesAndTaxeselectricityTaxForecasted over extended forward horizonElectricity tax (Stromsteuer).
All components except energyPrice.spotPrice and (where applicable) gridFees.variableGridFee are forecasted for approximately 62 days and are stable across that window. These can be fetched once and stored as fixed offsets to reduce API call frequency. Re-fetch once a every 63 days.

Example Request

GET /partner/v1/customers/41219866/contracts/49321434/dayaheadworkingprice
    ?from=2026-03-30&to=2026-03-31

Example Response

{
  "data": {
    "contractNumber": "49321434",
    "customerNumber": "41219866",
    "tariffType": "dynamic",
    "dataAvailableAt": "2026-03-30 16:00",
    "currency": "EUR",
    "unit": "cent/kWh",
    "priceData": [
      {
        "timestamp": "2026-03-30 00:00",
        "interval": "15min",
        "workingPrice": {
          "total": 17.2800,
          "vat": 0.1900
        },
        "components": {
          "energyPrice": {
            "total": 2.1134,
            "spotPrice": 2.1134
          },
          "procurementCosts": {
            "total": 3.8437,
            "exchangeFee": 0.0357,
            "greenCertificatesSurcharge": 0.8330,
            "riskPremium": 2.9750
          },
          "gridFees": {
            "total": 3.8080,
            "variableGridFee": 3.8080
          },
          "leviesAndTaxes": {
            "total": 7.5149,
            "offshoreFee": 1.1198,
            "p19Fee": 1.8540,
            "powerHeatCouplingFee": 0.5307,
            "powerIndividualConcessionFee": 1.5708,
            "shutdownFee": 0.0000,
            "electricityTax": 2.4395
          }
        }
      },
      {
        "timestamp": "2026-03-30 00:15",
        "interval": "15min",
        "workingPrice": {
          "total": 16.3887,
          "vat": 0.1900
        },
        "components": {
          "energyPrice": {
            "total": 1.1222,
            "spotPrice": 1.1222
          },
          "procurementCosts": {
            "total": 3.8437,
            "exchangeFee": 0.0357,
            "greenCertificatesSurcharge": 0.8330,
            "riskPremium": 2.9750
          },
          "gridFees": {
            "total": 3.8080,
            "variableGridFee": 3.8080
          },
          "leviesAndTaxes": {
            "total": 7.5149,
            "offshoreFee": 1.1198,
            "p19Fee": 1.8540,
            "powerHeatCouplingFee": 0.5307,
            "powerIndividualConcessionFee": 1.5708,
            "shutdownFee": 0.0000,
            "electricityTax": 2.4395
          }
        }
      }
    ]
  },
  "isSuccess": true,
  "message": null,
  "error": null
}
The example above shows 2 of the 96 intervals returned for a full day. A complete day response contains one entry per 15-minute interval from 00:00 to 23:45.

Using Pricing Data

The two endpoints serve complementary purposes and can be used independently or together depending on your use case:
Use caseRecommended data
Customer-facing price display or market transparencyEPEX Spot Price
Asset optimisation (peak shaving, load shifting), where module 3 as set out §14a is in placeWorking Price
Asset optimisation (peak shaving, load shifting), where iMSys + TAF7Working Price or EPEX Spot Price
Price forecasting or market analysisEPEX Spot Price

Relationship Between the Two Endpoints

The energyPrice.spotPrice field in the Working Price response is the gross (VAT-inclusive) equivalent of the raw EPEX spot price returned by the Spot Price endpoint. The relationship is exact:
spotPrice endpoint (netto) × 1.19 = energyPrice.spotPrice in Working Price (gross)
For example, for the interval 2026-03-30 00:00:
  • EPEX Spot Price (netto): 1.7760 cent/kWh
  • energyPrice.spotPrice (gross): 2.1134 cent/kWh
  • 1.7760 × 1.19 = 2.1134
This can be used to cross-validate your integration or to derive netto energy price values from the Working Price response if needed.

Asset Optimisation

The Working Price endpoint is the primary data source for EMS partners performing smart asset steering — including peak shaving, load shifting, and consumption optimisation against actual customer costs.

Smart Meter Requirements for Effective Asset Optimisation

The working price data provided by this endpoint enables interval-level asset steering — but the financial benefit of that optimisation is only realised by the customer if they are billed on actual 15-minute consumption data rather than a Standard Load Profile (SLP). This requires all of the following to be in place: An intelligent metering system (iMSys) is installed — a smart meter with a certified smart meter gateway (SMGW), installed by the metering point operator (MSB). TAF7 billing is confirmed as active — the electricity supplier has confirmed TAF7 (15-minute interval billing) is in place, following confirmation from both the MSB and the distribution grid operator (VNB) that the iMSys is operational. Without TAF7 active, the customer continues to be billed based on their SLP regardless of when they consume electricity, meaning the savings generated by optimising against this endpoint will not be reflected in their bill.
Having a smart meter installed does not automatically mean TAF7 billing is active. TAF7 must be explicitly confirmed by the electricity supplier following the full iMSys commissioning process involving both the MSB and VNB. You can check whether a contract has TAF7 active via the GET Contracts endpoint.

§14a Module 3 and Variable Grid Fees

§14a EnWG is a German regulation, in effect from January 1, 2024, that requires newly installed high-power controllable devices (>4.2 kW) — such as heat pumps, EV chargers, and battery storage systems — to be remotely dimmable by the grid operator during periods of grid stress. In return, customers receive a reduction in their grid fees. There are three compensation modules a customer can choose from:
  • Module 1: A flat-rate annual reduction of approximately €110–190, depending on the grid operator.
  • Module 2: A 60% reduction on the volumetric grid fee, requiring a separate meter for the controllable device.
  • Module 3: An add-on to Module 1 (available from April 1, 2025) that introduces time-variable grid fees within the day — across peak, off-peak, and standard tariff windows — to incentivise consumption shifting to off-peak periods.
For contracts where Module 3 is active, gridFees.variableGridFee changes across defined time windows within each day. Unlike the other fee components, it cannot be treated as a stable offset — your optimisation model must consume it dynamically per interval. For contracts without Module 3, gridFees.variableGridFee equals gridFees.total and is stable across the forecast horizon — it can be stored as a fixed offset alongside the other fee components. The gridFees object is structured to accommodate additional components in future. Whether a contract has a §14a module active — and which module — can be confirmed via the GET Contracts endpoint. Check this at contract onboarding before deciding how to handle gridFees.variableGridFee in your model.
§14a Module 3 with variable grid fees is not currently testable via the testing options below unless you have a production contract with Module 3 registered connected to your client credentials. Contact your account manager if you require access to a Module 3 test case.

Module 3 Time Windows and Tariff Levels

Module 3 introduces three tariff levels within each day, with the specific time windows defined individually by each grid operator and published annually on their Preisblatt (price sheet) by October 15 for the following year. There is no national standard for when each tariff applies — hours vary by grid territory. The BNetzA sets only the regulatory boundaries for the tariff levels themselves:
TariffGerman termGrid fee level
Standard tariffStandardtarif (ST)Normal grid fee — applies in all periods not designated as HT or NT
Peak tariffHochlasttarif (HT)Up to 100% above the standard tariff — applies during high grid load periods
Off-peak tariffNiedriglasttarif (NT)Between 10–40% of the standard tariff — applies during low grid load periods
At least two quarters per year must apply HT and NT levels. The remaining months use the standard tariff. Multiple HT, NT, and ST windows per day are permitted.
Because time windows are grid-operator-specific and published annually (due by October 15 annually), the variableGridFee values in the API response will differ between contracts in different grid territories and may change each year. Your optimisation model should not assume fixed time windows across contracts — always consume variableGridFee dynamically per interval for contracts with Module 3 active.If you store fee components as fixed offsets and notice variableGridFee values changing unexpectedly, this is likely the result of an annual Preisblatt update and your offsets should be refreshed.
1. On contract onboarding:
   └── GET /contracts → check §14a module status
       ├── Module 3 active → consume gridFees.variableGridFee per interval dynamically
       └── No Module 3 → store all fee components as stable offsets (~62 days)
           (procurementCosts, gridFees, leviesAndTaxes)

2. Daily (at or after 16:00 CET):
   └── GET /dayaheadworkingprice
       from=YYYY-MM-DD (tomorrow)
       └── Consume spotPrice + variableGridFee (if Module 3) per interval
The Working Price for a given contract only needs to be fetched once per day per contract after 16:00 CET. If you are storing the stable fee components (procurementCosts, gridFees, leviesAndTaxes) as fixed offsets, only the energyPrice.spotPrice values need to be retrieved daily.There are no rate limits on this endpoint, but unnecessary polling outside the daily fetch window provides no new data and should be avoided.

Day X+1 Data Unavailable After 16:00 CET

If Day X+1 data is not returned after 16:00 CET, retry the request. If data is still unavailable by 17:30 CET, escalate to your partner and integration manager immediately, providing the traceId and instanceId from any error responses received.

Testing

Due to the nature of the underlying data sources, the Working Price endpoint is not currently fully replicable in our test environment. Two equivalent testing options are available: Option 1 (Recommended) — Use your own test environment Use your existing RABOT production client credentials with production customer and contract data in your own local or test environment: Option 2 — Use RABOT demo credentials Swap your test environment credentials for the RABOT demo partner client credentials and use the customer and contract numbers below. Contact your account manager to obtain the demo credentials, if not readily available.
  • Customer No: 41219866
  • Contract No: 49321434
Both options use production data. Treat any data retrieved as live customer data and handle it in accordance with your data handling obligations.

Error Reference

When a request fails, the API returns an error response. Note that error responses use a different structure from successful responses — there is no isSuccess or data wrapper. Error responses include a traceId and instanceId. Always include both values when raising an issue with your partner or integration manager, as these are required to investigate the request server-side.
StatusTitleCauseAction
400Bad RequestMalformed request, invalid date format.Verify request parameters and date format (YYYY-MM-DD).
401UnauthorizedInvalid or expired credentials.Re-authenticate and retry with a valid token.
403ForbiddenToken does not have the required scope for this endpoint.Verify the scopes assigned to your client credentials with your account manager.
404Partner API ErrorCustomer number or contract number not found.Verify the customerNumber and contractNumber in the request.
500Partner API ErrorDate range outside the permitted window (Day X-1 to Day X+1), missing query parameters, or an unhandled internal error.See details below.

404 — Customer or Contract Not Found

{
  "type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
  "title": "Partner API Error",
  "status": 404,
  "detail": "Status(StatusCode=\"NotFound\", Detail=\"No contract found for number '13535'\")",
  "traceId": "00-e9f6d97fc99b46eb741d0c66b7e26d60-b16be5705f66bce2-01",
  "instanceId": "da3873dd-3b24-4b25-b88b-7f6478ee49b6",
  "environment": "production"
}

500 — Date Range Outside Permitted Window

Returned when the requested date range falls outside the rolling three-day window (Day X-1 to Day X+1).
{
  "type": "https://tools.ietf.org/html/rfc9110#section-15.6.1",
  "title": "Partner API Error",
  "status": 500,
  "detail": "Status(StatusCode=\"Unknown\", Detail=\"Period must be within 1 day in the past and 1 day in the future. Requested: 2026-03-28T00:00:00.0000000+01:00 - 2026-03-31T00:00:00.0000000+02:00.\")",
  "traceId": "00-6d93fa919a9ff1f9fc3922246179a775-d141278bb255cea4-01",
  "instanceId": "da3873dd-3b24-4b25-b88b-7f6478ee49b6",
  "environment": "production"
}

500 — Missing Query Parameters or Unhandled Error

Returned when from or to query parameters are omitted, or when an unexpected internal error occurs. If you receive this response with no descriptive detail field, escalate immediately to your partner and integration manager with the traceId and instanceId.
{
  "type": "https://tools.ietf.org/html/rfc9110#section-15.6.1",
  "title": "An error occurred while processing your request.",
  "status": 500,
  "traceId": "00-d039264b163a7bde393c8fe0b993315e-46940d034f2fd798-01",
  "instanceId": "da3873dd-3b24-4b25-b88b-7f6478ee49b6",
  "environment": "production"
}

Questions or Concerns?

Feel free to speak with our Integration Management Team or alternatively, ask our built-in AI assistant, Rabotini 🤖 (several languages supported).