Day-Ahead Prices REST API
ENTSO-E Transparency Platform: Strompreise Day-Ahead Markt für 35+ EU-Länder mit 15-Min-Auflösung.
📡 Endpunkt
POST /api/entsoe/day-ahead-prices
🌍 Coverage
35+ EU-Länder
⏱️ Resolution
15 Minuten (PT15M)
⚡ Response
500-1500ms
REST API Dokumentation
HTTP Endpunkt
POST https://api.cernion.de/api/entsoe/day-ahead-prices
Request Parameters
| Parameter | Typ | Required | Beschreibung |
|---|---|---|---|
region |
string | ✅ Ja | Land/Bidding Zone: "Germany", "France", "Austria", etc. (Fuzzy Matching) |
dateFrom |
string | ✅ Ja | Start-Datum: ISO 8601 (2026-02-01), YYYYMMDD (20260201), DD.MM.YYYY |
dateTo |
string | ✅ Ja | End-Datum (gleiche Formate wie dateFrom) |
includeStatistics |
boolean | ❌ Nein | Statistiken inkludieren (min/max/avg/median) - default: true |
Beispiel Request
{
"region": "Germany",
"dateFrom": "2026-02-01",
"dateTo": "2026-02-07",
"includeStatistics": true
}
Response Schema
{
"success": true,
"region": "Germany",
"eicCode": "10Y1001A1001A82H",
"periodStart": "202602010000",
"periodEnd": "202602072300",
"resolution": "PT15M",
"currency": "EUR",
"unit": "MWh",
"prices": [
{
"timestamp": "2026-02-01T00:00:00Z",
"price": 45.23,
"position": 1
},
{
"timestamp": "2026-02-01T00:15:00Z",
"price": 43.87,
"position": 2
}
],
"statistics": {
"minPrice": 12.45,
"maxPrice": 87.32,
"avgPrice": 52.18,
"medianPrice": 49.50,
"totalDataPoints": 672
},
"metadata": {
"source": "ENTSO-E Transparency Platform",
"documentType": "A44",
"queryTime": "2026-02-08T10:30:15Z"
}
}
Code-Beispiele
curl -X POST https://api.cernion.de/api/entsoe/day-ahead-prices \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"region": "Germany",
"dateFrom": "2026-02-01",
"dateTo": "2026-02-07",
"includeStatistics": true
}'
const API_TOKEN = 'YOUR_API_TOKEN';
async function getDayAheadPrices() {
const response = await fetch(
'https://api.cernion.de/api/entsoe/day-ahead-prices',
{
method: 'POST',
headers: {
'Authorization': `Bearer ${API_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
region: 'Germany',
dateFrom: '2026-02-01',
dateTo: '2026-02-07',
includeStatistics: true
})
}
);
const data = await response.json();
console.log(`Region: ${data.region} (${data.eicCode})`);
console.log(`Data Points: ${data.statistics.totalDataPoints}`);
console.log(`Price Range: ${data.statistics.minPrice} - ${data.statistics.maxPrice} €/MWh`);
console.log(`Average: ${data.statistics.avgPrice.toFixed(2)} €/MWh\n`);
// Find peak and valley hours
const sortedPrices = [...data.prices].sort((a, b) => b.price - a.price);
console.log('Top 5 Peak Hours:');
sortedPrices.slice(0, 5).forEach(p => {
console.log(` ${p.timestamp}: ${p.price.toFixed(2)} €/MWh`);
});
return data;
}
getDayAheadPrices();
import requests
import pandas as pd
import matplotlib.pyplot as plt
API_TOKEN = 'YOUR_API_TOKEN'
def get_day_ahead_prices(region='Germany', date_from='2026-02-01', date_to='2026-02-07'):
"""Fetch day-ahead prices with analysis"""
response = requests.post(
'https://api.cernion.de/api/entsoe/day-ahead-prices',
headers={
'Authorization': f'Bearer {API_TOKEN}',
'Content-Type': 'application/json'
},
json={
'region': region,
'dateFrom': date_from,
'dateTo': date_to,
'includeStatistics': True
}
)
data = response.json()
print(f'\n=== Day-Ahead Prices: {data["region"]} ===')
print(f'Period: {date_from} to {date_to}')
print(f'Data Points: {data["statistics"]["totalDataPoints"]}')
print(f'\nPrice Statistics:')
print(f' Min: {data["statistics"]["minPrice"]:.2f} €/MWh')
print(f' Max: {data["statistics"]["maxPrice"]:.2f} €/MWh')
print(f' Avg: {data["statistics"]["avgPrice"]:.2f} €/MWh')
print(f' Median: {data["statistics"]["medianPrice"]:.2f} €/MWh')
# Convert to DataFrame
df = pd.DataFrame(data['prices'])
df['timestamp'] = pd.to_datetime(df['timestamp'])
df['hour'] = df['timestamp'].dt.hour
# Peak/Valley Analysis
print(f'\n=== Peak vs Valley ===')
peak_hours = df[df['hour'].isin([17, 18, 19, 20])] # 17-20h
valley_hours = df[df['hour'].isin([2, 3, 4, 5])] # 2-5h
print(f'Peak Hours (17-20h): {peak_hours["price"].mean():.2f} €/MWh')
print(f'Valley Hours (2-5h): {valley_hours["price"].mean():.2f} €/MWh')
print(f'Peak/Valley Spread: {(peak_hours["price"].mean() - valley_hours["price"].mean()):.2f} €/MWh')
# Negative Prices
negative = df[df['price'] < 0]
if len(negative) > 0:
print(f'\n⚠️ Negative Prices: {len(negative)} intervals')
print(f'Lowest: {negative["price"].min():.2f} €/MWh')
return data, df
if __name__ == '__main__':
data, df = get_day_ahead_prices('Germany', '2026-02-01', '2026-02-07')
# Plot
plt.figure(figsize=(12, 6))
plt.plot(df['timestamp'], df['price'])
plt.axhline(y=0, color='r', linestyle='--', alpha=0.5)
plt.title('Day-Ahead Prices - Germany')
plt.xlabel('Time')
plt.ylabel('Price (€/MWh)')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('day_ahead_prices.png')
print('\nChart saved: day_ahead_prices.png')
Anwendungsfälle
💰 Dynamic Tariff Calculation
Spot-basierte Tarife für Prosumer: Echtzeitpreise + Markup (3-7 ct/kWh) = Kundentarif
📊 Trading Strategy
Arbitrage-Opportunities: Peak/Valley Spread >20€/MWh = Battery Dispatch Signal
🔋 Load Shifting
§14a EnWG: Wallbox/Wärmepumpe in Valley Hours (2-5h) laden bei <30€/MWh
⚠️ Negative Price Alerts
§51 EEG 2023 Compliance: >6h negative Preise = Kein EEG-Vergütung (Prosumer warnen)
Unterstützte Länder & Bidding Zones
🇩🇪 Central Europe
- Germany (DE-LU)
- Austria (AT)
- Switzerland (CH)
- Czech Republic (CZ)
- Poland (PL)
🇫🇷 Western Europe
- France (FR)
- Belgium (BE)
- Netherlands (NL)
- United Kingdom (GB)
- Ireland (IE)
🇪🇸 Southern Europe
- Spain (ES)
- Portugal (PT)
- Italy (IT)
- Greece (GR)
🇸🇪 Northern Europe
- Sweden (SE1-SE4)
- Norway (NO1-NO5)
- Denmark (DK1, DK2)
- Finland (FI)
💡 Automatisches EIC-Mapping: Geben Sie Ländernamen ein ("Germany", "France"), API mapped automatisch zu korrekten EIC-Codes.
Best Practices & Performance-Tipps
⏱️ Optimale Zeitfenster
- 1 Tag: Real-time Analyse (500ms)
- 7 Tage: Wöchentliche Trends (800ms)
- 31 Tage: Monatliche Stats (1500ms)
- ❌ >90 Tage: Zu groß, API Timeout
📊 Statistik-Nutzung
- avgPrice: Baseline für Tarif-Kalkulation
- maxPrice: Worst-Case Szenario (Peak Risk)
- medianPrice: Robuster als Avg (weniger Outlier-Impact)
- minPrice: Negative Price Detection
🔄 Caching-Strategie
- Historische Daten: Cache 24h (ändern sich nicht)
- Day-Ahead für morgen: Cache 1h (stabil ab 14h)
- Intraday: Cache 15 Min (volatil)
- API cached intern: 15 Min für ENTSO-E Daten
⚠️ Error Handling
- 404: Region/EIC-Code ungültig → Fallback zu "Germany"
- No Data: ENTSO-E Downtime → Retry nach 5 Min
- Future Dates: Day-Ahead nur für morgen verfügbar
- Bidding Zone Split: Manche Länder haben mehrere Zones (NO1-NO5)
ROI durch Spot-Preis-Optimierung
| Anwendung | Szenario | Ersparnis/Jahr | Implementation Cost |
|---|---|---|---|
| Dynamic Tariff | 100 Prosumer-Kunden, 10% Ersparnis durch Load Shifting | 35.000€ (Kundenzufriedenheit + Retention) | API Kosten: 299€/Monat |
| §14a EnWG Steuerung | 200 Wallboxen, 30% Load Shift in Valley Hours | 48.000€ CAPEX-Einsparung (weniger Netzausbau) | SMGW + API Integration |
| Battery Dispatch | 5 MWh Speicher, Peak/Valley Arbitrage (15€/MWh Spread) | 82.000€ (365 Zyklen × 5 MWh × 15€ × 75% Effizienz) | Dispatch-Software + API |
| Gesamt | 165.000€ Potential/Jahr | ROI: 46x (299€/Monat) | |
FAQ
Was ist der Unterschied zu /api/energy-market/prices?
/entsoe/day-ahead-prices ist ENTSO-E-spezifisch mit automatischem EIC-Mapping und 15-Min-Auflösung. /energy-market/prices aggregiert mehrere Quellen (ENTSO-E + SMARD.de).
Wie aktuell sind die Preise?
ENTSO-E publiziert Day-Ahead Preise um 13:00 Uhr für den Folgetag. API cached 15 Min. Für Echtzeit-Preise nutzen Sie Intraday API.
Welche Bidding Zone für Deutschland?
Deutschland + Luxembourg = DE-LU Zone (10Y1001A1001A82H). Keine Unterteilung in Nord/Süd (anders als SE1-SE4 in Schweden).
Kann ich mehrere Länder parallel abfragen?
Ja! Starten Sie mehrere API Calls parallel (beachten Sie Rate Limit: 60/min). Für Vergleiche: Nutzen Sie /entsoe/physical-flows für Cross-Border-Analyse.
Spot-Preis-Optimierung starten
165k€ Potential durch Dynamic Tariffs, Battery Dispatch und §14a Load Shifting
Durchschnittliche Setup-Zeit: 5 Minuten. Erste Preise nach wenigen Minuten.