Download OpenAPI specification:
Short-Term Power Scheduling & Nomination
When accessing the API programmatically, please use OAuth2 with the provided CLIENT_ID and CLIENT_SECRET.
Token URL
PRODUCTION: https://auth-token.powerhub.ewe.de/oauth2/token
Example:
POST /token
Host: https://auth-token.powerhub.ewe.de/oauth2/token
Authorization: Basic BASE64(CLIENT_ID:CLIENT_SECRET)
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
When requesting an API resource, use the received ACCESS_TOKEN with the Bearer prefix.
Example:
GET /resource
Host: https://api.powerhub.ewe.de
Authorization: Bearer ACCESS_TOKEN
| Type | Period fields | Notes |
|---|---|---|
| Schedule | volume |
Day-ahead and intraday (EPEX_INTRADAY) |
| Order | volume, price |
Day-ahead only |
| Merit-Order | orders[] |
Day-ahead only; price-volume curve per period |
Every nomination carries a contract_id (provided by EWE) and a nominations list of quarter-hour periods.
Every period is defined by begin and end and has a fixed length of 15 minutes.
A nomination must cover the full delivery day from 00:00:00 CET to 00:00:00 CET of the delivery day.
| Day type | Period count |
|---|---|
| Standard | 96 |
| DST spring-forward | 92 |
| DST fall-back | 100 |
Intraday nominations (
EPEX_INTRADAY) are exempt partial-day coverage is permitted.
Timestamp format is a isoformat UTC ISO 8601 string, e.g. "2024-10-01T00:00:00.000Z"
| Property | Unit | Notes |
|---|---|---|
| Volume | MW | Positive: EWE buys from customer; Negative: EWE sells to customer |
| Price | EUR/MWh | Required for Order and Merit-Order periods |
| Rule | Detail |
|---|---|
| Sort order | orders must be sorted by price ascending |
| Price range | [-600, 4000] EUR/MWh |
| Boundary entries | Explicit entries at exactly -600 and 4000 are mandatory (EEX/EPEX requirement) |
| Sell volume monotony | Positive volumes must be non-decreasing with rising price |
| Buy volume monotony | Absolute value of negative volumes must be non-increasing with rising price |
Contracts with market type EPEX_INTRADAY follow different deadline rules:
| Rule | Value |
|---|---|
| Daily deadline | None - rolling lead time applies instead |
| Default lead time | 30 minutes |
| Full day required | No partial-day nominations permitted |
| Earliest nominatable QH | current quarter-hour start + 15 min + lead_time_minutes |
| Field | Type | Description |
|---|---|---|
contract_id |
string |
Contract identifier provided by EWE |
nominations |
SchedulePeriod[] |
List of quarter-hour periods |
SchedulePeriod
| Field | Type | Description |
|---|---|---|
begin |
datetime |
Period start - UTC ISO 8601 |
end |
datetime |
Period end - UTC ISO 8601 |
volume |
float |
Power in MW |
| Field | Type | Description |
|---|---|---|
contract_id |
string |
Contract identifier provided by EWE |
nominations |
OrderPeriod[] |
List of quarter-hour periods |
OrderPeriod
| Field | Type | Description |
|---|---|---|
begin |
datetime |
Period start - UTC ISO 8601 |
end |
datetime |
Period end - UTC ISO 8601 |
volume |
float |
Power in MW |
price |
float |
Price in EUR/MWh |
| Field | Type | Description |
|---|---|---|
contract_id |
string |
Contract identifier provided by EWE |
nominations |
MeritOrderPeriod[] |
List of quarter-hour periods |
MeritOrderPeriod
| Field | Type | Description |
|---|---|---|
begin |
datetime |
Period start - UTC ISO 8601 |
end |
datetime |
Period end - UTC ISO 8601 |
orders |
MeritOrderLimit[] |
Price-volume curve - must include entries at -600 and 4000 |
MeritOrderLimit
| Field | Type | Description |
|---|---|---|
volume |
float |
Power in MW at this price level |
price |
float |
Price in EUR/MWh - null is not permitted |
All validation errors return HTTP 422 with a JSON body:
{ "message": "<error description>" }
The contract is administratively disabled and cannot accept nominations regardless of content.
Contract is not active and cannot be nominated.
Every contract has a configured validity period (valid_from / valid_to). Nominations outside this period are rejected.
Invalid contract period - valid from {date}
Invalid contract period - valid to {date}
Contracts without a valid_to have unlimited validity.
Every contract has a configured deadline tied to the market auction. Submissions after the deadline are rejected.
Nomination deadline passed: {now} > {deadline}
There are two deadline modes, configured per contract:
dayafter: false): deadline is at HH:MM CET of the day before the delivery daydayafter: true): deadline is at HH:MM CET of the next regular working day after the delivery day (German public holidays and weekends considered; maximum: delivery day +3)For intraday contracts, a separate error is returned:
Nomination deadline passed, must be at least {n} minutes before delivery
Every nomination must contain a full delivery day starting at 00:00:00 CET and ending at 00:00:00 CET of the following day.
Nomination must begin at time 00:00:00 (CET), got: {time}
Nomination must end at time 00:00:00 (CET), got: {time}
This check does not apply to intraday nominations (
EPEX_INTRADAY).
Every nomination period must have a length of exactly 15 minutes.
Invalid Nomination period (must be quarterhour): {begin} - {end}
All periods must be gapless and non-overlapping. The end of each period must equal the begin of the next.
Nomination periods not continuous: {t1} - {t2}
The following errors apply exclusively to Merit-Order nominations:
Invalid Nomination: Every order must have a price (price=None is not allowed).
Invalid Nomination: Prices must be ascending.
Invalid Nomination: Prices must be between -600 and 4000, got min: {x}, max: {y}.
Invalid Nomination: Prices must include both -600 and 4000 as boundaries.
Invalid Nomination: Sell volume must not decrease with increasing price.
Invalid Nomination: Buy volume must not increase with increasing price.
| contract_id required | string (Contract Id) |
required | Array of objects (Nominations) |
{- "contract_id": "string",
- "nominations": [
- {
- "begin": "2019-08-24T14:15:22Z",
- "end": "2019-08-24T14:15:22Z",
- "volume": 0
}
]
}null| contract_id required | string (Contract Id) |
required | Array of objects (Nominations) |
{- "contract_id": "string",
- "nominations": [
- {
- "begin": "2019-08-24T14:15:22Z",
- "end": "2019-08-24T14:15:22Z",
- "volume": 0,
- "price": 0
}
]
}null| contract_id required | string (Contract Id) |
required | Array of objects (Nominations) |
{- "contract_id": "string",
- "nominations": [
- {
- "begin": "2019-08-24T14:15:22Z",
- "end": "2019-08-24T14:15:22Z",
- "orders": [
- {
- "volume": 0,
- "price": 0
}
]
}
]
}null