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.
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.
Bearer o que la clave tiene un salto de línea extra de un copia-pega.X-RateLimit-Remaining antes del límite. Ante un 429, lee X-RateLimit-Scope y Retry-After.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_.
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.
¿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
symbolsen 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-AfteryX-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:
¿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:
¿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:
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.