OpenData – Gasspeicher in Deutschland – Teil 1: GIE-AGSI

Der Sommer geht zu Ende und die Zeitungen bringen die ersten Meldungen über die Füllstände der deutschen Gasspeicher. Allerdings sind die Darstellungen nicht eindeutig: Sie reichen von „Alles klar, der Winter kann kommen“ bis zu „Wir werden alle erfrieren“.

Was stimmt denn jetzt?

Zum Glück müssen wir uns nicht auf meinungsbehaftete Berichte und vorgefilterte Daten verlassen, sondern können uns die Daten direkt von der Quelle beschaffen.

Hinweis: Wer sich nur für die Auswertung der Daten und deren Interpretation interessiert, der sollte direkt zu Teil 3: Daten und Politik gehen.

1 . Die GIE und das AGSI

GIE steht für Gas Infrastructure Europe. Es handelt sich um eine Organisation, die als zentrale Schnittstelle für Transparenzdaten der europäischen Gasinfrastruktur fungiert und mehrere spezialisierte Plattformen betreibt.

Die GIE stellt drei zentrale Plattformen zur Verfügung, die einen europaweiten Überblick über die Gasinfrastruktur bieten:

AGSI (Aggregated Gas Storage Inventory): Diese Plattform liefert tägliche Daten über die Füllstände, Kapazitäten und Flüsse von Gasspeichern in Europa.

ALSI (Aggregated LNG System Inventory): Hier werden Bestandsdaten und Kapazitäten von LNG-Terminals (Flüssigerdgas) veröffentlicht.

IIP (Inside Information Platform): Diese dient der Offenlegung von Insider-Informationen und dringenden Marktmeldungen (Urgent Market Messages – UMM) durch Infrastrukturbetreiber gemäß den EU-Vorschriften.

Wie der Name schon sagt, ist das AGSI die richtige Anlaufstelle, wenn wir über die Füllstände der deutschen Gasspeicher Bescheid wissen wollen. Dort findet man folgende Daten:

Full %: Der aktuelle Füllstand in Prozent im Verhältnis zur technischen Kapazität.

Gas in storage (TWh): Die absolute Menge des gespeicherten Gases in Terawattstunden.

Trend: Ob aktuell mehr eingespeichert oder entnommen wird (+/-).

Einspeisung/Ausspeisung (GWh/d): Die täglichen Gasflüsse.

Die Daten werden täglich aktualisiert, normalerweise um 19:30 Uhr MEZ und ein zweites Mal um 23:00 Uhr MEZ, um auch spätere Meldungen der Betreiber zu berücksichtigen. Die veröffentlichten Werte repräsentieren den Status am Ende des vorangegangenen Gastages (Stand 6:00 Uhr morgens).

Gut zu wissen: Die Tücken des „Gastages“ (Achtung bei der Datenanalyse!)

Wer zum ersten Mal mit den Transparenzdaten von Gas Infrastructure Europe (GIE) arbeitet, stolpert schnell über vermeintliche Logikfehler im Datensatz. Dahinter steckt jedoch kein API-Fehler, sondern die spezifische Definition des Gastages (gas day) in der Energiewirtschaft.

Hier sind die drei wichtigsten Stolpersteine, die du bei deiner Analyse und Datenpflege unbedingt beachten musst:

1. Der 24-Stunden-Datumssprung

Das Phänomen: Ein API-Eintrag für den Gastag (gasDayStart) "2026-08-19" repräsentiert den Füllstand am Ende dieses Gastages.

Die Falle: Das Ende des Gastages vom 19. August ist physikalisch der 20. August um 06:00 Uhr morgens. Der gemeldete Wert zeigt also den realen Speicherstand vom Morgen des Folgetages. Wer das bei der Achsenbeschriftung im Diagramm nicht beachtet, verschiebt seine gesamte Timeline ungewollt um einen Tag nach hinten!

2. Die systematische Veröffentlichungs-Verzögerung

Das Phänomen: Obwohl ein Gastag morgens um 06:00 Uhr endet, sind die Daten nicht sofort verfügbar.

Die Falle: GIE aktualisiert die AGSI-Plattform täglich standardmäßig erst ab 19:30 Uhr (und fährt eine zweite Verarbeitungsrunde für Nachzügler um 23:00 Uhr). Ein automatisiertes Update-Skript, das morgens um 09:00 Uhr läuft, läuft ins Leere, da die Daten des gerade beendeten Gastages erst am Abend bereitgestellt werden.

3. Schätzungen vs. Bestätigte Daten (status: E vs. C)

Das Phänomen: Historische Werte können sich nachträglich rückwirkend verändern.

Die Falle: Speicherbetreiber melden ihre physikalischen Füllstände oft zunächst als vorläufige Schätzungen (status: "E" für Estimated). Sobald präzisere Messdaten vorliegen, korrigieren die Betreiber die Werte der vergangenen Tage rückwirkend und der Status wechselt auf bestätigt (status: "C" für Confirmed). Ein starrer lokaler Cache, der einmal geschriebene Zeilen nie wieder anfasst, speichert dauerhaft ungenaue Schätzwerte ab.

2. Zugang

Der Zugang zu den Daten der GIE ist kostenlos, verlangt aber einen API-Schlüssel. Diesen erhält man, indem man sich auf der Webseite registriert und anschließend eine E-Mail an die angegebene Adresse schickt und um einen API-Zugang bittet. Darüber sollen wohl Bots abgehalten werden, die Plattform zu fluten.

3. Die Schnittstelle

Die API der GIE-AGSI ist sehr umfangreich, deshalb konzentrieren wir uns zunächst auf einen aktuell besonders interessanten Anwendungsfall, nämlich den Vergleich der aktuellen Gasspeicherfüllmenge in Deutschland im historischen Vergleich.

Authentifizierung

Der API-Schlüssel wird nicht als Parameter der URL angegeben, sondern mit dem Header-Feld x-key übertragen.

Für eine einfache Überprüfung der Funktionalität kann man im Terminal mit curl
die API-URL mit seinem Schlüssel aufrufen:

curl https://agsi.gie.eu/api --header "x-key: your-API-key"

curl https://agsi.gie.eu/api --header "x-key: your-API-key"

Im Erfolgsfall antwortet der Server mit einem JSON-Objekt, das alle verfügbaren Daten vom letzten „Gas-Tag“ beinhaltet, bei einem Fehler mit

{"last_page":0,"total":0,"dataset":"storage ERROR","error":"access denied","message":"Invalid or missing API key","data

":[]}

{"last_page":0,"total":0,"dataset":"storage ERROR","error":"access denied","message":"Invalid or missing API key","data

":[]}

Daten spezifizieren

Hinweis: Zur Vereinfachung wird die Authentifizierung in den folgenden Beispielen weg gelassen. Des Weiteren werden die Antworten in Teilen gekürzt.

Der Aufruf der API gibt, wie oben bereits erwähnt, alle Daten für den letzten „Gas-Tag“ für alle 18 Mitglieder der EU, die Untergrundspeicher für Gas besitzen, aus. Um die Daten auf ein Land zu begrenzen, nimmt man den ISO-Ländercode für den Parameter country(sehr fortschrittlich für eine Verbands-API):

curl https://agsi.gie.eu/api?country=de

Jetzt werden ein kurzer Header und die Daten der letzten 30 Tage für Deutschland ausgegeben:

{
"last_page": 191,
"total": 30,
"dataset": "\u003Ca href=\u0022\/data-overview\/eu\u0022\u003EEU\u003C\/a\u003E \u003E DE",
"gas_day": "2026-08-19",
"data": [
{
"name": "Germany",
"code": "DE",
"url": "DE",
"updatedAt": "2026-08-20 17:20:47",
"gasDayStart": "2026-08-19",
"gasDayEnd": "2026-08-20",
"gasInStorage": "123.7062",
"consumption": "903.9000",
"consumptionFull": "13.69",
"injection": "234.91",
"withdrawal": "157.8",
"netWithdrawal": "-77.1",
"workingGasVolume": "246.489",
"injectionCapacity": "4292.58",
"withdrawalCapacity": "7067.36",
"contractedCapacity": "194.1057",
"availableCapacity": "58.6043",
"coveredCapacity": "100",
"status": "C",
"trend": "0.04",
"full": "50.19",
"info": []
},
...

{
"last_page": 191,
"total": 30,
"dataset": "\u003Ca href=\u0022\/data-overview\/eu\u0022\u003EEU\u003C\/a\u003E \u003E DE",
"gas_day": "2026-08-19",
"data": [
{
"name": "Germany",
"code": "DE",
"url": "DE",
"updatedAt": "2026-08-20 17:20:47",
"gasDayStart": "2026-08-19",
"gasDayEnd": "2026-08-20",
"gasInStorage": "123.7062",
"consumption": "903.9000",
"consumptionFull": "13.69",
"injection": "234.91",
"withdrawal": "157.8",
"netWithdrawal": "-77.1",
"workingGasVolume": "246.489",
"injectionCapacity": "4292.58",
"withdrawalCapacity": "7067.36",
"contractedCapacity": "194.1057",
"availableCapacity": "58.6043",
"coveredCapacity": "100",
"status": "C",
"trend": "0.04",
"full": "50.19",
"info": []
},
...

last_page gibt an, das 191 weitere Seiten mit der in total angebenen Anzahl an Daten vorhanden sind. Die kryptischen Zeichen \u003Ca href=\u0022\/data-overview\/eu\u0022\u003EEU\u003C\/a\u003E \u003E DEin dataset sind die Unicode-Darstellung der URL EU > DE, und geben den ausgegebenen Datenbereich an.

Es ist zu beachten, dass der gas_day zwar der 19. August ist, aber trotzdem Daten vom 20. August vorhanden sind. Das liegt an der Definition des „Gas-Tags“. Er beginnt um 6 Uhr des angegebenen „Gas-Tags“ und endet um 6 Uhr des nächsten Tages. Zusätzlich handelt es sich hierbei um „geprüfte“ Daten („status“: „C“).
Speicherbetreiber melden ihre physikalischen Füllstände oft zunächst als vorläufige Schätzungen. Sobald präzisere Messdaten vorliegen, korrigieren sie die Werte der vergangenen Tage rückwirkend.
So kann es also auch passieren, dass sich Daten vom gleichen Tag unterscheiden, je nachdem zu welchem Zeitpunkt man sie abfragt.

Um die Daten auf den aktuellen Tag zu begrenzen, lässt man sich mit dem Parameter size=1 nur einen Datensatz pro Seite ausgeben. Die Default-Anzahl der Seiten ist ebenfalls 1:

curl https://agsi.gie.eu/api?country=de&size=1

curl https://agsi.gie.eu/api?country=de&size=1

{
"last_page": 5710,
"total": 1,
"dataset": "\u003Ca href=\u0022\/data-overview\/eu\u0022\u003EEU\u003C\/a\u003E \u003E DE",
"gas_day": "2026-08-19",
"data": [
{
"name": "Germany",
"code": "DE",
"url": "DE",
"updatedAt": "2026-08-20 17:20:47",
"gasDayStart": "2026-08-19",
...
}
]
}

{
"last_page": 5710,
"total": 1,
"dataset": "\u003Ca href=\u0022\/data-overview\/eu\u0022\u003EEU\u003C\/a\u003E \u003E DE",
"gas_day": "2026-08-19",
"data": [
{
"name": "Germany",
"code": "DE",
"url": "DE",
"updatedAt": "2026-08-20 17:20:47",
"gasDayStart": "2026-08-19",
...
}
]
}

Das ist schon die ganze Magie, um die aktuellen Werte der deutschen Gasspeicher abzufragen.

Tatsächlich werden wir die API gar nicht in dieser Blog-Serie nutzen, denn um an die historischen Daten zu kommen, muss man die API nicht unbedingt nutzen. Für den Zweck dieses Tutorials ist der direkte Download von der Webseite einfacher. Die API benötigen wir aber später, um den Datensatz aktuell zu halten.

Historische Daten

Wie bereits mehrmals angemerkt, sind diese Daten ohne die historische Einordnung nur wenig Wert. Zum Glück kann man aber alle vorhandenen Daten der AGSI abrufen. Dazu gibt es zwei Möglichkeiten

Über die Webseite

per API

Wenn man „nur“ die wichtigtsten Daten eines Landes herunterladen möchte, so ist der Zugriff über die Webseite mit den historischen Daten der GIE-AGSI der einfachste Weg.

Die „Current selection“ stellt man auf „Germany“ und den „Range“ auf „All“. Auf der rechten Seite kann man sich bei „Download current data view“ zwischen CSV, JSON und XSXL (Excel) entscheiden.
Um die Daten später am einfachsten mit einem Programm verarbeiten bietet sich JSON an, da die meisten Programmiersprachen eine native Verarbeitung unterstützen.

Der Download über die Webseite ist etwas gtöper als 2MB und enthält nur die Daten der Kategorien, die in der Datentabelle zu sehen sind. Wenn man zusätzliche Kategorien (19 statt 12) oder mehrere Länder abfragen will, ist ein kleines Skript notwendig und einfacher. Dies ist aber außerhalb des Fokus dieses Projekts.

4. Die Daten im Detail

Die über die API abrufbaren Daten haben, wie bereits oben gesehen, bei der Abfrage eines einzelnen Landes folgende Struktur.

{
"last_page": 1,
"total": 1,
"gas_day": "2026-08-17",
"data": [
{
"name": "EU",
"code": "eu",
"url": "eu",
"updatedAt": "2026-08-18 22:00:04",
"gasInStorage": "693.6291",
"full": "61.37",
"injection": "3178.2",
"withdrawal": "426.1",
"workingGasVolume": "1130.2094",
"status": "E",
"trend": "0.24",
"children": [
{
"name": "Germany",
"code": "DE",
"url": "DE",
"updatedAt": "2026-08-18 22:00:04",
// Spezifisch für Länder-Ebene:
"consumption": "903.9000",
"consumptionFull": "13.65",
"gasInStorage": "123.3965",
"full": "50.06",
"children": [
{
"name": "Uniper Energy Storage",
"code": "21X000000001127H",
"url": "21X000000001127H/DE",
"updatedAt": "2026-08-18 05:23:59",
"gasInStorage": "34.2155",
"full": "57.81",
"children": [
{
"name": "UGS Bierwang",
"code": "21W0000000000613",
"url": "21W0000000000613/DE/21X000000001127H",
"updatedAt": "2026-08-18 05:23:59",
// Spezifisch für Anlagen-Ebene:
"type": "DSR",
"longitude": "12.4013",
"latitude": "48.1275",
"gasInStorage": "5.9433",
"full": "62.9",
"injection": "0.05",
"withdrawal": "0",
"workingGasVolume": "9.449",
"status": "C"
}
]
}
]
}
]
}
]
}

{
"last_page": 1,
"total": 1,
"gas_day": "2026-08-17",
"data": [
{
"name": "EU",
"code": "eu",
"url": "eu",
"updatedAt": "2026-08-18 22:00:04",
"gasInStorage": "693.6291",
"full": "61.37",
"injection": "3178.2",
"withdrawal": "426.1",
"workingGasVolume": "1130.2094",
"status": "E",
"trend": "0.24",
"children": [
{
"name": "Germany",
"code": "DE",
"url": "DE",
"updatedAt": "2026-08-18 22:00:04",
// Spezifisch für Länder-Ebene:
"consumption": "903.9000",
"consumptionFull": "13.65",
"gasInStorage": "123.3965",
"full": "50.06",
"children": [
{
"name": "Uniper Energy Storage",
"code": "21X000000001127H",
"url": "21X000000001127H/DE",
"updatedAt": "2026-08-18 05:23:59",
"gasInStorage": "34.2155",
"full": "57.81",
"children": [
{
"name": "UGS Bierwang",
"code": "21W0000000000613",
"url": "21W0000000000613/DE/21X000000001127H",
"updatedAt": "2026-08-18 05:23:59",
// Spezifisch für Anlagen-Ebene:
"type": "DSR",
"longitude": "12.4013",
"latitude": "48.1275",
"gasInStorage": "5.9433",
"full": "62.9",
"injection": "0.05",
"withdrawal": "0",
"workingGasVolume": "9.449",
"status": "C"
}
]
}
]
}
]
}
]
}

1. Die Wurzel-Ebene (Root Object)

Dies ist die oberste Ebene der JSON-Antwort. Sie enthält keine speicherspezifischen Daten, sondern Metadaten zur Steuerung der Abfrage:

last_page: Gibt an, wie viele Seiten für die aktuelle Abfrage insgesamt verfügbar sind (wichtig für die Paginierung).

total: Die Gesamtzahl der Dateneinträge auf dieser Ebene.

gas_day: Das Datum des Gastages, auf den sich alle Daten in der Antwort beziehen.

data: Ein Array, das den ersten inhaltlichen Knoten (den Kontinent) enthält.

Die tatsächlichen Daten:

Feld-Identifikator | Beschreibung | Einheit
gasInStorage | Gesamtmenge des im Speicher befindlichen Gases am Ende des Gastages. | TWh
workingGasVolume | Maximale technische Speicherkapazität der Anlage. | TWh
full | Füllstand im Verhältnis zur technischen Kapazität (WGV). | %
injection | Während des Gastages eingespeicherte Gasmenge. | GWh/d
withdrawal | Während des Gastages ausgespeicherte Gasmenge. | GWh/d
netWithdrawal | Nettowert der Flüsse (Ausspeisung minus Einspeisung). | GWh/d
injectionCapacity | Maximale technische Einspeisekapazität pro Tag. | GWh/d
withdrawalCapacity | Maximale technische Ausspeisekapazität pro Tag. | GWh/d
consumption | Jährlicher Gasverbrauch (nur auf Länderebene verfügbar). | TWh
consumptionFull | Aktueller Speicherstand im Verhältnis zum Jahresverbrauch. | %
contractedCapacity | Bereits vertraglich gebundene Kapazität (Unternehmen/Anlagen). | TWh
availableCapacity | Noch verfügbare (nicht gebundene) Kapazität. | TWh
coveredCapacity | Abdeckungsgrad des Datensatzes (EU/Länder). | %
trend | Indikator für die Füllstandsänderung: (Einspeisung – Ausspeisung) / WGV. | +/-
status | Datenqualitätsindikator (E=geschätzt, C=bestätigt, N=keine Daten). | –

Wie oben beschrieben reicht für diese Blogpost-Serie der Download über die Webseite mit einem reduzierten Datensatz:

{
"status": "C",
"gasDayStart": "2026-08-19",
"gasDayEnd": "2026-08-20",
"gasInStorage": 123.7062,
"full": 50.19,
"trend": 0.04,
"consumption": 903.9,
"consumptionFull": 13.69,
"injection": 234.91,
"withdrawal": 157.8,
"workingGasVolume": 246.489,
"injectionCapacity": 4292.58,
"withdrawalCapacity": 7067.36,
"contractedCapacity": 194.1057,
"availableCapacity": 58.6043
},

{
"status": "C",
"gasDayStart": "2026-08-19",
"gasDayEnd": "2026-08-20",
"gasInStorage": 123.7062,
"full": 50.19,
"trend": 0.04,
"consumption": 903.9,
"consumptionFull": 13.69,
"injection": 234.91,
"withdrawal": 157.8,
"workingGasVolume": 246.489,
"injectionCapacity": 4292.58,
"withdrawalCapacity": 7067.36,
"contractedCapacity": 194.1057,
"availableCapacity": 58.6043
},

Im nächsten Teil werden wie die Daten verarbeiten und Statistiken erstellen, die eine bessere Einschätzung der aktuellen Lage erlauben, als der augenblickliche Füllwerte der Speicher.

Teil 2: 2026 – Das Jahr mit wenig Gas. Wahrscheinlich.