# Transelectrica DAMAS — balancing market > Romania's electricity balancing market from Transelectrica's DAMAS public reports: estimated imbalance prices and volumes, whole-system imbalance, consumption forecast versus realised, cross-border interconnection capacity (one row per border per hour), and the volumes and marginal prices of every activated balancing-reserve type (FCR, aFRR, mFRR, RR). Figures are published as estimates close to real time and are revised by Transelectrica before final settlement — this dataset follows those revisions rather than freezing the first published number. - Dataset id: `transelectrica-damas` - Update cadence: hourly - Upstream source: https://newmarkets.transelectrica.ro/ - Tags: energy, electricity, balancing-market, romania, transelectrica, damas, imbalance-prices, interconnection-capacity, ancillary-services - Current version: ingest `01M54NGV0369A3HY78D4E6TE0E`, snapshot 2026-10-17, generated 2026-10-17T10:12:13.393Z ## Licence and attribution - Licence: Transelectrica public market data (no explicit re-use licence) (`LicenseRef-Transelectrica-Public-Data`) - Licence text: https://newmarkets.transelectrica.ro/ - Required attribution: Transelectrica - Notes: Transelectrica (the Romanian electricity transmission and system operator) publishes these DAMAS balancing-market reports openly and without authentication, but states no licence, terms of use or re-use permission anywhere on the site: only a bare "Copyright © Transelectrica" footer notice. Its GDPR and cookie policies are scoped to personal data and say nothing about market data re-use. No SPDX identifier is claimed here because none applies — this is the factual absence of a stated licence, not a grant of one. This connector republishes only the numeric report fields themselves (prices, volumes, capacities), with the required attribution to Transelectrica, and does not claim any right beyond what publishing openly, unauthenticated, public-interest market data implies. A reuser who needs a stronger guarantee should contact Transelectrica directly. Reproduce the attribution line verbatim anywhere you republish this data. ## Manifest - Start here for how this directory works: https://data.bunnytech.app/llms.txt - This dataset: https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/manifest.json - All datasets: https://data-directory.fsn1.your-objectstorage.com/public/index.json - Human page: https://data.bunnytech.app/datasets/transelectrica-damas The manifest is the contract: file URLs, row counts, column types, min/max statistics and example queries all live there. Re-read it to discover a new version. ## Fastest path — Parquet exports Immutable, physically sorted snapshot exports. No catalog fetch, best row-group pruning, safe to cache forever. Register one view per table: ```sql INSTALL httpfs; LOAD httpfs; CREATE OR REPLACE VIEW imbalance_prices AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/imbalance_prices.parquet'); CREATE OR REPLACE VIEW system_imbalance AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/system_imbalance.parquet'); CREATE OR REPLACE VIEW consumption_forecast AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/consumption_forecast.parquet'); CREATE OR REPLACE VIEW interconnection_capacity AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/interconnection_capacity.parquet'); CREATE OR REPLACE VIEW balancing_energy_activated AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/balancing_energy_activated.parquet'); CREATE OR REPLACE VIEW balancing_marginal_prices AS SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/balancing_marginal_prices.parquet'); ``` Example queries: -- Imbalance prices for the last week: period_start is the sort column — the time filter comes first. ```sql ATTACH IF NOT EXISTS 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/catalog.ducklake' AS "datadirectory" (READ_ONLY); SELECT period_start, estimated_price_positive_imbalance, estimated_price_negative_imbalance FROM datadirectory.transelectrica_damas.imbalance_prices WHERE period_start >= now() - INTERVAL 7 DAY ORDER BY period_start ``` -- How often was the system in deficit versus surplus, per day ```sql ATTACH IF NOT EXISTS 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/catalog.ducklake' AS "datadirectory" (READ_ONLY); SELECT date_trunc('day', period_start) AS day, imbalance_direction, count(*) AS isps FROM datadirectory.transelectrica_damas.system_imbalance GROUP BY 1, 2 ORDER BY 1 DESC, 2 ``` ## Live lake — DuckLake catalog with time travel Attach the published catalog read-only over plain https. This works in native DuckDB AND in duckdb-wasm in the browser — the reader catalog resolves its data files through public https URLs, so no credentials and no backend are involved. ```sql INSTALL ducklake; LOAD ducklake; ATTACH 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/transelectrica-damas/catalog.ducklake' AS transelectrica_damas (READ_ONLY); SELECT * FROM transelectrica_damas.main.imbalance_prices LIMIT 5; USE transelectrica_damas; ``` - Latest catalog: https://data-directory.fsn1.your-objectstorage.com/catalog/transelectrica-damas/catalog.ducklake - This exact version: https://data-directory.fsn1.your-objectstorage.com/catalog/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/catalog.ducklake (sha256 19d27759e725c3b5881b8dabb4337da59eb86415f5b10bbde4d17c56a22fbbe4) - Written by DuckDB v1.5.5 - Time travel: this ingest is snapshot 32 — e.g. `SELECT * FROM transelectrica_damas.imbalance_prices AT (VERSION => 32)` ## Wholesale — S3 access For bulk downloads, read the bucket prefix directly over S3 with httpfs: ```sql INSTALL httpfs; LOAD httpfs; CREATE SECRET hetzner ( TYPE s3, ENDPOINT 'fsn1.your-objectstorage.com', URL_STYLE 'path', KEY_ID '', SECRET '' ); SELECT * FROM read_parquet('s3://data-directory/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/**/*.parquet'); ``` ## Schema ### imbalance_prices Romania's estimated balancing-market imbalance prices and volumes, one row per 15-minute Imbalance Settlement Period (ISP) — the interval over which every balancing responsible party's actual consumption/production is compared against what it scheduled. Prices are estimates published close to real time from Transelectrica's DAMAS platform (`estimatedImbalancePrices`), not the final, settled figures. - 76.8K rows · 3.2 MB · write mode `upsert` - Physically sorted by: `period_start` - Primary key: `period_start` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/imbalance_prices.parquet (76.8K rows) Columns: - `period_start` TIMESTAMPTZ NOT NULL — Start of the 15-minute Imbalance Settlement Period (ISP), UTC. From the report's `timeInterval.from`; the identity of the row. (range: "2024-06-30 21:00:00+00" … "2026-10-17 20:45:00+00") (~66667 distinct) - `period_end` TIMESTAMPTZ NOT NULL — End of the ISP, UTC. From `timeInterval.to`. - `isp` INTEGER — Sequence number of this ISP within its settlement day (1-96 at the 15-minute grain), as published by Transelectrica. - `local_hour` INTEGER — The Romania local-time clock hour this ISP falls in (1-24), as published alongside `isp`. - `settlement_type` VARCHAR — The ISP's evaluation type as published, e.g. "Single" — the single-imbalance-price scheme currently used on the Romanian balancing market (one price applies regardless of the direction of the system imbalance; a "Dual" scheme, if ever introduced, would price a positive and a negative imbalance differently). - `fcr` DOUBLE [MW] — Frequency Containment Reserve (FCR) value estimated for this ISP. FCR is the automatic, sub-minute reserve every synchronous-area TSO activates to hold the grid's frequency at 50 Hz; unlike aFRR/mFRR/RR it is not settled per balancing responsible party, which is why this report carries a value for it while reports 2-4 do not. - `estimated_price_negative_imbalance` DECIMAL(12,4) [Lei/MWh] — Estimated settlement price for a NEGATIVE imbalance — a balancing responsible party that consumed more, or produced less, than it scheduled — in Romanian Lei per MWh. - `estimated_price_positive_imbalance` DECIMAL(12,4) [Lei/MWh] — Estimated settlement price for a POSITIVE imbalance (consumed less, or produced more, than scheduled), in Lei/MWh. Under the current single-price scheme this normally equals estimated_price_negative_imbalance. - `sum_qup` DOUBLE [MWh] — Total upward imbalance volume (Qup) across all balancing responsible parties for this ISP. - `sum_qdn` DOUBLE [MWh] — Total downward imbalance volume (Qdn) for this ISP. - `sum_qup_pup` DECIMAL(18,4) [Lei] — Total amount paid for upward imbalance energy in this ISP (Qup priced at the positive imbalance price). DECIMAL(18,4) rather than the usual money type: this is a settlement total for a whole ISP, not a unit price, and it reaches hundreds of millions of Lei — October 2024 alone carries -261,556,721.2912, which overflows DECIMAL(12,4). - `sum_qdown_pdn` DECIMAL(18,4) [Lei] — Total amount charged for downward imbalance energy in this ISP (Qdn priced at the negative imbalance price). DECIMAL(18,4) for the same reason as sum_qup_pup: a per-ISP settlement total, not a unit price, and it overflows DECIMAL(12,4). - `estimated_system_imbalance` DOUBLE [MWh] — Estimated net imbalance of Romania's whole power system for this ISP: realised minus scheduled consumption/production, net of reserve activation. Negative means a deficit. - `realized_consumption` DOUBLE [MW] — Estimated realised (metered) average power drawn by Romania's power system during the ISP. - `imbalance_netting_import` DOUBLE [MWh] — Volume netted by importing balancing energy from a neighbouring system's imbalance via cross-border imbalance netting for this ISP. - `imbalance_netting_export` DOUBLE [MWh] — Volume netted by exporting balancing energy to a neighbouring system for this ISP. - `estimated_unintended_deviation_in_area` DOUBLE [MWh] — Estimated unintended (unscheduled) energy flow INTO Romania's control area for this ISP. - `estimated_unintended_deviation_out_area` DOUBLE [MWh] — Estimated unintended energy flow OUT OF Romania's control area for this ISP. - `snapshot_date` DATE NOT NULL — UTC calendar date this row was fetched on. Computed by the connector, never read from the source. ### system_imbalance Romania's estimated power-system imbalance, one row per 15-minute Imbalance Settlement Period (ISP): whether the system as a whole ran short (Deficit) or long (Surplus), the balancing volumes contracted to correct it, and the reserve actually activated. From Transelectrica's DAMAS `estimatedPowerSystemImbalance` report. - 76.8K rows · 2.2 MB · write mode `upsert` - Physically sorted by: `period_start` - Primary key: `period_start` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/system_imbalance.parquet (76.8K rows) Columns: - `period_start` TIMESTAMPTZ NOT NULL — Start of the 15-minute ISP, UTC. The identity of the row. (range: "2024-06-30 21:00:00+00" … "2026-10-17 23:45:00+00") (~66667 distinct) - `period_end` TIMESTAMPTZ NOT NULL — End of the ISP, UTC. - `isp` INTEGER — Sequence number of this ISP within its settlement day (1-96). - `local_hour` INTEGER — The Romania local-time clock hour this ISP falls in (1-24). - `imbalance_direction` VARCHAR — "Deficit" when the system consumed/produced short of schedule for this ISP, "Surplus" when it ran long. - `estimated_system_imbalance` DOUBLE [MWh] — Estimated net imbalance of Romania's whole power system for this ISP. Negative values pair with imbalance_direction = "Deficit". - `estimated_unintended_deviation_in_area` DOUBLE [MWh] — Estimated unintended (unscheduled) energy flow INTO Romania's control area for this ISP. - `estimated_unintended_deviation_out_area` DOUBLE [MWh] — Estimated unintended energy flow OUT OF Romania's control area for this ISP. - `contracted_bm_volume_up` DOUBLE [MWh] — Balancing-market volume contracted for upward regulation (activating more production or less consumption) in this ISP. - `contracted_bm_volume_down` DOUBLE [MWh] — Balancing-market volume contracted for downward regulation in this ISP. - `imbalance_netting_import` DOUBLE [MWh] — Volume netted by importing balancing energy from a neighbouring system's imbalance via cross-border imbalance netting for this ISP. - `imbalance_netting_export` DOUBLE [MWh] — Volume netted by exporting balancing energy to a neighbouring system for this ISP. - `balancing_exchange` VARCHAR — The cross-border balancing-energy exchange mechanism active for this ISP, or "N/A" when none was used. - `frequency_bias_factor_import` DOUBLE — Frequency bias factor (K-factor) applied on the import side of this control area's contribution to the ENTSO-E synchronous area's frequency restoration for this ISP. - `frequency_bias_factor_export` DOUBLE — Frequency bias factor (K-factor) applied on the export side, same mechanism. - `activated_reserve` DOUBLE [MW] — Total balancing reserve the TSO activated for this ISP, across all reserve types (FCR, aFRR, mFRR, RR combined). - `snapshot_date` DATE NOT NULL — UTC calendar date this row was fetched on. ### consumption_forecast Romania's power-system consumption, forecast versus realised, one row per 15-minute period (the report is named for the hour but Transelectrica's own grain is 15 minutes — see `hourly_interval` below). From DAMAS `dailyConsumptionOverview`, revised as the day progresses: `last_updated_at` moves forward as the realised figure is corrected. - 76.8K rows · 839 KB · write mode `upsert` - Physically sorted by: `period_start` - Primary key: `period_start` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/consumption_forecast.parquet (76.8K rows) Columns: - `period_start` TIMESTAMPTZ NOT NULL — Start of the 15-minute period, UTC. The identity of the row. (range: "2024-06-30 21:00:00+00" … "2026-10-17 23:45:00+00") (~66667 distinct) - `period_end` TIMESTAMPTZ NOT NULL — End of the period, UTC. - `hourly_interval` INTEGER — The Romania local-time clock hour this period belongs to (1-24), as published under the name `hourlyInterval` — despite the name, the underlying grain matches period_start/period_end (15 minutes), not one row per hour. - `gross_forecast_consumption` DOUBLE [MW] — Day-ahead forecast of Romania's gross power-system consumption for this period. - `gross_realized_consumption` DOUBLE [MW] — Realised (metered) gross consumption for this period, as most recently known — see last_updated_at. - `last_updated_at` TIMESTAMPTZ — When Transelectrica last revised this reading, in UTC — DAMAS publishes `lastUpdate` as a Z-suffixed ISO-8601 instant, unconverted. A recent value against an old period means the realised figure was corrected after first publication. - `snapshot_date` DATE NOT NULL — UTC calendar date this row was fetched on. ### interconnection_capacity Romania's cross-border transmission capacity, one row per hour PER BORDER, from DAMAS `capacityLimits`. This report only returns a clean series when queried one border at a time — see the licence notes on the connector and the module comment on `fetchAllCapacityLimits` in `client.ts`, which is why every row here carries the border it belongs to. EU-regulated (CACM) borders publish ttc/trm/ntc_*; borders allocated bilaterally instead (observed for Moldova and Serbia) publish aac_intraday/oc_day_ahead/oc_intraday instead — no single border populates every column. - 172.9K rows · 879 KB · write mode `upsert` - Physically sorted by: `period_start`, `border_direction_code` - Primary key: `period_start`, `border_direction_code` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/interconnection_capacity.parquet (172.9K rows) Columns: - `period_start` TIMESTAMPTZ NOT NULL — Start of the hour, UTC. (range: "2024-06-30 00:00:00+00" … "2026-10-17 23:00:00+00") (~23861 distinct) - `period_end` TIMESTAMPTZ NOT NULL — End of the hour, UTC. - `border_direction_code` VARCHAR NOT NULL — Two-country-code pair naming the direction of this border flow, e.g. "huro" for Hungary -> Romania. Together with period_start this is the identity of the row — the same hour has one row per queried border. (range: "bgro" … "uaro") (~10 distinct) - `border_direction` VARCHAR — Human-readable border name as published, e.g. "HUNGARY-ROMANIA". - `ttc` DOUBLE [MW] — Total Transfer Capacity: the maximum power flow this border can carry while respecting the security limits on both sides, before any reliability margin is deducted. - `trm` DOUBLE [MW] — Transmission Reliability Margin: capacity held back from TTC to absorb the uncertainty in real-time system conditions (NTC = TTC - TRM). - `ntc_actual` DOUBLE [MW] — Net Transfer Capacity currently in force for this hour — TTC minus TRM, adjusted for real-time conditions on borders that recompute it. - `ntc_long_term` DOUBLE [MW] — NTC allocated through long-term (yearly/monthly) capacity auctions. Published as `ntclongterm` by the source. - `ntc_day_ahead` DOUBLE [MW] — NTC made available for day-ahead capacity allocation. - `ntc_intraday` DOUBLE [MW] — NTC made available for intraday capacity allocation. Not published for every border. - `aac_intraday` DOUBLE [MW] — Already Allocated Capacity for the intraday timeframe: capacity already committed via long-term or day-ahead allocation, published in place of ttc/trm on borders that use a bilateral capacity-allocation mechanism rather than the EU CACM methodology (observed on the Moldova and Serbia borders). - `oc_day_ahead` DOUBLE [MW] — Offered Capacity made available for day-ahead allocation, on the same bilaterally allocated borders as aac_intraday. - `oc_intraday` DOUBLE [MW] — Offered Capacity made available for intraday allocation. - `snapshot_date` DATE NOT NULL — UTC calendar date this row was fetched on. ### balancing_energy_activated The volume of each balancing-reserve type Romania's TSO activated, one row per 15-minute ISP, from DAMAS `activatedBalancingEnergyOverview`. The four reserve tiers are the ENTSO-E standard: automatic Frequency Containment Reserve (FCR), automatic Frequency Restoration Reserve (aFRR), manual Frequency Restoration Reserve (mFRR), and Replacement Reserve (RR) — each progressively slower and used to free up the faster tier above it. - 76.7K rows · 898 KB · write mode `upsert` - Physically sorted by: `period_start` - Primary key: `period_start` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/balancing_energy_activated.parquet (76.7K rows) Columns: - `period_start` TIMESTAMPTZ NOT NULL — Start of the 15-minute ISP, UTC. The identity of the row. (range: "2024-06-30 20:45:00+00" … "2026-10-17 09:45:00+00") (~66667 distinct) - `period_end` TIMESTAMPTZ NOT NULL — End of the ISP, UTC. - `fcr` DOUBLE [MWh] — Frequency Containment Reserve activated: the automatic, sub-minute reserve that holds grid frequency at 50 Hz. - `afrr_up` DOUBLE [MWh] — Automatic Frequency Restoration Reserve (aFRR) activated upward: the fast automatic reserve that continuously corrects the imbalance FCR only stabilises. - `afrr_down` DOUBLE [MWh] — aFRR activated downward. - `mfrr_up` DOUBLE [MWh] — Manual Frequency Restoration Reserve (mFRR) activated upward: reserve the TSO dispatches manually, typically within minutes, once aFRR alone isn't enough. - `mfrr_down` DOUBLE [MWh] — mFRR activated downward. - `rr_up` DOUBLE [MWh] — Replacement Reserve (RR) activated upward: the slowest reserve tier, used to relieve aFRR/mFRR so they are available for the next event. - `rr_down` DOUBLE [MWh] — RR activated downward. - `snapshot_date` DATE NOT NULL — UTC calendar date this row was fetched on. ### balancing_marginal_prices The marginal price the TSO paid for each activated balancing-reserve type, one row per 15-minute ISP, from DAMAS `marginalPricesOverview`. Same reserve tiers as balancing_energy_activated (FCR, aFRR, mFRR, RR) priced in Lei/MWh, plus mFRR split into scheduled (contracted ahead of the ISP) and direct (activated in real time). - 76.7K rows · 925 KB · write mode `upsert` - Physically sorted by: `period_start` - Primary key: `period_start` - Files: 1 - https://data-directory.fsn1.your-objectstorage.com/public/transelectrica-damas/v/01M54NGV0369A3HY78D4E6TE0E/balancing_marginal_prices.parquet (76.7K rows) Columns: - `period_start` TIMESTAMPTZ NOT NULL — Start of the 15-minute ISP, UTC. The identity of the row. (range: "2024-06-30 20:45:00+00" … "2026-10-17 09:45:00+00") (~66667 distinct) - `period_end` TIMESTAMPTZ NOT NULL — End of the ISP, UTC. - `fcr` DECIMAL(12,4) [Lei/MWh] — Marginal price paid for Frequency Containment Reserve activation. - `afrr_up` DECIMAL(12,4) [Lei/MWh] — Marginal price paid for upward aFRR activation. - `afrr_down` DECIMAL(12,4) [Lei/MWh] — Marginal price paid for downward aFRR activation. - `mfrr_up` DECIMAL(12,4) [Lei/MWh] — Marginal price paid for upward mFRR activation (any timing). - `mfrr_down` DECIMAL(12,4) [Lei/MWh] — Marginal price paid for downward mFRR activation (any timing). - `rr_up` DECIMAL(12,4) [Lei/MWh] — Marginal price paid for upward Replacement Reserve activation. - `rr_down` DECIMAL(12,4) [Lei/MWh] — Marginal price paid for downward Replacement Reserve activation. - `mfrr_up_scheduled` DECIMAL(12,4) [Lei/MWh] — Marginal price for upward mFRR contracted ahead of the ISP (scheduled activation). - `mfrr_down_scheduled` DECIMAL(12,4) [Lei/MWh] — Marginal price for downward mFRR contracted ahead of the ISP. - `mfrr_up_direct` DECIMAL(12,4) [Lei/MWh] — Marginal price for upward mFRR activated directly in real time, without prior scheduling. - `mfrr_down_direct` DECIMAL(12,4) [Lei/MWh] — Marginal price for downward mFRR activated directly in real time. - `snapshot_date` DATE NOT NULL — UTC calendar date this row was fetched on. ## Performance notes - There are no indexes in a lakehouse. The physical sort order plus Parquet row-group min/max statistics ARE the index. Predicates on the leading sort columns prune whole row groups; everything else is a full column scan. - `imbalance_prices` prunes on `period_start`. - `system_imbalance` prunes on `period_start`. - `consumption_forecast` prunes on `period_start`. - `interconnection_capacity` prunes on `period_start` → `border_direction_code`. - `balancing_energy_activated` prunes on `period_start`. - `balancing_marginal_prices` prunes on `period_start`. - `ILIKE '%needle%'` cannot prune: it decompresses that whole column. Prefer prefix predicates on the lowercased search companion columns where they exist. - Every file URL under `/v//` is immutable. Cache it as aggressively as you like. - Files are never rewritten in place — a new ingest writes a new version path. Re-read the manifest to pick up updates rather than polling the file URLs. - Pull only the columns you need. Parquet is columnar and the reader range-GETs what it reads. ## Do not - Do not scrape https://data.bunnytech.app HTML. Every number on those pages comes from the manifest above. - Do not hit the upstream source (https://newmarkets.transelectrica.ro/) in bulk. This mirror exists so you do not have to. - Do not read DuckLake internal data files with a plain Parquet reader. They come with positional delete files, and ignoring those silently returns deleted rows. Use the ducklake extension, or use the published exports above. - Do not republish without the attribution line, and do not imply endorsement.