—
Datos abiertos

Todo lo que la página muestra, para usarlo fuera de ella.

Cinco documentos JSON con el estado del día y los modelos, y cada tabla completa en CSV. Sin clave, sin límite y con CORS abierto: se pueden pedir desde cualquier sitio web. Cada número es una copia de lo que publicaron CELEC, CENACE, XM, Open-Meteo o la NOAA; cítelos a ellos y a este proyecto.

Lo que se promete

  • schema_version (1 hoy) es la versión del formato, no de un modelo. Solo cambia cuando se quita, se renombra o cambia de tipo un campo. Añadir un campo no la cambia: un lector debe ignorar los campos que no conoce.
  • Cada documento se valida en cada cambio contra su esquema JSON; un cambio de forma es una prueba que falla antes de ser un lector roto.
  • data_date es la misma fecha en todos: el día de Ecuador que describen las lecturas del documento. En los modelos es igual a origin_date, el día sobre el que se paran.
  • Los códigos son palabras en inglés estables (ords_levels, report_endpoint, watch); junto a cada uno va su etiqueta en español (label_es, declaration_es, tier_label_es).
  • Un campo que se va a quitar se anuncia en el bloque deprecated del documento y se mantiene una versión. Hoy: as_of en latest.json y status.json (use data_date) y feeds[].feed en status.json (use id y label_es). El campo tier de la suficiencia conserva la palabra del modelo; el código estable es tier_code.
  • Lo que no se promete: que un modelo no cambie. Cada documento dice qué modelo y qué versión lo produjo.

Cuándo cambian

El trabajo diario está programado a las 12:47 UTC (07:47 en Ecuador), 16:53 UTC (11:53 en Ecuador), 20:47 UTC (15:47 en Ecuador) y 00:47 UTC (19:47 en Ecuador). GitHub suele empezarlo con retraso, a veces de horas, así que la hora real de cada documento es su generated_at. Las cotas de CELEC llegan la mañana siguiente al día que describen, y el balance de CENACE cierra el día anterior hacia las 11:15 de Ecuador, así que data_date suele ser ayer. La lectura del día se genera después de los modelos y puede quedarse un día atrás; lo dice su propia fecha.

Los documentos se sirven con Access-Control-Allow-Origin: * y una caché de cinco minutos. La última comprobación, del 19 oct 2026, vio 12 de 12 fuentes al día.

Licencia: código MIT. Datos: CELEC EP (servicios web públicos de una empresa del Estado; no declaran licencia); CENACE (servicios web públicos del operador del sistema; no declaran licencia); XM S.A. E.S.P. (portal de datos públicos del operador del mercado colombiano); Open-Meteo (ERA5 and forecast models) (CC BY 4.0 (https://open-meteo.com/en/terms); la API gratuita es para uso no comercial); GEOGLOWS Hydrologic Model v2 (ECMWF, BYU; shown in Ecuador by the INAMHI–GEOGLOWS portal) (CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/; https://geoglows-v2.s3-us-west-2.amazonaws.com/licenses.md). Modificado aquí: el miembro de alta resolución del pronóstico se promedia por día y se corrige con el caudal medido por CELEC, y los máximos anuales de la simulación desde 1980 se ajustan a una distribución de Gumbel); GEOGLOWS v2 retrospective return periods (Riley Chad Hales; revision 4 of 2026-06-10) (CC BY-NC-SA 4.0 (https://creativecommons.org/licenses/by-nc-sa/4.0/), la licencia de este almacén solamente: citarlo, sin uso comercial, compartir igual); European Centre for Medium-Range Weather Forecasts (ECMWF) (Copyright "© 2023 European Centre for Medium-Range Weather Forecasts (ECMWF)". Fuente: www.ecmwf.int. Licencia: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). El ECMWF no acepta responsabilidad alguna por errores u omisiones en los datos, su disponibilidad, ni por pérdidas o daños derivados de su uso); NOAA PSL / CPC (obra del Gobierno de EE. UU., dominio público).

Los documentos

/api/latest.json

esquema · lo escribe scripts/publish.ts

El estado del día: la cota, las bandas, las pendientes y el caudal de cada embalse, el balance nacional del último día cerrado, el cambio desde ayer de cada uno, y el nivel de suficiencia copiado de adequacy.json.

Los 117 campos
Campos de latest.json, con su tipo y su unidad
CampoTipoUnidadSiempreDescripción (del esquema)
schema_versionintegersíThe format version. Changes only when a field is removed, renamed or retyped; added fields do not change it.
generated_atstringsíWhen the document was written, UTC.
data_datestring | nullsíThe Ecuadorian calendar day the document's readings describe.
as_ofstringsíDeprecated. Deprecated: the day the job ran. Use data_date. Removed in schema_version 2.
disclaimerstringsí
reservoirslistasí
reservoirs[].sitestringsí
reservoirs[].labelstringsí
reservoirs[].basinstringsí
reservoirs[].levelobjeto | nullsí
reservoirs[].level.maslnumberm s. n. m.sí
reservoirs[].level.datestringsí
reservoirs[].level.first_readingstringsí
reservoirs[].level.daysintegerdíassí
reservoirs[].level.observed_min_maslnumberm s. n. m.sí
reservoirs[].level.observed_max_maslnumberm s. n. m.sí
reservoirs[].level.previousobjeto | nullsí
reservoirs[].level.previous.maslnumberm s. n. m.sí
reservoirs[].level.previous.datestringsí
reservoirs[].level.delta_1d_mnumber | nullmsí
reservoirs[].bandslistasí
reservoirs[].bands[].min_maslnumberm s. n. m.sí
reservoirs[].bands[].max_maslnumberm s. n. m.sí
reservoirs[].bands[].declarationstring: "report_endpoint", "dashboard_chart_title", "operational_minimum"síHow CELEC declared the band, as a code.
reservoirs[].bands[].declaration_esstringsí
reservoirs[].bands[].sourcestringsí
reservoirs[].bands[].observed_fromstringsí
reservoirs[].bands[].observed_tostringsí
reservoirs[].bands[].band_pctnumber | null%sí(level - min) / (max - min) * 100. A position in the band, not stored water.
reservoirs[].bands[].metres_above_minnumber | nullsí
reservoirs[].slopes_m_per_dayobjetom/díasí
reservoirs[].slopes_m_per_day.d7number | nullm/díasí
reservoirs[].slopes_m_per_day.d14number | nullm/díasí
reservoirs[].slopes_m_per_day.d30number | nullm/díasí
reservoirs[].inflowobjeto | nullsí
reservoirs[].inflow.m3snumberm³/ssí
reservoirs[].inflow.datestringsí
reservoirs[].inflow.first_readingstringsí
reservoirs[].inflow.daysintegerdíassí
reservoirs[].inflow.climatologyobjeto | nullsí
reservoirs[].inflow.climatology.p10numbersí
reservoirs[].inflow.climatology.p50numbersí
reservoirs[].inflow.climatology.p90numbersí
reservoirs[].inflow.climatology.yearsintegersí
reservoirs[].inflow.climatology.nintegersí
reservoirs[].inflow.climatology.percentile_todaynumber | nullsí
reservoirs[].inflow.previousobjeto | nullsí
reservoirs[].inflow.previous.m3snumberm³/ssí
reservoirs[].inflow.previous.datestringsí
reservoirs[].inflow.delta_1d_m3snumber | nullm³/ssí
reservoirs[].inflow.return_periodsobjetosíToday's inflow against the floods this river is known for, from two sources kept apart because they disagree: GEOGLOWS v2 (the model behind INAMHI's portal, inamhi.geoglows.org) and the same statistic fitted on CELEC's record. data/reports/return-periods.md compares them.
reservoirs[].inflow.return_periods.geoglowsobjeto | nullsíThe return periods INAMHI's Hydroviewer (inamhi.geoglows.org) draws for the GEOGLOWS v2 river matched to this dam, beside the GEOGLOWS store's own fits (data/reference/geoglows_return_periods.csv). Null where no river matched or `npm run geoglows` has not run. `inamhi` and `simulated_vs_measured` are computed here from GEOGLOWS' daily simulation (CC BY 4.0, attribution `geoglows`); `daily` and `hourly` are copied from its return-period store (CC BY-NC-SA 4.0, attribution `geoglows_return_periods`).
reservoirs[].inflow.return_periods.measuredobjeto | nullsíThe same Gumbel fit on the annual maxima of CELEC's daily inflow, over calendar years with at least 330 readings. Null with fewer than five such years.
nationalobjeto | nullsí
national.datestringsí
national.supply_gwhlistaGWhsí
national.supply_gwh[].conceptstringsí
national.supply_gwh[].gwhnumberGWhsí
national.supply_gwh[].pctnumber%sí
national.total_generation_gwhnumber | nullGWhsí
national.total_import_gwhnumber | nullGWhsí
national.total_export_gwhnumber | nullGWhsí
national.distribution_demand_gwhnumber | nullGWhsí
national.transport_losses_gwhnumber | nullGWhsí
national.hydro_share_pctnumber | null%sí
national.thermal_share_pctnumber | null%sí
national.import_share_pctnumber | null%sí
national.previousobjeto | nullsí
national.previous.datestringsí
national.previous.total_generation_gwhnumber | nullGWhsí
national.previous.total_import_gwhnumber | nullGWhsí
national.previous.hydro_share_pctnumber | null%sí
national.previous.thermal_share_pctnumber | null%sí
national.previous.import_share_pctnumber | null%sí
national.delta_1dobjeto | nullsí
national.delta_1d.hydro_share_pct_pointsnumber | nullpuntos porcentualessí
national.delta_1d.thermal_share_pct_pointsnumber | nullpuntos porcentualessí
national.delta_1d.import_share_pct_pointsnumber | nullpuntos porcentualessí
national.delta_1d.total_generation_gwhnumber | nullGWhsí
liveobjeto | nullsíToday so far: CENACE Información Operativa's running total since local midnight (preliminary SCADA), newer than national and partial. Totals are not comparable with a closed day; shares are over production plus imports, as in national. Null when no real-time reading has been stored.
live.datestringsíThe Ecuadorian calendar day the running total covers.
live.fetched_atstringsíWhen CENACE's page was read, UTC; the total covers local midnight up to about this instant.
live.total_production_gwhnumber | nullGWhsí
live.hydro_gwhnumber | nullGWhsí
live.thermal_gwhnumber | nullGWhsí
live.nonconventional_gwhnumber | nullGWhsí
live.import_gwhnumber | nullGWhsí
live.export_gwhnumber | nullGWhsí
live.hydro_share_pctnumber | null%sí
live.thermal_share_pctnumber | null%sí
live.import_share_pctnumber | null%sí
adequacyobjeto | nullsí
adequacy.origin_datestringsí
adequacy.tierstring: "holgado", "vigilancia", "ajustado", "deficit"síThe model's Spanish word. Kept in schema_version 1; use the *_code field beside it.
adequacy.tier_codestring: "comfortable", "watch", "tight", "deficit"sí
adequacy.tier_label_esstringsí
adequacy.worst_tierstring: "holgado", "vigilancia", "ajustado", "deficit"síThe model's Spanish word. Kept in schema_version 1; use the *_code field beside it.
adequacy.worst_tier_codestring: "comfortable", "watch", "tight", "deficit"sí
adequacy.worst_tier_label_esstringsí
adequacy.worst_tier_horizon_daysintegerdíassí
adequacy.narrative_tier_fieldstringsíThe tier the daily narrative is written about.
adequacy.worst_deficit_gwh_daynumberGWh/díasí
adequacy.run_idstringsí
deprecatedobjetonoFields kept for one more schema version, each with what replaces it.
licenseobjetosí
license.codestringsí
license.code_urlstringsí
license.datastringsí
license.data_esstringsí
attributionlistasí
attribution[].idstringsí
attribution[].namestringsí
attribution[].providesstringsí
attribution[].urlstringsí
attribution[].termsstringsí
attribution[].terms_esstringsí
see_alsoobjetosíAbsolute URLs to the other documents, this document's schema and the documentation page.

/api/status.json

esquema · lo escribe scripts/check.ts

Si cada fuente sigue llegando: la última fecha de cada una frente a su límite, el tamaño de cada tabla y los avisos abiertos de las comprobaciones.

Los 33 campos
Campos de status.json, con su tipo y su unidad
CampoTipoUnidadSiempreDescripción (del esquema)
schema_versionintegersíThe format version. Changes only when a field is removed, renamed or retyped; added fields do not change it.
generated_atstringsíWhen the document was written, UTC.
data_datestring | nullsíThe Ecuadorian calendar day the document's readings describe.
as_ofstringsíDeprecated. Deprecated: the day the check ran. Use data_date. Removed in schema_version 2.
okbooleansí
statusstring: "pass", "info", "warn", "fail"sí
feedslistasí
feeds[].idstringsí
feeds[].label_esstringsí
feeds[].feedstringsíDeprecated. Deprecated English label. Use id and label_es.
feeds[].lateststring | nullsí
feeds[].limit_daysintegerdíassí
feeds[].statestring: "current", "stale", "not_ingested"sí
tablesobjetosí
findingslistasí
findings[].checkstringsí
findings[].levelstring: "info", "warn", "fail"sí
findings[].messagestringsí
countsobjetono
deprecatedobjetonoFields kept for one more schema version, each with what replaces it.
licenseobjetosí
license.codestringsí
license.code_urlstringsí
license.datastringsí
license.data_esstringsí
attributionlistasí
attribution[].idstringsí
attribution[].namestringsí
attribution[].providesstringsí
attribution[].urlstringsí
attribution[].termsstringsí
attribution[].terms_esstringsí
see_alsoobjetosíAbsolute URLs to the other documents, this document's schema and the documentation page.

/api/forecast.json

esquema · lo escribe scripts/forecast.ts

La cota de Mazar a 7, 14, 30, 60 y 90 días como p10/p50/p90, los días hasta cada umbral bajo años análogos, y la validación que la puntúa.

Los 152 campos
Campos de forecast.json, con su tipo y su unidad
CampoTipoUnidadSiempreDescripción (del esquema)
schema_versionintegersíThe format version. Changes only when a field is removed, renamed or retyped; added fields do not change it.
generated_atstringsíWhen the document was written, UTC.
data_datestring | nullsíThe Ecuadorian calendar day the document's readings describe.
run_idstringsí
origin_datestringsíThe day the forecast stands on; equal to data_date.
sitestringsí
variablestringno
unitsstringno
disclaimerstringsí
modelobjetosí
model.idstringsí
model.labelstringsí
model.versionstringsí
model.backtest_originsintegersí
currentobjetosí
current.level_maslnumberm s. n. m.sí
current.observed_onstringsí
current.storage_above_lowest_threshold_hm3number | nullhm³sí
current.surface_area_km2numberkm²sí
current.release_stance_m3snumberm³/ssí
thresholdslistasí
thresholds[].namestringsí
thresholds[].level_maslnumberm s. n. m.sí
thresholds[].sourcestringsí
thresholds[].statusstring: "published", "unverified"sí
thresholds[].notestringsí
thresholds[].metres_abovenumber | nullsí
forecastlistasí
forecast[].horizon_daysintegerdíassí
forecast[].target_datestringsí
forecast[].p10numbersí
forecast[].p50numbersí
forecast[].p90numbersí
forecast[].median_backtest_residual_mnumber | nullmno
forecast[].ensembleobjetosí
forecast[].ensemble.p10numbersí
forecast[].ensemble.p90numbersí
forecast[].ensemble.nintegersí
forecast[].ensemble.yearslistasí
forecast[].modelstringno
days_to_thresholdobjetosí
days_to_threshold.horizon_daysintegerdíassí
days_to_threshold.notestringsí
days_to_threshold.thresholdslistasí
days_to_threshold.thresholds[].thresholdstringsí
days_to_threshold.thresholds[].level_maslnumberm s. n. m.sí
days_to_threshold.thresholds[].statusstringsí
days_to_threshold.thresholds[].across_all_analogue_yearsobjetosí
days_to_threshold.thresholds[].across_all_analogue_years.analogue_yearsintegersí
days_to_threshold.thresholds[].across_all_analogue_years.years_that_crossintegersí
days_to_threshold.thresholds[].across_all_analogue_years.p10_daysnumber | nulldíassí
days_to_threshold.thresholds[].across_all_analogue_years.p50_daysnumber | nulldíassí
days_to_threshold.thresholds[].across_all_analogue_years.p90_daysnumber | nulldíassí
days_to_threshold.thresholds[].scenarioslistasí
days_to_threshold.thresholds[].scenarios[].scenariostringsí
days_to_threshold.thresholds[].scenarios[].analogYearintegersí
days_to_threshold.thresholds[].scenarios[].inflowMeanM3snumbersí
days_to_threshold.thresholds[].scenarios[].crossesOnstring | nullsí
days_to_threshold.thresholds[].scenarios[].daysnumber | nulldíassí
days_to_threshold.thresholds[].scenarios[].minimumLevelMaslnumbersí
backtestobjetosí
backtest.reportstringsí
backtest.horizonslistasí
backtest.horizons[].horizon_daysintegerdíassí
backtest.horizons[].nintegersí
backtest.horizons[].mae_mnumbermsí
backtest.horizons[].skill_vs_persistencenumbersí
backtest.horizons[].coverage_p10_p90numbersí
crisis_checkobjetosí
crisis_check.threshold_maslnumberm s. n. m.sí
crisis_check.origins_consideredintegersí
crisis_check.false_alarms_p50integersí
crisis_check.episodeslistasí
crisis_check.episodes[].crossed_onstringsí
crisis_check.episodes[].p50_lead_time_daysnumber | nulldíassí
crisis_check.episodes[].p10_lead_time_daysnumber | nulldíassí
precipitation_basinobjetonoWhich basin's ERA5 precipitation the Mazar run read: the verified catchment centroid once its history is adequate, the provisional point until then. Additive; absent before 2026-09-23.
precipitation_basin.basinstringsí
precipitation_basin.verified_centroidbooleansíTrue when basin is the verified centroid; false on the provisional fallback.
precipitation_basin.era5_daysintegerdíassí
precipitation_basin.share_since_1990numbersíShare of days since 1990-01-01 present in the basin's ERA5 series.
precipitation_basin.fallback_reasonstring | nullsíWhy the verified centroid was not used; null when it was.
inflow_forecastsobjetonoMean inflow forecasts for the plants whose level is not worth forecasting (ENHANCEMENTS §5.3). A horizon is published only where the published rung (`backtest.model`: since 2026-09-25 the ensemble, the mean of the analogue years and climatology, plus a river forecast where one is validated) beats persistence and climatology on the backtest; the others carry the reason. Additive; absent before 2026-09-23.
inflow_forecasts.reportstringsí
inflow_forecasts.notestringsí
inflow_forecasts.plantslistasí
inflow_forecasts.plants[].sitestringsí
inflow_forecasts.plants[].origin_datestringsí
inflow_forecasts.plants[].variablestringsí
inflow_forecasts.plants[].targetstringsí
inflow_forecasts.plants[].precip_basinstring | nullsíThe basin whose rain conditions the analogue years; null when its ERA5 history is not adequate.
inflow_forecasts.plants[].rain_conditionedbooleansí
inflow_forecasts.plants[].horizonslistasí
inflow_forecasts.plants[].horizons[].horizon_daysintegerdíassí
inflow_forecasts.plants[].horizons[].publishedbooleansí
inflow_forecasts.plants[].horizons[].reasonstringsí
inflow_forecasts.plants[].horizons[].backtestobjetosí
inflow_forecasts.plants[].horizons[].target_datestringnoPresent only on a published horizon.
inflow_forecasts.plants[].horizons[].p10numbernom³/s; present only on a published horizon.
inflow_forecasts.plants[].horizons[].p50numbernom³/s; present only on a published horizon.
inflow_forecasts.plants[].horizons[].p90numbernom³/s; present only on a published horizon.
inflow_forecasts.plants[].horizons[].ensemble_yearsintegerno
inflow_forecasts.plants[].horizons[].rain_conditionedbooleanno
scorecardobjetonoHow the published level forecasts (Mazar's level on the target day, m) did once their horizons passed (ENHANCEMENTS §5.1): every published run scored under the model and version that made it, the last run per origin and version only. Additive; absent in documents written before 2026-09-23.
scorecard.generated_atstringsíWhen the scorecard was computed, UTC.
scorecard.observed_throughstring | nullsíThe last day with an observation to score against.
scorecard.targetstringsíThe quantity scored, in words.
scorecard.unitsstring: "m", "GWh/day"sí
scorecard.runs_consideredintegersí
scorecard.runs_supersededintegersíRuns left out because a later run for the same origin and version replaced them.
scorecard.rows_scoredintegersí
scorecard.rows_pendingintegersíPublished rows whose target date is after observed_through.
scorecard.rows_excludedintegersíRows whose date passed with no usable observation.
scorecard.methodstringsí
scorecard.by_horizonlistasíOne row per model, model version and horizon with at least one scored row.
scorecard.by_horizon[].model_idstringsí
scorecard.by_horizon[].model_versionstringsí
scorecard.by_horizon[].horizon_daysintegerdíassí
scorecard.by_horizon[].nintegersí
scorecard.by_horizon[].maenumber | nullsíMean absolute error of the p50, in units.
scorecard.by_horizon[].biasnumber | nullsíMean of observed minus p50, in units.
scorecard.by_horizon[].n_bandintegersíRows that carried a p10 and a p90.
scorecard.by_horizon[].coverage_p10_p90number | nullsíShare of banded rows observed inside p10–p90, 0–1.
scorecard.by_horizon[].pinball_meannumber | nullsíMean pinball loss over p10, p50 and p90.
scorecard.by_horizon[].first_originstring | nullsí
scorecard.by_horizon[].last_originstring | nullsí
scorecard.recentlistasíThe most recent scored rows, newest target date first.
scorecard.recent[].run_idstringsí
scorecard.recent[].model_idstringsí
scorecard.recent[].model_versionstringsí
scorecard.recent[].origin_datestringsí
scorecard.recent[].horizon_daysintegerdíassí
scorecard.recent[].target_datestringsí
scorecard.recent[].p10number | nullsí
scorecard.recent[].p50numbersí
scorecard.recent[].p90number | nullsí
scorecard.recent[].observednumber | nullsí
scorecard.recent[].errornumber | nullsíObserved minus p50.
scorecard.recent[].in_bandboolean | nullsí
licenseobjetosí
license.codestringsí
license.code_urlstringsí
license.datastringsí
license.data_esstringsí
attributionlistasí
attribution[].idstringsí
attribution[].namestringsí
attribution[].providesstringsí
attribution[].urlstringsí
attribution[].termsstringsí
attribution[].terms_esstringsí
see_alsoobjetosíAbsolute URLs to the other documents, this document's schema and the documentation page.

/api/adequacy.json

esquema · lo escribe scripts/adequacy.ts

El déficit o superávit esperado en GWh/día por horizonte, el nivel de riesgo, los techos que supone y su validación. current.narrative_tier_field dice cuál de sus dos niveles usa la lectura del día.

Los 152 campos
Campos de adequacy.json, con su tipo y su unidad
CampoTipoUnidadSiempreDescripción (del esquema)
schema_versionintegersíThe format version. Changes only when a field is removed, renamed or retyped; added fields do not change it.
generated_atstringsíWhen the document was written, UTC.
data_datestring | nullsíThe Ecuadorian calendar day the document's readings describe.
run_idstringsí
origin_datestringsíThe day the model stands on; equal to data_date.
unitsstringno
disclaimerstringno
modelobjetosí
model.idstringsí
model.labelstringsí
model.backtest_originsintegersí
dataobjetosí
data.usable_daysintegerdíassí
data.rejected_daysintegerdíassí
data.hydro_anomalynumbersí
data.demand_growth_pct_per_yearnumbersí
assumptionsobjetosí
assumptions.thermal_gwh_daynumberGWh/díasí
assumptions.import_gwh_daynumberGWh/díasí
assumptions.stressed_import_gwh_daynumberGWh/díasí
assumptions.other_gwh_daynumberGWh/díasí
assumptions.editable_atstringsí
currentobjetosí
current.tierstring: "holgado", "vigilancia", "ajustado", "deficit"síThe model's Spanish word. Kept in schema_version 1; use the *_code field beside it.
current.tier_codestring: "comfortable", "watch", "tight", "deficit"sí
current.tier_label_esstringsí
current.worst_tierstring: "holgado", "vigilancia", "ajustado", "deficit"síThe model's Spanish word. Kept in schema_version 1; use the *_code field beside it.
current.worst_tier_codestring: "comfortable", "watch", "tight", "deficit"sí
current.worst_tier_label_esstringsí
current.worst_tier_horizon_daysintegerdíassí
current.worst_deficit_gwh_daynumberGWh/díasí
current.narrative_tier_fieldstringsíWhich of tier and worst_tier the daily narrative is written about.
horizonslistasí
horizons[].horizon_daysintegerdíassí
horizons[].target_datestringsí
horizons[].demand_gwh_daynumberGWh/díasí
horizons[].hydro_gwh_daynumberGWh/díasí
horizons[].hydro_p10number | nullsí
horizons[].hydro_p90number | nullsí
horizons[].requirement_gwh_daynumberGWh/díasí
horizons[].deficit_gwh_daynumberGWh/díasí
horizons[].deficit_p10number | nullsí
horizons[].deficit_p90number | nullsí
horizons[].stressed_deficit_gwh_daynumberGWh/díasí
horizons[].margin_pctnumber%sí
horizons[].tierstring: "holgado", "vigilancia", "ajustado", "deficit"síThe model's Spanish word. Kept in schema_version 1; use the *_code field beside it.
horizons[].tier_codestring: "comfortable", "watch", "tight", "deficit"sí
horizons[].tier_label_esstringsí
horizons[].backtestobjetosí
tiersobjetosí
tiers.definitionobjetosí
tiers.codesobjetosí
band_methodobjetonoHow the requirement's p10–p90 band is calibrated. Additive; absent before 2026-09-23.
band_method.methodstringsí
band_method.quantileslistasí
band_method.nominal_coveragenumbersí
band_method.stretch_by_horizonlistasí
band_method.stretch_by_horizon[].horizon_daysintegerdíassí
band_method.stretch_by_horizon[].stretchnumber | nullsí
import_sensitivityobjetonoThe deficit and tier under each import assumption from Colombia (ENHANCEMENTS §5.5), so a reader sees how much the tier rests on it. The central case is one of these rows. Additive; absent before 2026-09-23.
import_sensitivity.notestringsí
import_sensitivity.central_casestring: "demonstrated", "stressed", "current_regime"sí
import_sensitivity.caseslistasí
import_sensitivity.cases[].casestring: "demonstrated", "stressed", "current_regime"sí
import_sensitivity.cases[].import_gwh_daynumberGWh/díasí
import_sensitivity.cases[].worst_tierstring: "holgado", "vigilancia", "ajustado", "deficit"sí
import_sensitivity.cases[].worst_tier_horizon_daysintegerdíassí
import_sensitivity.cases[].horizonslistasí
import_sensitivity.cases[].horizons[].horizon_daysintegerdíassí
import_sensitivity.cases[].horizons[].deficit_gwh_daynumberGWh/díasí
import_sensitivity.cases[].horizons[].deficit_p90number | nullsíGWh/day: the deficit with the requirement at its p90.
import_sensitivity.cases[].horizons[].tierstring: "holgado", "vigilancia", "ajustado", "deficit"sí
plant_outageobjetonoThe deficit and tier if Coca Codo Sinclair were out of service for the whole horizon (PLAN §8a gap 5): its recent share of national hydro is removed from the hydro forecast, with imports and thermal as in the central case. Not a forecast. Additive; absent before 2026-09-24.
plant_outage.notestringsí
plant_outage.sitestringsí
plant_outage.availablebooleansíFalse when too few days of the plant's energy were in the share window; `reason` then says why and no horizons are given.
plant_outage.reasonstring | nullno
plant_outage.share_of_hydronumbernoPlant energy over SMEC national hydro across the matched days of the window.
plant_outage.plant_gwh_daynumberGWh/díano
plant_outage.share_daysintegerdíasno
plant_outage.share_fromstringno
plant_outage.share_tostringno
plant_outage.horizonslistano
plant_outage.horizons[].horizon_daysintegerdíassí
plant_outage.horizons[].lost_gwh_daynumberGWh/díasí
plant_outage.horizons[].hydro_gwh_daynumberGWh/díasí
plant_outage.horizons[].deficit_gwh_daynumberGWh/díasí
plant_outage.horizons[].deficit_p90number | nullsí
plant_outage.horizons[].tierstring: "holgado", "vigilancia", "ajustado", "deficit"sí
scorecardobjetonoHow the published adequacy runs (the net requirement, demand minus hydro, mean over the horizon window, GWh/day) did once their horizons passed (ENHANCEMENTS §5.1): every published run scored under the model and version that made it, the last run per origin and version only. Additive; absent in documents written before 2026-09-23.
scorecard.generated_atstringsíWhen the scorecard was computed, UTC.
scorecard.observed_throughstring | nullsíThe last day with an observation to score against.
scorecard.targetstringsíThe quantity scored, in words.
scorecard.unitsstring: "m", "GWh/day"sí
scorecard.runs_consideredintegersí
scorecard.runs_supersededintegersíRuns left out because a later run for the same origin and version replaced them.
scorecard.rows_scoredintegersí
scorecard.rows_pendingintegersíPublished rows whose target date is after observed_through.
scorecard.rows_excludedintegersíRows whose date passed with no usable observation.
scorecard.methodstringsí
scorecard.by_horizonlistasíOne row per model, model version and horizon with at least one scored row.
scorecard.by_horizon[].model_idstringsí
scorecard.by_horizon[].model_versionstringsí
scorecard.by_horizon[].horizon_daysintegerdíassí
scorecard.by_horizon[].nintegersí
scorecard.by_horizon[].maenumber | nullsíMean absolute error of the p50, in units.
scorecard.by_horizon[].biasnumber | nullsíMean of observed minus p50, in units.
scorecard.by_horizon[].n_bandintegersíRows that carried a p10 and a p90.
scorecard.by_horizon[].coverage_p10_p90number | nullsíShare of banded rows observed inside p10–p90, 0–1.
scorecard.by_horizon[].pinball_meannumber | nullsíMean pinball loss over p10, p50 and p90.
scorecard.by_horizon[].first_originstring | nullsí
scorecard.by_horizon[].last_originstring | nullsí
scorecard.recentlistasíThe most recent scored rows, newest target date first.
scorecard.recent[].run_idstringsí
scorecard.recent[].model_idstringsí
scorecard.recent[].model_versionstringsí
scorecard.recent[].origin_datestringsí
scorecard.recent[].horizon_daysintegerdíassí
scorecard.recent[].target_datestringsí
scorecard.recent[].p10number | nullsí
scorecard.recent[].p50numbersí
scorecard.recent[].p90number | nullsí
scorecard.recent[].observednumber | nullsí
scorecard.recent[].errornumber | nullsíObserved minus p50.
scorecard.recent[].in_bandboolean | nullsí
tier_historyobjetosí
tier_history.horizon_daysintegerdíassí
tier_history.originsintegersí
tier_history.origins_followed_by_rationingintegersí
tier_history.origins_flaggedintegersí
tier_history.share_of_flagged_that_preceded_cutsnumber | nullsí
tier_history.share_of_cuts_that_were_flaggednumber | nullsí
crisis_checkobjetosí
crisis_check.episodeslistasí
crisis_check.episodes[].startstringsí
crisis_check.episodes[].endstringsí
crisis_check.episodes[].daysintegerdíassí
crisis_check.episodes[].measured_suppression_gwh_daynumberGWh/díasí
crisis_check.episodes[].implied_deficit_gwh_daynumberGWh/díasí
licenseobjetosí
license.codestringsí
license.code_urlstringsí
license.datastringsí
license.data_esstringsí
attributionlistasí
attribution[].idstringsí
attribution[].namestringsí
attribution[].providesstringsí
attribution[].urlstringsí
attribution[].termsstringsí
attribution[].terms_esstringsí
see_alsoobjetosíAbsolute URLs to the other documents, this document's schema and the documentation page.

/api/narrative.json

esquema · lo escribe scripts/narrative.ts

La lectura del día: el texto que un modelo de lenguaje escribió solo con los números de basis, publicado únicamente si un validador lo aprobó.

Los 36 campos
Campos de narrative.json, con su tipo y su unidad
CampoTipoUnidadSiempreDescripción (del esquema)
schema_versionintegersíThe format version. Changes only when a field is removed, renamed or retyped; added fields do not change it.
generated_atstringsíWhen the document was written, UTC.
data_datestring | nullsíThe Ecuadorian calendar day the document's readings describe.
statusstringsí
modelstringsí
prompt_versionstringsí
payload_hashstringsí
origin_datestringsíThe day the payload describes; equal to data_date.
risk_tierstring | null: "holgado", "vigilancia", "ajustado", "deficit"síThe model's Spanish word. Kept in schema_version 1; use the *_code field beside it.
risk_tier_codestring | null: "comfortable", "watch", "tight", "deficit"sí
risk_tier_sourcestringsíThe adequacy field the tier was copied from.
outlook_esstringsí
driverslistasí
confidencestring: "low", "medium", "high"sí
usageobjetono
usage.input_tokensnumber | nullsí
usage.output_tokensnumber | nullsí
usage.cost_usdnumber | nullUSDsí
disclaimerstringsí
basisobjetosíThe payload the text was written from, verbatim.
basis.payload_versionintegersí
basis.origin_datestringsí
basis.reservoirslistasí
licenseobjetosí
license.codestringsí
license.code_urlstringsí
license.datastringsí
license.data_esstringsí
attributionlistasí
attribution[].idstringsí
attribution[].namestringsí
attribution[].providesstringsí
attribution[].urlstringsí
attribution[].termsstringsí
attribution[].terms_esstringsí
see_alsoobjetosíAbsolute URLs to the other documents, this document's schema and the documentation page.

Las tablas completas

Cada tabla del repositorio en un solo CSV comprimido con gzip, de su primer día al último, reconstruido en cada publicación del sitio: la cabecera una vez y cada fila exactamente como está en data/curated, donde se guardan partidas por año. La lista con filas y columnas, en /api/bulk/index.json.

Tablas completas descargables
ArchivoFilasColumnas
adequacy_runs.csv.gz30run_id, generated_at, origin_date, model_id, model_version, features_hash, usable_days, rejected_days, demand_fit_days, demand_growth_pct_per_year, hydro_fit_days, hydro_anomaly, thermal_gwh_day, import_gwh_day, stressed_import_gwh_day, other_gwh_day, backtest_origins
adequacy_values.csv.gz150run_id, origin_date, horizon_days, target_date, demand_gwh_day, hydro_gwh_day, requirement_gwh_day, requirement_p10, requirement_p90, deficit_gwh_day, deficit_p10, deficit_p90, stressed_deficit_gwh_day, margin_pct, tier
enso_monthly.csv.gz920month, oni, source, fetched_at, raw_ref
forecast_runs.csv.gz35run_id, generated_at, origin_date, site, variable, model_id, model_version, features_hash, origin_level_masl, train_days, balance_days, analog_years, backtest_origins, curve_datum_m, curve_area_coefficient, curve_area_exponent, curve_rmse_level_m, turbine_m3s_per_mw, release_stance_m3s, crest_masl
forecast_values.csv.gz175run_id, origin_date, horizon_days, target_date, p10, p50, p90, ensemble_p10, ensemble_p90, ensemble_n, model_id
geoglows_forecasts.csv.gz25.200issued, site, river_id, member, lead_days, q_m3s, store_key, etag, fetched_at
narrative_snapshots.csv.gz46run_id, generated_at, origin_date, status, model_id, prompt_version, payload_hash, forecast_run_id, adequacy_run_id, risk_tier, confidence, input_tokens, output_tokens, cost_usd, outlook_es, drivers_json, reason
national_balance_daily.csv.gz58.504date, concepto, dia_kwh, pct_dia, mes_kwh, pct_mes, anio_kwh, pct_anio, ultimos365_kwh, tipo_dia, tipo_dia_anio_anterior, source, fetched_at, raw_ref
observations_daily.csv.gz91.273date, site, variable, value, source, mrid, fetched_at, raw_ref
operating_bands.csv.gz7site, cota_min, cota_max, qmax_m3s, source, first_date, last_date
operativa_snapshots.csv.gz4.841fetched_at, block, period_label, period_date, metric, value, unit, source, raw_ref
weather_daily.csv.gz111.200date, basin, latitude, longitude, kind, precip_mm, temp_mean_c, issued_at, source, fetched_at, raw_ref
xm_exchange_daily.csv.gz4.028date, link, export_kwh, import_kwh, export_hours, import_hours, source, fetched_at, raw_ref
xm_system_daily.csv.gz33.389date, metric, value, unit, source, fetched_at, raw_ref

Esquemas JSON

Un esquema JSON (draft 2020-12) por documento, el mismo contra el que se prueba cada cambio: latest.schema.json, status.schema.json, forecast.schema.json, adequacy.schema.json, narrative.schema.json. También hay un feed Atom de la lectura del día y un archivo con lo que se publicó sobre cada día.