Day-Ahead Prices REST API

ENTSO-E Transparency Platform: Strompreise Day-Ahead Markt für 35+ EU-Länder mit 15-Min-Auflösung.

🇪🇺 ENTSO-E ⏱️ 15-Min Resolution 🌍 35+ Countries 📍 Auto EIC Mapping

📡 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.