Guide/API de tipos de cambio en Stack Overflow

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.

ERexchangerate.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.
Controla X-RateLimit-Remaining antes del límite. Ante un 429, lee X-RateLimit-Scope y Retry-After.
Las llamadas anónimas desde el navegador están permitidas. Nunca pongas una clave de cuenta en JavaScript del front-end.
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

Las respuestas correctas que cuentan para la cuota incluyen X-RateLimit-Remaining. Un 429 devuelve Retry-After; espera ese tiempo antes de reintentar. X-RateLimit-Scope indica si agotaste el límite por minuto, el tope horario anónimo o la cuota mensual. El plan gratuito permite 12 peticiones por minuto, el Básico 120 y el Pro 500. Puedes consultar la cuota de tu cuenta y su reinicio mensual con GET /v1/account.

Error de CORS — llamar a la API desde el navegador

CORS permite lecturas anónimas y las cabeceras Authorization y X-API-Key. Eso no hace privada una petición con clave: cualquiera que abra las herramientas de desarrollo puede copiar exr_live_.... Usa llamadas anónimas para una demo pública; para la cuota de una cuenta, pasa por tu backend y conserva la clave en el servidor.

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();

¿Cómo almaceno tipos de cambio de forma segura?

Guarda la observación correcta completa: el tipo, source, market_session y data_updated_at. Para pares activos, empieza con 60 segundos en el servidor. Eso reduce llamadas duplicadas, pero no vuelve más reciente una referencia diaria.

  • Agrupa las divisas en una sola solicitud symbols en lugar de hacer una llamada HTTP por par.
  • Almacena respuestas 2xx correctas. No guardes un 401, 429 o error del proveedor como si fuera un tipo.
  • Ante un 429, usa Retry-After y X-RateLimit-Scope; no inventes un retraso fijo.
  • Mantén las claves de cuenta en la configuración del servidor, nunca en una caché o paquete público del navegador.

El tipo parece estancado o no cambia los fines de semana

Es un comportamiento esperado, y la respuesta te lo explica. Las divisas con negociación activa se actualizan en vivo (~60s en días hábiles); la cobertura actual la informa la API, no una cifra fija de marketing, y el resto usa 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 otra API de FX y encontrando errores?

Los parámetros de petición siguen las convenciones comunes de las APIs de FX (divisa base más un filtro symbols), 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 — revisa el código que interpreta la respuesta por si asume un conjunto fijo de claves.

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 Basic o Pro; el plan Gratuito es para uso interno.
ER
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
Más ComparacionesFixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
AprenderReading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
Tasas en VivoEUR/USDGBP/USDUSD/JPY