API de la TRM de Colombia: cómo consultar el dólar oficial en Python y JavaScript

Cómo consultar la Tasa Representativa del Mercado desde los datos abiertos de Colombia, sin cuenta ni clave, con funciones en Python y JavaScript, el manejo de fines de semana y qué hacer cuando la API falla.

En este artículo
En 30 segundos

La TRM oficial se publica como datos abiertos en datos.gov.co y se consulta con una sola petición HTTP sin autenticación; el campo valor llega como texto y un mismo valor puede regir varios días, así que filtra por fecha y guarda el resultado en caché.

1. Qué es la TRM y dónde se publica#

La Tasa Representativa del Mercado (TRM) es el valor oficial del dólar en pesos colombianos. El conjunto de datos «Tasa de Cambio Representativa del Mercado - TRM» lo publica la Superintendencia Financiera de Colombia en el portal de datos abiertos datos.gov.co, que lo expone como una API de consulta (formato JSON) con cuatro campos.

CampoQué contieneEjemplo
valorPesos por dólar, como texto3181.74
unidadMoneda de la cotizaciónCOP
vigenciadesdePrimer día en que rige2026-10-14T00:00:00.000
vigenciahastaÚltimo día en que rige2026-10-14T00:00:00.000

La API no pide cuenta ni clave para consultas simples. El campo valor llega como texto con punto decimal, y vigenciadesde y vigenciahasta marcan el primer y el último día en que ese valor rige. En fines de semana y festivos un mismo valor cubre varios días: el 17 de octubre de 2026 la API devolvió 3.174,67 con vigencia del 17 al 19 de octubre.

Documentación: Datos Abiertos: TRM (Superintendencia Financiera de Colombia) ↗

2. Consultar la TRM de una fecha en Python#

La función filtra los registros cuya vigencia incluye el día pedido. Usa solo la biblioteca estándar y Decimal para no acumular errores de punto flotante en dinero. El ejemplo consulta el 14 de octubre de 2026 y convierte un plan de 25 dólares al mes.

python
import json
from decimal import Decimal
from urllib.parse import urlencode
from urllib.request import urlopen

URL = "https://www.datos.gov.co/resource/32sa-8pi3.json"

def trm_del_dia(dia: str) -> Decimal:
    """TRM vigente en una fecha (AAAA-MM-DD), en pesos por dólar."""
    filtro = f"vigenciadesde <= '{dia}T00:00:00.000' AND vigenciahasta >= '{dia}T00:00:00.000'"
    with urlopen(f"{URL}?" + urlencode({"$where": filtro}), timeout=15) as r:
        filas = json.load(r)
    if not filas:
        raise LookupError(f"sin TRM para {dia}")
    return Decimal(filas[0]["valor"])

trm = trm_del_dia("2026-10-14")
print(trm)                                # 3181.74
print(f"{Decimal(25) * trm:,.2f} COP")    # un plan de 25 USD al mes
Resultado real de la API el 18 de octubre de 2026: 3181.74 y 79,543.50 COP. Un día más reciente devolverá otro valor.

Documentación: Socrata: consultas con $where ↗ · Python: urllib.request ↗

3. La misma consulta en JavaScript#

Con fetch, disponible en Node.js y en el navegador. El script se ejecuta como módulo para poder usar await al nivel superior. Formatea el resultado con Intl en es-CO.

javascript
const URL_TRM = "https://www.datos.gov.co/resource/32sa-8pi3.json";

async function trmDelDia(dia) {
  const filtro = `vigenciadesde <= '${dia}T00:00:00.000' AND vigenciahasta >= '${dia}T00:00:00.000'`;
  const res = await fetch(`${URL_TRM}?` + new URLSearchParams({ $where: filtro }));
  if (!res.ok) throw new Error(`datos.gov.co respondió ${res.status}`);
  const filas = await res.json();
  if (filas.length === 0) throw new Error(`sin TRM para ${dia}`);
  return Number(filas[0].valor);
}

const trm = await trmDelDia("2026-10-14");
console.log(trm, (25 * trm).toLocaleString("es-CO", { style: "currency", currency: "COP" }));
Imprime 3181.74 y el monto en pesos con el formato de Colombia.

Si llamas la API desde el navegador, ten en cuenta que cada visitante hace su propia petición; para una página pública es mejor consultarla desde tu servidor y guardar el valor.

Documentación: MDN: Fetch API ↗

4. Buenas prácticas#

  • Guarda el valor del día en caché y no llames a la API en cada petición de tus usuarios.
  • Conserva la fecha del valor junto al valor, y muéstrala: un precio en pesos sin fecha de TRM no es verificable.
  • Ten un valor de respaldo con su fecha para cuando la API no responda, y no inventes una tasa.
  • Usa Decimal (Python) o enteros de centavos para el dinero, y deja el redondeo para el final.
  • Trata una respuesta vacía como un caso normal: puede no haber registro para una fecha futura.

Para precios internacionales, la TRM es una referencia oficial colombiana, no el tipo de cambio que te cobrará tu banco o tu tarjeta, que suma su propio margen y comisiones.

5. Cómo lo usa Codifly#

Las fichas del catálogo muestran el equivalente en pesos de cada precio con la TRM de esta misma fuente, con su fecha, y recurren a un valor de respaldo fechado cuando la consulta falla. Puedes ver el resultado en los comparadores de bases de datos y de nube.

Para profundizarCuánto cuesta una API de IA en pesos, reales y soles (septiembre de 2026)

6. Mantén tus cifras al día#

Los valores de esta guía son los que la API devolvió el 18 de octubre de 2026. El conjunto de datos y sus campos pueden cambiar, así que revisa la ficha oficial antes de depender de ellos en producción.

  • Revisa la ficha del conjunto de datos si la API cambia de forma.
  • Prueba tu código con una fecha de fin de semana y con una fecha sin registro.
  • Registra un aviso cuando uses el valor de respaldo.

Fuentes y alcance

Documentación consultada el 18 de octubre de 2026. Los ejemplos y criterios de decisión son propuestas editoriales; adáptalos al contrato de tu aplicación y valídalos en tu entorno de pruebas autorizado.

Compara estas opciones

Compara bases de datos

Revisa tarifas, límites, condiciones y fuentes de cada opción.

Abrir comparador
Asesoría

¿Tu caso es distinto?

Cuéntanos tu contexto y las opciones que estás evaluando. Te respondemos con criterios y fuentes, sin suscripciones automáticas.

Solicita asesoría