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):
-
Energía (EUR/kWh):
eX_final = round(base_eX + extraeX / 1000, 6). El extraextraeXse interpreta en EUR/MWh (por eso se divide entre 1000). -
Potencia (EUR/kW/año):
pX_final = round(base_pX + extrapX, 6). El extraextrapXse interpreta en EUR/kW/año. -
Si la tarifa marca
precio_potencia_boe = "S", la basebase_pXse obtiene del precio BOE regulado del año actual para latarifa_atrde la oferta (no del campopXde la vista). -
Si la base correspondiente está vacía o nula, el campo final se devuelve como
null.
🔐 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:
- Objeto único: un item suelto.
- Lista de objetos: cálculo en lote.
- Envoltorio:
{"items": [...]}.
Campos de cada item
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
id_tarifa | int | Requerido | ID de la tarifa en v_precios_base_materializada. |
cups | string | Opcional | Se devuelve tal cual en la respuesta para que puedas hacer trazabilidad por CUPS. |
extrae1..extrae6 | number | Opcional | Extras comerciales de energía en EUR/MWh (por defecto 0). |
extrap1..extrap6 | number | Opcional | Extras 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:
| Campo | Tipo | Descripción |
|---|---|---|
id_tarifa | int | Eco del id solicitado. |
cups | string | Eco del cups solicitado. |
e1_final..e6_final | number|null | Precio final de energía por período en EUR/kWh (6 decimales). |
p1_final..p6_final | number|null | Precio final de potencia por período en EUR/kW/año (6 decimales). |
error | string | Solo 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ódigo | Causa |
|---|---|
400 | Body ausente o con un tipo que no sea dict, lista o {"items": [...]}. |
401 | Falta token o token inválido. |
500 | Error 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())