/precios_indexados
📊 Precios Indexados Medios
Devuelve los precios indexados medios por (zona, tarifa, periodo) para
un rango de fechas, usando un perfil de consumo plano
(1 kWh repartido según latest_profile). Útil para
comparar el coste base del mercado sin depender del perfil de un
cliente concreto.
📝 Descripción
Para cada combinación (zona, tarifa), el endpoint:
- Perfila 1 kWh entre todas las horas del rango
proporcionalmente al
latest_profile(consumo horario =latest_profile_h / Σ(latest_profile)). - Aplica la misma fórmula indexada que
/simular_indexadocon el fee de campaña correspondiente y devuelve el precio medio €/kWh por periodo. - Calcula además el precio regulado de potencia (€/kW·día por periodo, BOE) prorrateado por año natural si el rango cruza años.
La respuesta es un dict anidado por zona → tarifa. Las combinaciones que
fallen (sin perfiles horarios, sin fee de campaña, etc.) quedan
registradas con la clave error.
🔐 Autenticación
Cabecera Authorization: Bearer <TOKEN>. Acepta token
estático API_SECUR_TOKEN o JWT firmado con
JWT_SECRET / JWT_SECRET_1.
📥 Cuerpo de la petición
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
fecha_inicio |
string (YYYY-MM-DD) | Requerido | Inicio del rango (inclusive). |
fecha_fin |
string (YYYY-MM-DD) | Requerido | Fin del rango (inclusive). |
zonas |
array<string> | ["PENINSULA","CANARIAS","BALEARES"] |
Zonas a evaluar. Valores válidos: PENINSULA,
CANARIAS, BALEARES,
CEUTA, MELILLA. |
tarifas |
array<string> | ["2.0TD","3.0TD","6.1TD"] |
Tarifas ATR ('2.0TD'..'6.4TD'). Acepta también
códigos numéricos '018'..'023' (se mapean a TD). |
tipo_campania |
string | 'campaña' |
Valor aceptado por prices.precios_campania_index_b2b
(habitualmente 'campaña' o 'Zero'). |
coste_financiero |
number | 0.25 |
% aplicado como (1 + cf/100). |
Ejemplo — defaults (3 zonas × 3 tarifas)
{
"fecha_inicio": "2026-02-01",
"fecha_fin": "2026-02-28",
"tipo_campania": "campaña"
}
Ejemplo — subconjunto explícito
{
"fecha_inicio": "2026-02-01",
"fecha_fin": "2026-02-28",
"zonas": ["PENINSULA", "BALEARES"],
"tarifas": ["2.0TD", "6.1TD"],
"tipo_campania": "Zero",
"coste_financiero": 0.25
}
📤 Respuesta exitosa (200 OK)
{
"fecha_inicio": "2026-02-01",
"fecha_fin": "2026-02-28",
"num_dias": 28,
"tipo_campania": "campaña",
"fee_indexado_aplicado_eur_mwh": 13.55,
"fnee_eur_mwh": 0.0,
"zonas": {
"PENINSULA": {
"2.0TD": {
"tarifa_atr": "2.0TD",
"geo_zone": "PENINSULA",
"fee_indexado_base_eur_mwh": 13.55,
"fee_indexado_componentes_eur_mwh": {
"desvios": 0.75, "margen": 6.5, "gos": 1.2, "resto": 2.05
},
"fee_fnee_eur_mwh": 0.0,
"fee_indexado_aplicado_eur_mwh": 13.55,
"potencia_eur_kw_dia": {"P1": 0.063, "P2": 0.010, ...},
"por_periodo": [
{"periodo": "P1", "consumo_kwh": 0.35, "coste_eur": 0.0523,
"precio_medio_eur_kwh": 0.1494, "omie_md_avg": 72.11, "ree_segmentos_avg": 8.20},
...
],
"global": {
"consumo_kwh": 1.0,
"coste_eur": 0.1298,
"precio_medio_eur_kwh": 0.1298,
"omie_md_avg": 68.35,
"ree_segmentos_avg": 8.20
}
},
"3.0TD": { ... },
"6.1TD": { ... }
},
"CANARIAS": { "2.0TD": { ... }, "3.0TD": { ... }, "6.1TD": { ... } },
"BALEARES": { "2.0TD": { ... }, "3.0TD": { ... }, "6.1TD": { ... } }
}
}
Item de por_periodo
| Campo | Tipo | Descripción |
|---|---|---|
periodo | string | 'P1'..'P6'. |
consumo_kwh | number | Peso del periodo dentro del kWh perfilado (suma total = 1 kWh). |
coste_eur | number | Coste asociado al peso del periodo. |
precio_medio_eur_kwh | number|null | Media de precio horario ponderada por el perfil dentro del periodo. |
omie_md_avg | number|null | Media aritmética de OMIE-MD dentro del periodo. |
ree_segmentos_avg | number|null | Media aritmética de los segmentos REE (SSAA) dentro del periodo. |
Combinación con error
Cuando una combinación (zona, tarifa) no puede calcularse, la entrada del dict
incluye la clave error:
"CEUTA": {
"6.1TD": {
"tarifa_atr": "6.1TD",
"geo_zone": "CEUTA",
"error": "sin datos horarios para el rango"
}
}
❌ Errores
| Código | Causa |
|---|---|
400 |
Validación: tipo_campania inválido, zona/tarifa no
reconocida, rango de fechas invertido. |
401 |
Falta token o token inválido. |
500 |
Error inesperado (traza en logs). |
200 y reporta el problema
dentro del propio item mediante error.
💻 Ejemplos
cURL
curl -X POST "https://api.imaginaenergia.com/precios_indexados" \
-H "Authorization: Bearer <JWT>" \
-H "Content-Type: application/json" \
-d '{
"fecha_inicio": "2026-02-01",
"fecha_fin": "2026-02-28",
"zonas": ["PENINSULA"],
"tarifas": ["2.0TD", "3.0TD"],
"tipo_campania": "campaña"
}'
Python (requests)
import requests
body = {
"fecha_inicio": "2026-02-01",
"fecha_fin": "2026-02-28",
"tipo_campania": "campaña"
}
r = requests.post(
"https://api.imaginaenergia.com/precios_indexados",
headers={"Authorization": f"Bearer {jwt}"},
json=body,
timeout=60,
)
res = r.json()
for zona, tarifas in res["zonas"].items():
for tarifa, data in tarifas.items():
if "error" in data:
print(zona, tarifa, "→", data["error"])
continue
print(zona, tarifa, "medio:", data["global"]["precio_medio_eur_kwh"], "€/kWh")