Indicadores Colombia

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í:

curl -H "X-Api-Key: iec_live_tu_clave" \ https://indicadores.alexardilam.com/api/v1/indicadores/uvt/actual

Endpoints

RutaClaveQué devuelve
/trm?fecha=noTRM del día o de una fecha
/estadonoSalud del servicio
/indicadoresno*Catálogo
/indicadores/{codigo}/actualsíValor vigente
/indicadores/{codigo}/historicosíSerie histórica
/indicadores/actualessíTodos los vigentes de una vez
/cuentasí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.

Antes de empezar. Crea una clave en tus claves y llámala, por ejemplo, «Excel contabilidad». Una clave por libro: la clave queda guardada dentro del archivo, así que enviar el .xlsx a alguien es enviarle también tu clave. Si pasa, la revocas sin afectar a nada más.

1. Todos los valores vigentes en una tabla

  1. Datos → Obtener datos → De otras fuentes → Consulta en blanco.
  2. En el editor que se abre: Inicio → Editor avanzado.
  3. Borra lo que haya, pega esto y cambia PEGA_AQUI_TU_CLAVE por tu clave.
  4. Listo. 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 Cerrar y cargar.
  5. 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
    Resultado

Cada 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
    Orden

3. La TRM de la fecha que escribas en una celda

No necesita clave: la TRM es pública.

  1. Escribe una fecha en una celda, por ejemplo B2.
  2. 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.
  3. Crea la consulta en blanco igual que antes y pega esto.
  4. Cambia la fecha de la celda y pulsa Datos → Actualizar todo.
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
    Tabla

Si 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 Datos → Obtener datos → Opciones de consulta → Libro actual → Privacidad, marcando que omita los niveles de privacidad.

Que se actualicen solos

Datos → Consultas y conexiones, clic derecho sobre la consulta, Propiedades 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 vesQué pasa
No se puede conectar, o pide usuario y contraseña Se eligió algo distinto de Anónimo. En Datos → Obtener datos → Configuración de origen de datos, 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:

QuieresFó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.

Los porcentajes llegan como número, no como porcentaje. La usura sale 29,24, no 29,24 %. Para usarla en un cálculo hay que dividir por 100: =A2 * BUSCARX("usura.consumo_ordinario"; Indicadores[clave]; Indicadores[valor]) / 100. Multiplicar directamente daría una cifra cien veces mayor.

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.

  1. Fórmulas → Administrador de nombres → Nuevo.
  2. 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

HTTPCódigoQué significa
400parametros_invalidosUn parámetro está mal
401clave_ausenteFalta X-Api-Key
401clave_invalidaEsa clave no existe
402suscripcion_inactiva La clave sirve; el acceso caducó. Tu código está bien
403clave_revocadaLa revocaste
404indicador_no_encontradoNo existe o no hay dato esa fecha
422rango_invalidoRango invertido o mayor de 10 años
429limite_excedidoCupo agotado. Mira Retry-After

Límites

SituaciónPor minutoPor mes
Prueba301.000
Suscripción activa6020.000
Sin clave (por IP)2060/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:

curl "https://indicadores.alexardilam.com/api/v1/indicadores/jornada_maxima/actual?fecha=2026-07-14" # 44 curl "https://indicadores.alexardilam.com/api/v1/indicadores/jornada_maxima/actual?fecha=2026-07-15" # 42