Volver a la documentación
POST /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:

  1. Perfila 1 kWh entre todas las horas del rango proporcionalmente al latest_profile (consumo horario = latest_profile_h / Σ(latest_profile)).
  2. Aplica la misma fórmula indexada que /simular_indexado con el fee de campaña correspondiente y devuelve el precio medio €/kWh por periodo.
  3. 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

CampoTipoDefaultDescripció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

CampoTipoDescripción
periodostring'P1'..'P6'.
consumo_kwhnumberPeso del periodo dentro del kWh perfilado (suma total = 1 kWh).
coste_eurnumberCoste asociado al peso del periodo.
precio_medio_eur_kwhnumber|nullMedia de precio horario ponderada por el perfil dentro del periodo.
omie_md_avgnumber|nullMedia aritmética de OMIE-MD dentro del periodo.
ree_segmentos_avgnumber|nullMedia 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ódigoCausa
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).
ℹ️ Errores parciales: si una combinación (zona, tarifa) falla, el endpoint sigue devolviendo 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")