Guide/API de tipos de cambio en Stack Overflow
Guide

API de tipos de cambio en Stack Overflow: solución de problemas para desarrolladores

Los errores de la API de divisas que los desarrolladores publican en Stack Overflow, resueltos: 401 de autenticación, 429 por límite de peticiones, CORS desde el navegador, tipos estancados el fin de semana, cómo convertir un importe y cómo obtener datos históricos o de series temporales.

MMexchangerate.dev·Jun 30, 2026·6 min de lectura

Cuando una integración falla, los desarrolladores pegan el error en Stack Overflow. Para una API de tipos de cambio las preguntas son casi siempre las mismas: una clave rechazada, un muro de límite de peticiones, un error de CORS o un tipo que parece estancado durante el fin de semana. Aquí están las soluciones directas, usando exchangerate.dev como ejemplo. Cada fragmento es una llamada real contra https://api.exchangerate.dev.

Key points
Un 401 casi siempre significa que falta el prefijo Bearer o que la clave tiene un salto de línea extra de un copia-pega.
Lee X-RateLimit-Remaining y reduce el ritmo antes de llegar a cero; el plan gratuito permite 12 peticiones por minuto.
Nunca llames a la API desde JavaScript del front-end con tu clave — proxyló a través de tu backend.
source y market_session en cada respuesta te dicen exactamente por qué un tipo no se mueve.

La URL base es https://api.exchangerate.dev. La primera llamada funciona de forma anónima (limitada por IP), así que puedes reproducir cualquiera de estos ejemplos antes de registrarte para obtener una clave gratuita.

401 Unauthorized — la clave es rechazada

La clave va en la cabecera Authorization como token bearer, y la palabra Bearer con un espacio final debe estar presente. Las claves llevan el prefijo exr_live_.

curl · authenticatedcopy
curl https://api.exchangerate.dev/v1/latest/USD \
  -H "Authorization: Bearer exr_live_YOUR_KEY"

Las causas habituales de un 401: falta el prefijo Bearer , la clave tomó un salto de línea o una comilla extra en el copia-pega, o la variable de entorno que la contiene no está cargada. Las plataformas que no pueden establecer Authorization pueden enviar la clave en la cabecera X-API-Key.

429 Too Many Requests — gestión de límites de peticiones

Cada respuesta incluye X-RateLimit-Remaining. Léela y reduce el ritmo antes de que llegue a cero, en lugar de hacer peticiones a ciegas. El plan gratuito permite 12 peticiones por minuto, el Básico 120 y el Pro 500. Puedes consultar tu cuota restante y el reinicio mensual en cualquier momento con GET /v1/account. Un tipo de referencia no cambia cada segundo, por lo que una caché breve en el cliente suele mantenerte bien dentro del límite.

Error de CORS — llamar a la API desde el navegador

No llames a la API directamente desde JavaScript del front-end con tu clave: expone exr_live_... a cualquiera que abra las herramientas de desarrollo, y el navegador lo bloqueará por CORS. Proxea la llamada a través de tu propio backend, mantén la clave en el servidor y haz que el navegador llame a tu endpoint.

javascript · your backend routecopy
// the key never reaches the browser
const r = await fetch("https://api.exchangerate.dev/v1/latest/USD", {
  headers: { Authorization: `Bearer ${process.env.EXCHANGERATE_API_KEY}` },
});
const data = await r.json();

El tipo parece estancado o no cambia los fines de semana

Es un comportamiento esperado, y la respuesta te lo explica. Dieciséis divisas se actualizan en vivo (~60s en días hábiles); el resto son tipos de referencia diarios del BCE y FRED. Durante el fin de semana el mercado interbancario está cerrado, por lo que el feed en vivo se pausa y la fijación de referencia mantiene el valor del viernes. Dos campos lo indican explícitamente:

Valor del campoQué significaCuándo se mueve
source: liveConsenso spot agregadoIntradía (~60s), semana de negociación
source: ecb_dailyFijación de referencia oficialUna vez por día hábil
market_session: weekendMercado interbancario cerradoFeed en vivo pausado; referencia mantiene el viernes

¿Cómo convierto un importe en lugar de solo leer un tipo?

Usa /v1/convert/{from}/{to}/{amount}. Devuelve el tipo y el importe convertido juntos, así no tienes que multiplicar a mano:

curl · convert 100 USD to EURcopy
curl https://api.exchangerate.dev/v1/convert/USD/EUR/100 \
  -H "Authorization: Bearer exr_live_YOUR_KEY"

¿Cómo obtengo datos históricos o de series temporales?

Para un día pasado concreto, pon la fecha en la ruta: GET /v1/{YYYY-MM-DD}/{base}, con historial desde el 1999-01-04. Para una serie completa en un rango en una sola llamada, usa GET /v1/range con start_date y end_date; emplea paginación por cursor, así que sigue el cursor en lugar de solicitar rangos enormes de golpe.

¿Migrando desde Frankfurter y encontrando errores?

Los parámetros de petición son compatibles con Frankfurter, por lo que la mayoría de las migraciones son un cambio de URL base sin reescritura de código. Donde las respuestas difieren, esta API añade campos (source, market_session, notice) en lugar de eliminarlos. La guía de migración desde Frankfurter tiene el mapeo exacto.

La llamada más corta que funciona

Sin clave, sin dependencias:

curl · no keycopy
curl https://api.exchangerate.dev/v1/latest/USD

Obtienes los tipos más source y market_session para saber qué tan frescos son. Una clave gratuita eleva el límite a 10.000 llamadas al mes y tarda un minuto.

Indicativo, no para liquidación
Los tipos se publican como referencia, análisis y visualización. No son una cotización ejecutable y no deben usarse para liquidar una operación. Mostrarlos en un producto que comercializas requiere el plan Pro; los planes Gratuito y Básico son para uso interno.
MM
exchangerate.dev
Guías de integración para desarrolladores.

Keep reading

GuideAPI de tipos de cambio en Reddit: las preguntas de desarrolladoresRead ComparisonAPIs de tipos de cambio gratuitas comparadasRead GuideMigrar desde Frankfurter sin reescrituraRead