Python client for the OBSYD European power data API — a free gridstatus for Europe
Project description
obsyd (Python client)
A pandas client for the OBSYD public data API — a free "gridstatus for Europe" over the official European power record (ENTSO-E, Energy-Charts CC BY 4.0, GIE). 37 bidding zones, day-ahead prices at the market's real 15-minute resolution, load/residual load, generation mix, cross-border flows. Descriptive, not a forecast. AGPL-3.0. No API key.
Install
pip install obsyd # + pip install obsyd[parquet] for bulk pulls
Use
from obsyd import Obsyd
ob = Obsyd() # or Obsyd("https://your-self-host")
# One series, one zone → DataFrame (tz-aware UTC index)
df = ob.series("price.dayahead", "DE_LU", start="2024-01-01", resolution="daily")
df["value"].plot()
# The last week of prices across every zone — a single request
wide = ob.snapshot("price.dayahead", hours=168)
# 15-minute auction resolution (SDAC trades quarter-hours since Oct 2025)
qh = ob.series("price.dayahead.qh", "DE_LU", start="2026-07-01")
# Generation mix, capacity, named units
mix = ob.genmix("ES", resolution="daily")
cap = ob.capacity("DE_LU")
# One series over many zones (polite pacing built in)
res = ob.series_multi("residual.actual", ["DE_LU", "FR", "ES"], start="2026-01-01")
# What exists: series keys, zones, coverage window, freshness
ob.catalog(); ob.zones(); ob.status()
Methods
| Method | Returns | Notes |
|---|---|---|
series(series, zone, start, end, resolution, format) |
DataFrame | hourly/daily; daily carries hours (24 = settled day); format="parquet" for bulk |
series_multi(series, zones, ...) |
wide DataFrame | one column per zone, 0.5 s pause between requests |
snapshot(series, hours≤744, ...) |
wide DataFrame | every enabled zone, one request |
genmix(zone, start, end, resolution) |
wide DataFrame | one column per fuel, mean MW |
capacity(zone, year) / units(zone) |
DataFrame | read df.attrs["note"] on units before summing |
zones() / catalog() / meta() / status() |
dict | reference endpoints, not rate-limited |
df.attrs carries series/zone/unit/attribution where known.
Errors — the client raises, it never returns silently-empty frames
ObsydNoData— the API has nothing for this query (.reasonholds the server's explanation, e.g. unknown series or empty coverage window).ObsydRateLimited— 429 after built-in retries (public API ≈ 120 req/min/IP; the client retries 429/5xx with exponential backoff,max_retries=3).ObsydBadRequest/ObsydServerError— 400 / 5xx with the server's detail.ValueError— unknown zone key, with close-match suggestions (guards against a server-side silent fallback to the default zone).
Requests are sent with a obsyd-python/<version> User-Agent.
Examples
Executable notebooks in examples/: quarter-hour prices,
solar capture rates & negative-price hours, cross-border flows.
Full API reference: docs/API.md or the interactive docs at
https://obsyd.dev/api/docs.
Development
pip install -e ".[dev]"
python -m pytest -q # mocked, hermetic
python -m pytest -m live # smoke against obsyd.dev (before releases)
Releases: bump __version__ in obsyd.py, merge, push tag client-vX.Y.Z —
GitHub Actions builds and publishes to PyPI via Trusted Publishing.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file obsyd-0.2.0.tar.gz.
File metadata
- Download URL: obsyd-0.2.0.tar.gz
- Upload date:
- Size: 21.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d40c88cd570efc8b9b00c750fd2c82e382f8331c9330cf7e9f029f7a71f28136
|
|
| MD5 |
4cd096f7cf78bd33e1ba64b1e001c289
|
|
| BLAKE2b-256 |
ca3731f483787dcfa7b3f649fdf9a853ff2497ea1c45d0c7118f68dca9d7c44c
|
Provenance
The following attestation bundles were made for obsyd-0.2.0.tar.gz:
Publisher:
publish-client.yml on jo20ow/Obsyd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
obsyd-0.2.0.tar.gz -
Subject digest:
d40c88cd570efc8b9b00c750fd2c82e382f8331c9330cf7e9f029f7a71f28136 - Sigstore transparency entry: 2194326186
- Sigstore integration time:
-
Permalink:
jo20ow/Obsyd@c7e4bdc05c4d9d603b92b6cc112ce29da706d4b0 -
Branch / Tag:
refs/tags/client-v0.2.0 - Owner: https://github.com/jo20ow
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-client.yml@c7e4bdc05c4d9d603b92b6cc112ce29da706d4b0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file obsyd-0.2.0-py3-none-any.whl.
File metadata
- Download URL: obsyd-0.2.0-py3-none-any.whl
- Upload date:
- Size: 19.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
383d4258b1aafc3770ab2c6ea1cbb74a04ea1acf4a57333a5459a7511c3adac2
|
|
| MD5 |
d254771c46239757a04b7bc4903c041e
|
|
| BLAKE2b-256 |
a2924afb18f8300fbd42ea5400bc9cd5bbe7e4c3fe49719339fce93ac8cd0014
|
Provenance
The following attestation bundles were made for obsyd-0.2.0-py3-none-any.whl:
Publisher:
publish-client.yml on jo20ow/Obsyd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
obsyd-0.2.0-py3-none-any.whl -
Subject digest:
383d4258b1aafc3770ab2c6ea1cbb74a04ea1acf4a57333a5459a7511c3adac2 - Sigstore transparency entry: 2194326198
- Sigstore integration time:
-
Permalink:
jo20ow/Obsyd@c7e4bdc05c4d9d603b92b6cc112ce29da706d4b0 -
Branch / Tag:
refs/tags/client-v0.2.0 - Owner: https://github.com/jo20ow
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-client.yml@c7e4bdc05c4d9d603b92b6cc112ce29da706d4b0 -
Trigger Event:
push
-
Statement type: