oneapi
Sign in
Energie v1 / Piaţa de energie

Electricity price, interval by interval

The day-ahead market price series, interval by interval, in EUR/MWh — quarter-hourly since the resolution changed, hourly before. The answer states which resolution each stretch had.

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

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
per_paginaoptional text Intervals per page, up to 2000. e.g. 96
paginaoptional text The page, counted from 1. e.g. 1

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.
  • The day-ahead price of the bidding zone, exactly as ENTSO-E Transparency Platform publishes it. This is not the price on your bill: grid tariffs, certificates and the supplier margin sit on top of it.
  • The price can be negative and it stays that way in the response. It happens when renewable generation exceeds demand and someone pays to shed energy. Clamping negatives to zero falsifies the daily average.
  • The resolution is not constant. The market moved to the quarter hour while older series stay hourly — which is why every interval carries its own rezolutie_min, and every average we compute is weighted by duration. An arithmetic mean over the mix gives a wrong result that looks plausible.
  • sumar is computed over the whole window, not the returned page — otherwise paging would change the average.

What it is for

  • Index a supply contract to the market price and you need the exact series, not an average.
  • Pick the hour of day to start a flexible load — a fleet charging, a heat pump, an industrial process.
  • Chart what electricity cost yesterday, including the intervals where the price went negative.

Response structure

FieldTypeDescription
data.serie[].moment string Începutul intervalului, ISO 8601 în UTC.
data.serie[].rezolutie_min integer 15 sau 60.
data.serie[].pret_eur_mwh number Preţul intervalului. Poate fi negativ.
data.sumar object Statistics for the whole window, not just the page: minimum, maximum, weighted average, how many intervals were negative.
data.sumar.medie_ponderata_eur_mwh number Media pe fereastră, ponderată cu durata.
data.zona string The EIC code of the bidding zone the series belongs to.
data.de_la string Start of the requested window, in UTC.
data.pana_la string End of the requested window, in UTC.
data.fara_date null Present (non-null) ONLY when the series is empty, and says WHY: motiv is dupa_acoperire (the window is past the last imported point), inainte_de_acoperire, or gol_in_acoperire (a hole inside the history). acoperire gives the real ends of the series. ⚠️ An empty series does NOT mean the market had no activity.
data.sumar.intervale_cu_pret_negativ integer How many intervals priced below zero. Not a data anomaly.
data.sumar.ore_acoperite number How many market hours the intervals in the window cover — it shows the gaps without you having to look for them.
data.observatie string How to read negative prices and the mixed resolutions.
data.sursa object ENTSO-E Transparency Platform, with the required attribution.
meta.paginare.pagina integer Current page, counted from 1.
meta.paginare.per_pagina integer How many records a page holds.
meta.paginare.total integer Total matching records, beyond the current page.
meta.paginare.pagini integer How many pages the list has.

Response examples

GEThttps://oneapi.ro/api/energie/v1/piata/preturi
{
    "data": {
        "zona": "10YRO-TEL------P",
        "de_la": "2026-09-29 20: 39: 50",
        "pana_la": "2026-10-06 20: 39: 50",
        "fara_date": null,
        "sumar": {
            "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
        },
        "serie": [
            {
                "moment": "2026-09-29T20: 45: 00+03: 00",
                "rezolutie_min": 15,
                "pret_eur_mwh": 242.65
            }
        ],
        "observatie": "Prețurile pot fi NEGATIVE — se întâmplă când producția regenerabilă depășește cererea. Nu e o eroare de date. `rezolutie_min` spune cât durează intervalul: seriile recente sunt la 15 minute, cele vechi la o oră.",
        "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."
        }
    },
    "meta": {
        "paginare": {
            "pagina": 1,
            "per_pagina": 500,
            "total": 593,
            "pagini": 2
        }
    }
}

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, or the paging parameters exceed the limits.
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, or the paging parameters exceed the limits.",
        "detalii": {
            "de_la": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}