Historical archive of TenneT AFRR bid ladder snapshots, stored as a Delta table.
The full archive is available as a download from the GitHub Releases page — no API key required.
How It Works
A cron job runs every 15 minutes on a VPS:
Fetch — pulls the current bid ladder from the TenneT API and stores sampled snapshots into a local Delta table
Backup — once a day, the Delta table is packed into a .tar.zst archive and uploaded to the afrr-delta-backups GitHub Release, keeping the last 14 daily snapshots
The repo contains only code. All data lives in the Release assets.
TenneT AFRR Bid Ladder Archive
Historical archive of TenneT AFRR bid ladder snapshots, stored as a Delta table. The full archive is available as a download from the GitHub Releases page — no API key required.
How It Works
A cron job runs every 15 minutes on a VPS:
.tar.zstarchive and uploaded to theafrr-delta-backupsGitHub Release, keeping the last 14 daily snapshotsThe repo contains only code. All data lives in the Release assets.
Getting The Data
Download the latest archive and extract it:
This extracts the Delta table to
~/tennet-afrr-data/delta/afrr_bid_ladder.What Data Is Captured
Each ingestion run reads current + upcoming ladders and stores sampled snapshots.
Sampling by minutes-to-delivery (MTD):
<180 min: every 15 minutes (0, 15, ..., 165)180–719 min: every 60 minutes (180, 240, ..., 660)720–1440 min: every 120 minutes (720, 840, ..., 1440)This keeps dense coverage close to delivery and lighter coverage further out.
Delta Table Location
After extracting the archive:
~/tennet-afrr-data/delta/afrr_bid_ladderPartitioned by
isp_date(Amsterdam date of the ISP start,YYYY-MM-DD).Schema
Each row is one bid ladder step for one ISP start at one snapshot time.
isp_start_utc(timestamp): ISP start in UTCcapacity_threshold(int16): ladder thresholdprice_down(float32): downward price levelprice_up(float32): upward price levelsnapshot_timestamp_utc(timestamp): when the snapshot was captured (UTC)minutes_to_delivery(int16): minutes from snapshot to ISP startisp_date(string): partition key — local date of the ISP startQuick Example (Polars)
All timestamps are UTC — convert to
Europe/Amsterdamwhere needed.Acknowledgements
Thanks to fboerman for
tenneteu-py!