Volver a la documentación
POST /calcular_precios_finales

💶 Cálculo de Precios Finales

Devuelve los precios finales de energía (EUR/kWh) y potencia (EUR/kW/año) combinando los precios base de la tarifa (vista v_precios_base_materializada) con los extras comerciales del cliente.

📝 Descripción

Para cada item de entrada (identificado por id_tarifa + cups):

🔐 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

El body puede tener tres formatos equivalentes:

Campos de cada item

CampoTipoRequeridoDescripción
id_tarifaintRequeridoID de la tarifa en v_precios_base_materializada.
cupsstringOpcionalSe devuelve tal cual en la respuesta para que puedas hacer trazabilidad por CUPS.
extrae1..extrae6numberOpcionalExtras comerciales de energía en EUR/MWh (por defecto 0).
extrap1..extrap6numberOpcionalExtras comerciales de potencia en EUR/kW/año (por defecto 0).

Ejemplo (lista)

[
  {
    "id_tarifa": 1234,
    "cups": "ES0031405678912345AB1F",
    "extrae1": 5,   "extrae2": 5, "extrae3": 5,
    "extrap1": 1.2, "extrap2": 0.5
  },
  {
    "id_tarifa": 1240,
    "cups": "ES0031400000000001CD2X"
  }
]

Ejemplo (envoltorio)

{
  "items": [
    { "id_tarifa": 1234, "cups": "ES0031405678912345AB1F", "extrae1": 5 }
  ]
}

📤 Respuesta exitosa (200 OK)

Siempre devuelve una lista en el mismo orden que la entrada. Cada item de la respuesta contiene:

CampoTipoDescripción
id_tarifaintEco del id solicitado.
cupsstringEco del cups solicitado.
e1_final..e6_finalnumber|nullPrecio final de energía por período en EUR/kWh (6 decimales).
p1_final..p6_finalnumber|nullPrecio final de potencia por período en EUR/kW/año (6 decimales).
errorstringSolo si ese item ha fallado (tarifa no encontrada, base inválida, ...).

Ejemplo

[
  {
    "id_tarifa": 1234,
    "cups": "ES0031405678912345AB1F",
    "e1_final": 0.147,
    "e2_final": 0.123,
    "e3_final": 0.097,
    "e4_final": null, "e5_final": null, "e6_final": null,
    "p1_final": 31.7,
    "p2_final": 1.7,
    "p3_final": null, "p4_final": null,
    "p5_final": null, "p6_final": null
  },
  {
    "id_tarifa": 9999,
    "cups": "ES0031400000000001CD2X",
    "error": "Tarifa 9999 no encontrada en v_precios_base_materializada"
  }
]

❌ Errores

CódigoCausa
400Body ausente o con un tipo que no sea dict, lista o {"items": [...]}.
401Falta token o token inválido.
500Error inesperado en el cálculo (la traza se registra en logs).
ℹ️ Errores parciales: si un item concreto falla (por ejemplo, id_tarifa inexistente), el endpoint sigue devolviendo 200 y reporta el problema dentro del propio item mediante el campo error. Esto facilita el procesamiento en lote.

💻 Ejemplos

cURL

curl -X POST "https://api.imaginaenergia.com/calcular_precios_finales" \
  -H "Authorization: Bearer <JWT>" \
  -H "Content-Type: application/json" \
  -d '[{"id_tarifa": 1234, "cups": "ES0031405678912345AB1F", "extrae1": 5, "extrap1": 1.2}]'

Python (requests)

import requests

body = {
    "items": [
        {"id_tarifa": 1234, "cups": "ES0031405678912345AB1F",
         "extrae1": 5, "extrae2": 5, "extrap1": 1.2}
    ]
}
r = requests.post(
    "https://api.imaginaenergia.com/calcular_precios_finales",
    headers={"Authorization": f"Bearer {jwt}"},
    json=body,
    timeout=30,
)
print(r.json())