oneapi
Sign in
Energie v1 / Piaţa de energie

Window summary

Price, consumption and production by source for an interval, gathered into a single response, with total energy computed from the interval powers.

GET
https://oneapi.ro/api/energie/v1/piata/sumar

Query parameters

NameTypeDescriptionAccepted values
de_laoptional string | null Start of the window. Defaults to 7 days ago. e.g. 2026-09-01
pana_laoptional string | null End of the window. Defaults to now. e.g. 2026-09-07
zonaoptional string | null The EIC code of the bidding zone. Defaults to Romania. The only zone imported today is 10YRO-TEL------P; any other value returns 422, not an empty series. The list is in /piata/acoperire, under zone_ofertare. 10YRO-TEL------P

How it behaves

  • The history has a gap, and it is visible at /piata/acoperire. The series starts in 2015, but the historical import is still in progress: about 28-30 months are currently missing (2015-03 → 2017-08). A request falling inside the gap returns 200 with an empty list — which does NOT mean the market had no activity, but that the period has not been imported yet. The goluri field in the coverage route lists exactly which months are missing, computed from the data, so it shrinks on its own as the history fills in.
  • The series can extend past the present moment. Day-ahead prices are published in advance, so the last interval in the response is often an hour that has not been consumed yet. This is not an error and not a forecast of ours: it is the firm quotation, published by the exchange before delivery. The practical consequence: a window ending "now" can mix already-consumed hours with hours not yet delivered, and an average over it lumps them together. If you need strictly realised data, cut the window at the current hour.
  • Energy (MWh) is derived: average power × interval duration, summed. It is not a quantity the source publishes — which is why every average here is weighted by duration, never arithmetic.
  • regenerabil_procent is computed only over codes confirmed as renewable. When unconfirmed codes carry output, procent_este_minim turns true: the true share is at least this much, possibly more. We would rather say so than ship a round, false percentage.
  • The balance is explicit and does not close exactly: generation + import − export does not equal load. Measured over 1-6 September 2026, the difference was 2.4% of load. Generation is published only for units above the reporting threshold, while load is the actual load, network losses included. A few percent is normal; tens of percent means data is missing from the requested window.
  • These figures are not comparable with the sen zone. That is the Transelectrica snapshot, at irregular moments; this is the official European series, at a fixed step. Different sources, different definitions.

What it is for

  • You want a single request that says what electricity cost, how much was consumed and what it was generated from.
  • Report the renewable share over a month, with energy computed correctly from power and duration.
  • Compare one week against another without pulling tens of thousands of intervals.

Response structure

All fields below live inside data.

FieldTypeDescription
productie.energie_totala_mwh number Energia produsă în fereastră, derivată.
productie.regenerabil_procent number Ponderea regenerabilelor, ori null dacă nu există producţie.
productie.procent_este_minim boolean Dacă procentul e un minim din cauza codurilor neconfirmate.
consum.energie_mwh number Energia consumată, derivată.
preturi object Price statistics over the window: minimum, maximum, weighted average, negative intervals, hours covered.
consum.intervale integer How many load intervals enter the calculation.
consum.putere_medie_mw number Average load over the window, weighted by duration.
consum.minim_mw integer The lowest load in the window.
consum.maxim_mw integer The load peak in the window.
productie.energie_regenerabila_mwh number Energy generated from sources confirmed as renewable.
productie.pe_sursa[].sursa object The generation type, with its code and label.
productie.pe_sursa[].putere_medie_mw number The source average power over the window.
productie.pe_sursa[].putere_maxima_mw integer The source peak in the window.
productie.pe_sursa[].energie_mwh number Energy produced by the source, derived from power × duration.
schimburi.import_mwh number Energy into the zone over the window, across all borders.
schimburi.export_mwh number Energy out of the zone.
schimburi.sold_mwh number The balance: import − export.
schimburi.directie_neta string Whether the zone was a net importer or exporter.
schimburi.pe_granita array The same figures, broken down per border.
bilant.productie_mwh number Energy generated over the window.
bilant.import_mwh number Energy in through the borders.
bilant.export_mwh number Energy out through the borders.
bilant.disponibil_mwh integer Generation + import − export: how much was available in the zone.
bilant.consum_mwh number Actual load, for comparison.
bilant.diferenta_mwh number How much the balance does NOT close by. Not an error — see the note.
bilant.diferenta_procent number The same difference, relative to load.
bilant.observatie string Why the balance does not close exactly, and past what point the difference becomes a signal.
coduri_neconfirmate array Codes with output that have no confirmed label.
observatie string How to read derived energy, and why it is not comparable with the sen zone.
sursa object ENTSO-E Transparency Platform, with the required attribution.

Response examples

GEThttps://oneapi.ro/api/energie/v1/piata/sumar
{
    "data": {
        "zona": "10YRO-TEL------P",
        "de_la": "2026-09-29 20: 39: 53",
        "pana_la": "2026-10-06 20: 39: 53",
        "preturi": {
            "intervale": 593,
            "primul": "2026-09-29T20: 45: 00+03: 00",
            "ultimul": "2026-10-06T00: 45: 00+03: 00",
            "minim_eur_mwh": 0.69,
            "maxim_eur_mwh": 435.08,
            "medie_ponderata_eur_mwh": 170.1,
            "intervale_cu_pret_negativ": 0,
            "ore_acoperite": 148.25
        },
        "consum": {
            "intervale": 152,
            "putere_medie_mw": 5462.7,
            "minim_mw": 3994,
            "maxim_mw": 7076,
            "energie_mwh": 207581.8
        },
        "productie": {
            "energie_totala_mwh": 190131.5,
            "energie_regenerabila_mwh": 112773.9,
            "regenerabil_procent": 59.3,
            "procent_este_minim": false,
            "pe_sursa": [
                {
                    "sursa": {
                        "cod": "B19",
                        "nume": "Eolian (pe uscat)",
                        "grupa": "eolian",
                        "regenerabila": true,
                        "confirmat": true
                    },
                    "intervale": 152,
                    "putere_medie_mw": 1580.6,
                    "putere_maxima_mw": 2446,
                    "energie_mwh": 60064.5
                }
            ]
        },
        "schimburi": {
            "import_mwh": 159706.9,
            "export_mwh": 84351.4,
            "sold_mwh": 75355.5,
            "directie_neta": "import",
            "pe_granita": [
                {
                    "vecin": "BG",
                    "vecin_denumire": "Bulgaria",
                    "vecin_eic": "10YCA-BULGARIA-R",
                    "rezolutie_min": 60,
                    "import_mwh": 133302.2,
                    "export_mwh": 15671.3,
                    "import_putere_medie_mw": 1101.7,
                    "export_putere_medie_mw": 129.5,
                    "intervale": 242,
                    "sold_mwh": 117630.9,
                    "directie_neta": "import"
                }
            ]
        },
        "bilant": {
            "productie_mwh": 190131.5,
            "import_mwh": 159706.9,
            "export_mwh": 84351.4,
            "disponibil_mwh": 265487,
            "consum_mwh": 207581.8,
            "diferenta_mwh": -57905.2,
            "diferenta_procent": -27.9,
            "observatie": "Bilanţul NU se închide exact şi nici nu are cum: producţia se publică doar pentru unităţile peste pragul de raportare, iar consumul e sarcina realizată, cu pierderile de reţea incluse. O diferenţă de câteva procente e normală; una de zeci de procente înseamnă date lipsă în fereastra cerută."
        },
        "coduri_neconfirmate": [],
        "observatie": "Energia e derivată din puterea medie × durata intervalului. Nu se compară direct cu zona `sen`, care e instantaneul Transelectrica, cu altă definiție și alt pas.",
        "sursa": {
            "nume": "ENTSO-E Transparency Platform",
            "url": "https://transparency.entsoe.eu",
            "atribuire": "Date din ENTSO-E Transparency Platform.",
            "licenta": "Reutilizare permisă cu ATRIBUIRE obligatorie către Transparency Platform. Drepturile nu sunt sublicențiabile.",
            "observatie": "Zona `piata` e seria oficială europeană; zona `sen` e instantaneul Transelectrica. Au surse, pași și definiții diferite — cifrele lor nu se compară direct."
        }
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
422validareThe window is reversed.
429cota_depasitaThe plan's monthly quota has been exceeded (see Retry-After).

All errors share the same shape. eroare.cod is stable and is the value you should branch on in code — not the text in mesaj, which may change.

{
    "eroare": {
        "cod": "validare",
        "mesaj": "The window is reversed.",
        "detalii": {
            "de_la": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}