oneapi
Sign in
Energie v1 / Piaţa de energie

Daily average price

One value per day: the average weighted by interval duration, not the arithmetic mean of the intervals. The two differ precisely on the days when the resolution changed mid-way.

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

Query parameters

NameTypeDescriptionAccepted values
de_laoptional string | null First day included. Defaults to 7 days ago. e.g. 2026-08-01
pana_laoptional string | null Last day included. 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.
  • The daily average is weighted by interval duration. On a day of 96 quarter hours it matches the arithmetic mean; on a day where the source mixes resolutions it does not — and the difference is invisible to the eye.
  • Read zi_completa before using an average. A half-published day still yields an average, and it looks exactly as credible as any other. ore_acoperite tells you precisely how much is missing.
  • The day is bounded in UTC, like the rest of the series. On a clock-change day the local day has 23 or 25 hours — if you work in Romanian time, rebuild the day from the interval route.

What it is for

  • You need the daily reference for an indexed contract without processing 96 intervals.
  • Compare whole months of price without pulling the full series.
  • Spot partially published days so you do not use them as a reference.

Response structure

All fields below live inside data.

FieldTypeDescription
zile[].zi string Ziua, AAAA-LL-ZZ, în UTC.
zile[].medie_ponderata_eur_mwh number Media ponderată a zilei.
zile[].zi_completa boolean Dacă ziua acoperă cel puţin 23,9 ore.
zile[].minim number The lowest price of the day.
zile[].maxim number The highest price of the day.
zile[].intervale integer How many intervals were published that day.
zile[].ore_acoperite number How many hours the day intervals cover. A full day has 24.
inregistrari integer How many days are in the response.
observatie string Why the average is weighted and why you must read zi_completa.
sursa object ENTSO-E Transparency Platform, with the required attribution.

Response examples

GEThttps://oneapi.ro/api/energie/v1/piata/preturi/zilnic
{
    "data": {
        "zona": "10YRO-TEL------P",
        "de_la": "2026-09-29 20: 39: 50",
        "pana_la": "2026-10-06 20: 39: 50",
        "inregistrari": 8,
        "zile": [
            {
                "zi": "2026-09-29",
                "medie_ponderata_eur_mwh": 209.47,
                "minim": 180.71,
                "maxim": 242.65,
                "intervale": 13,
                "ore_acoperite": 3.25,
                "zi_completa": false
            }
        ],
        "observatie": "Media zilnică e PONDERATĂ cu durata fiecărui interval, nu aritmetică: altfel un sfert de oră ar cântări cât o oră întreagă. Verifică `zi_completa` înainte de a folosi o medie ca referință — o zi publicată parțial dă o medie care pare validă.",
        "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."
            ]
        }
    }
}