API de indicadores
Todas las respuestas son JSON. Ninguna ruta bajo /api/ devuelve HTML ni redirecciones, ni siquiera ante errores.
Empezar · Endpoints · Desde Excel · Errores · Límites
Empezar
Crea una clave en tus claves y úsala así:
Endpoints
| Ruta | Clave | Qué devuelve |
|---|---|---|
| /trm?fecha= | no | TRM del día o de una fecha |
| /estado | no | Salud del servicio |
| /indicadores | no* | Catálogo |
| /indicadores/{codigo}/actual | sí | Valor vigente |
| /indicadores/{codigo}/historico | sí | Serie histórica |
| /indicadores/actuales | sí | Todos los vigentes de una vez |
| /cuenta | sí | Tu suscripción y consumo |
* Sin clave devuelve sólo los indicadores públicos.
Desde Excel
Con Power Query, que viene en Excel 2016 o posterior para Windows y en Microsoft 365. Los valores llegan como números y fechas de verdad —no como texto— y se actualizan con un clic, sin volver a copiar nada.
1. Todos los valores vigentes en una tabla
- .
- En el editor que se abre: .
- Borra lo que haya, pega esto y cambia PEGA_AQUI_TU_CLAVE por tu clave.
- . En el panel de la derecha, cambia el nombre de la consulta a Indicadores —así se llamará la tabla y así la usarán tus fórmulas— y pulsa .
- La primera vez Excel pregunta cómo conectarse: elige Anónimo y pulsa Conectar. La clave ya va dentro de la consulta; cualquier otra opción la mandaría por otro camino y la API respondería que falta.
let
// Tu clave: créala en /claves_api.
Clave = "iec_live_PEGA_AQUI_TU_CLAVE",
Respuesta = Json.Document(Web.Contents(
"https://indicadores.alexardilam.com/api/v1/",
[
RelativePath = "indicadores/actuales",
Headers = [#"X-Api-Key" = Clave],
// Para que Excel muestre el mensaje de la API y no un error genérico.
ManualStatusHandling = {400, 401, 402, 403, 404, 422, 429}
]
)),
Datos = if Respuesta[estado] = "error" then error Respuesta[mensaje] else Respuesta[datos],
Tabla = Table.FromRecords(Record.FieldValues(Datos[indicadores])),
Tipos = Table.TransformColumnTypes(
Tabla,
{{"valor", type number}, {"fecha_desde", type date}, {"fecha_hasta", type date}},
"en-US"
),
// Una columna para buscar desde cualquier celda con BUSCARX:
// "uvt", "smmlv", "usura.consumo_ordinario"...
ConClave = Table.AddColumn(
Tipos, "clave",
each if [variante] = null then [codigo] else [codigo] & "." & [variante],
type text
),
Resultado = Table.ReorderColumns(
ConClave,
{"clave"} & List.RemoveItems(Table.ColumnNames(ConClave), {"clave"})
)
in
ResultadoCada fila trae el valor, desde y hasta cuándo rige, y la norma que lo respalda. Los indicadores con modalidades —usura, IBR— salen en una fila por modalidad.
2. La serie histórica de un indicador
Mismos pasos. Cambia arriba el indicador y las fechas. La consulta pide todas las páginas: la API devuelve hasta 1.000 registros por llamada, y cinco años de TRM son más. Pedir una sola página cortaría la serie sin avisar. El rango máximo por consulta es de 10 años.
let
Clave = "iec_live_PEGA_AQUI_TU_CLAVE",
Indicador = "trm",
Desde = "2022-01-01",
Hasta = "2026-12-31",
// Sólo para indicadores con modalidades. Ejemplo: usura -> "consumo_ordinario".
Variante = "",
Pagina = (numero as number) as record =>
let
Parametros = [desde = Desde, hasta = Hasta, por_pagina = "1000", pagina = Text.From(numero)],
ConVariante = if Variante = "" then Parametros
else Record.AddField(Parametros, "variante", Variante),
R = Json.Document(Web.Contents(
"https://indicadores.alexardilam.com/api/v1/",
[
RelativePath = "indicadores/" & Indicador & "/historico",
Query = ConVariante,
Headers = [#"X-Api-Key" = Clave],
ManualStatusHandling = {400, 401, 402, 403, 404, 422, 429}
]
))
in
if R[estado] = "error" then error R[mensaje] else R[datos],
// La primera llamada dice cuántas páginas hay; se piden todas.
Primera = Pagina(1),
TotalPaginas = Primera[paginacion][total_paginas],
Siguientes = List.Transform({2..TotalPaginas}, each Pagina(_)[serie]),
Filas = List.Combine({Primera[serie]} & Siguientes),
Tabla = if List.IsEmpty(Filas)
then error ("No hay datos de " & Indicador & " entre " & Desde & " y " & Hasta)
else Table.FromRecords(Filas),
Tipos = Table.TransformColumnTypes(
Tabla,
{{"fecha_desde", type date}, {"fecha_hasta", type date}, {"valor", type number}},
"en-US"
),
Orden = Table.Sort(Tipos, {{"fecha_desde", Order.Ascending}})
in
Orden3. La TRM de la fecha que escribas en una celda
No necesita clave: la TRM es pública.
- Escribe una fecha en una celda, por ejemplo B2.
- Selecciónala y, en el cuadro de nombres —el recuadro a la izquierda de la barra de fórmulas, donde dice B2— escribe FechaTRM y pulsa Enter.
- Crea la consulta en blanco igual que antes y pega esto.
- Cambia la fecha de la celda y pulsa .
let
// La celda con nombre FechaTRM. Sin el try, olvidar ponerle el nombre da
// «La clave no coincide con ninguna fila», que no ayuda a nadie.
Celda = try Excel.CurrentWorkbook(){[Name = "FechaTRM"]}[Content]{0}[Column1]
otherwise error "No encuentro la celda FechaTRM. Ponle ese nombre en el cuadro de nombres.",
Fecha = if Celda = null
then error "Escribe una fecha en la celda FechaTRM"
else Date.ToText(Date.From(Celda), "yyyy-MM-dd"),
Respuesta = Json.Document(Web.Contents(
"https://indicadores.alexardilam.com/api/v1/",
[
RelativePath = "trm",
Query = [fecha = Fecha],
ManualStatusHandling = {400, 404, 429}
]
)),
Datos = if Respuesta[estado] = "error" then error Respuesta[mensaje] else Respuesta[datos],
ComoFecha = (texto) => if texto = null then null else Date.FromText(texto),
// La TRM de un sábado es la que rige todo el fin de semana: por eso se
// muestran también las fechas en que rige, además de la consultada.
Tabla = #table(
type table [Fecha = date, TRM = number, #"Rige desde" = date, #"Rige hasta" = date],
{{Date.From(Celda), Datos[valor], ComoFecha(Datos[fecha_desde]), ComoFecha(Datos[fecha_hasta])}}
)
in
TablaSi Excel muestra un mensaje sobre niveles de privacidad o Formula.Firewall, es porque la consulta mezcla una celda del libro con un origen web. Se resuelve en , marcando que omita los niveles de privacidad.
Que se actualicen solos
, clic derecho sobre la consulta, y marca Actualizar al abrir el archivo. Mejor eso que «cada N minutos»: la TRM cambia una vez al día y cada actualización consume parte de tu cupo.
Si algo falla
| Lo que ves | Qué pasa |
|---|---|
| No se puede conectar, o pide usuario y contraseña | Se eligió algo distinto de Anónimo. En , borra los permisos de este sitio y vuelve a actualizar. |
| «La clave de API no es válida» | La clave está mal copiada, o sobra un espacio. |
| «Tu suscripción no está activa» | La consulta está bien; el acceso caducó. Renuévalo en tu cuenta. |
| «La variante … no existe» | Mira las modalidades del indicador en /indicadores. |
| «El rango no puede superar …» | Divide el periodo en dos consultas. |
| Una cifra como 311647 donde debía decir 3.116,47 | No pasa con estas consultas, que leen JSON y conservan el número. Pasa si se cambia la consulta para importar como texto o CSV: Excel en español toma el punto decimal por separador de miles. |
En una fórmula o en una celda
Con la consulta de valores vigentes ya cargada, cualquier celda puede leer cualquier indicador con una fórmula normal. La tabla trae una columna clave pensada justo para eso:
| Quieres | Fórmula |
|---|---|
| UVT | =BUSCARX("uvt"; Indicadores[clave]; Indicadores[valor]) |
| Salario mínimo | =BUSCARX("smmlv"; Indicadores[clave]; Indicadores[valor]) |
| Auxilio de transporte | =BUSCARX("auxilio_transporte"; Indicadores[clave]; Indicadores[valor]) |
| Usura de consumo | =BUSCARX("usura.consumo_ordinario"; Indicadores[clave]; Indicadores[valor]) |
| La norma de la UVT | =BUSCARX("uvt"; Indicadores[clave]; Indicadores[soporte]) |
En Excel 2016 o 2019, que no tienen BUSCARX: =INDICE(Indicadores[valor]; COINCIDIR("uvt"; Indicadores[clave]; 0)). Las claves de cada indicador están en la columna clave de la tabla.
La TRM de cualquier fecha
Carga la consulta del histórico con Indicador = "trm" y llámala TRM. Con la fecha en B2:
=BUSCARX(B2; TRM[fecha_desde]; TRM[valor]; "sin dato"; -1)El -1 final es lo que la hace correcta en fines de semana y festivos: si no hay una TRM que empiece justo ese día, toma la anterior, que es la que rige. Un domingo devuelve la del sábado. En Excel 2016 o 2019: =BUSCARV(B2; TRM[[fecha_desde]:[valor]]; 3; VERDADERO).
Por qué así y no una llamada por celda: la tabla se descarga una vez al actualizar, da igual que la usen diez fórmulas o dos mil. Una fórmula que llamara a la API en cada celda gastaría una consulta por celda cada vez que se abre el libro, y un libro de cierre con doscientas fechas agotaría el cupo en una tarde.
Una función =TRM(fecha) sin consulta
Para quien sólo necesita la TRM de unas pocas fechas y no quiere Power Query. Funciona en Microsoft 365 para Windows —no en Mac ni en Excel para la web— y sólo con la TRM, porque SERVICIOWEB() no puede enviar la clave.
- .
- Nombre: TRM. En «Hace referencia a», pega esto:
=LAMBDA(fecha; VALOR.NUMERO(TEXTOANTES(TEXTODESPUES(SERVICIOWEB("https://indicadores.alexardilam.com/api/v1/trm?fecha=" & AÑO(fecha) & "-" & TEXTO(MES(fecha); "00") & "-" & TEXTO(DIA(fecha); "00")); """valor"":"); ","); "."; ","))Y desde entonces, en cualquier celda: =TRM(B2) o =TRM(HOY()).
La fecha se arma con AÑO, MES y DIA y no con TEXTO(fecha; "aaaa-mm-dd") porque los códigos de formato de TEXTO cambian con el idioma de Excel, y la API necesita siempre el mismo. Sin clave, el límite es de 60 consultas por hora por conexión a internet: en una oficina todos comparten ese cupo. Para más de un puñado de fechas, la tabla de arriba.
Errores
| HTTP | Código | Qué significa |
|---|---|---|
| 400 | parametros_invalidos | Un parámetro está mal |
| 401 | clave_ausente | Falta X-Api-Key |
| 401 | clave_invalida | Esa clave no existe |
| 402 | suscripcion_inactiva | La clave sirve; el acceso caducó. Tu código está bien |
| 403 | clave_revocada | La revocaste |
| 404 | indicador_no_encontrado | No existe o no hay dato esa fecha |
| 422 | rango_invalido | Rango invertido o mayor de 10 años |
| 429 | limite_excedido | Cupo agotado. Mira Retry-After |
Límites
| Situación | Por minuto | Por mes |
|---|---|---|
| Prueba | 30 | 1.000 |
| Suscripción activa | 60 | 20.000 |
| Sin clave (por IP) | 20 | 60/hora |
Vigencia por fecha
Hay cifras que cambian a mitad de año. La jornada máxima pasó de 44 a 42 horas el 15 de julio de 2026; el recargo dominical subió del 80 % al 90 % el 1 de julio. Pregunta por la fecha del hecho y obtienes el valor que regía ese día: