Volver al blog

Alternativas a la API de Frankfurter en 2026: una comparativa honesta para desarrolladores

V
Vlado Grigirov
August 28, 2026
Currency API Exchange Rates Frankfurter API Comparison Free API Developer Guide

Si estás buscando alternativas a la API de Frankfurter, es muy probable que ya hayas puesto algo en producción con ella. Frankfurter es la API gratuita de tipos de cambio por defecto para toda una generación de proyectos paralelos: sin clave de API, sin registro, sin cuota, una superficie REST limpia y un código abierto que puedes leer en una tarde. Y entonces algo cambia — una duda de cumplimiento normativo, un fallo el fin de semana, un cliente que necesita tasas intradía — y empiezas a preguntarte qué más hay.

Esta guía es una mirada honesta a esa decisión. Cubre lo que Frankfurter hace realmente en 2026 (la mayoría de los artículos comparativos parten de información desactualizada), los cinco límites concretos que empujan a los equipos a dejarla, y los tres caminos realistas: auto-alojarla, migrar a una API comercial con clave, o montar un híbrido. Al final hay un ejemplo de migración.

Qué es realmente Frankfurter en 2026

Casi todos los recopilatorios de «mejores APIs de divisas gratuitas» siguen describiendo Frankfurter como «tasas del BCE, unas 30 divisas, sin datos de fin de semana». Eso fue cierto durante años. Ya no lo es.

La API v2 en frankfurter.dev sigue tasas diarias de 84 bancos centrales, cubriendo 201 divisas, con histórico que llega hasta 1948. Es genuinamente gratuita para uso comercial, no requiere autenticación, no publica ninguna cuota mensual ni diaria, y ofrece salida en CSV y NDJSON además de JSON. Hay una especificación OpenAPI, un llms.txt y un servidor MCP para flujos de trabajo con agentes. Puedes auto-alojarla con Docker.

Es un producto mejor de lo que los recopilatorios reconocen, y conviene decirlo claramente: para un gran número de proyectos, Frankfurter es la respuesta correcta y no deberías migrar. Si estás construyendo un gestor de finanzas personales, una página de referencia de divisas, una herramienta de facturación que fija tasas una vez al día o un cuaderno de análisis de datos que descarga una década de medias mensuales, Frankfurter lo hace bien y no cuesta nada.

El resto de este artículo trata de los casos en los que no.

Cinco límites que llevan a los equipos a buscar alternativas a la API de Frankfurter

1. Las tasas de referencia diarias no son tasas en vivo

Este es el límite estructural, y no es un fallo: es lo que la fuente de datos es. Las tasas de referencia de los bancos centrales se publican una vez por día hábil. El BCE, por ejemplo, publica sus tasas de referencia del euro cada día laborable alrededor de las 16:00 CET. Frankfurter expone fielmente esas cifras.

Eso significa que una tasa que consultas a las 09:00 y otra que consultas a las 15:00 son el mismo número, aunque el mercado se haya movido un 1,2 % entre medias. Para un conversor de solo visualización, nadie lo nota. Para una página de pago, un cálculo de liquidación o cualquier cosa donde el cliente compare tu número con el de Google, ese retraso se convierte en un ticket de soporte.

Si tu producto necesita tasas que se muevan durante el día, necesitas una fuente de datos de mercado y no una fuente de tasas de referencia. La API de Finexly se actualiza cada minuto durante el horario de mercado en más de 170 divisas, que es un modelo de datos distinto, no una versión mejor del mismo. Nuestro artículo sobre de dónde obtienen sus datos las APIs de tipos de cambio desarrolla la distinción.

2. No hay filas de fin de semana ni de festivos

Los bancos centrales no publican los sábados, domingos ni festivos nacionales. Así que una consulta para el 2026-08-23 no devuelve nada útil, y una serie temporal de un mes tiene unas 21 filas, no 31.

Todos los equipos chocan con esto igual: un proceso nocturno se ejecuta el domingo, obtiene un resultado vacío o desplazado, y o bien falla, o —mucho peor— escribe silenciosamente un null en el libro mayor. Si construyes sobre tasas diarias de cualquier fuente de banco central, necesitas una política explícita de relleno hacia adelante y necesitas dejarla por escrito, porque «usar la última tasa publicada» y «omitir la fila» producen estados financieros distintos.

3. Las tasas mezcladas pueden cambiar después de publicarse

Por defecto, Frankfurter mezcla las tasas de todos los proveedores que contribuyen. Sus propias preguntas frecuentes son refrescantemente directas sobre la consecuencia: los últimos decimales pueden variar a medida que llegan nuevos datos, y para cumplimiento normativo deberías filtrar por un proveedor concreto.

Es un diseño perfectamente razonable para uso general. Es un problema si almacenas una tasa, se la muestras a un usuario y más tarde la reconcilias contra una nueva consulta: encontrarás pequeñas discrepancias muy difíciles de explicar a un auditor. La solución en Frankfurter es pasar providers=ECB (o la autoridad que te regule) en lugar de aceptar la mezcla. La solución en tu propio sistema es persistir la tasa que realmente usaste en el momento de la transacción y no volver a derivarla nunca. Esa regla aplica a cualquier proveedor, y la tratamos en la guía de tipos de cambio y declaración fiscal.

4. Sin clave de API no hay cuota — ni visibilidad

«No requiere clave de API» es la mejor característica de Frankfurter y su riesgo más subestimado. Como no hay clave:

  • No tienes cuota por aplicación. Compartes un limitador de tasa público con todo internet, incluido quien lo esté martilleando ahora mismo desde un bucle mal escrito.
  • No tienes telemetría de uso. No hay ningún panel que te diga que tu volumen de llamadas se triplicó el martes pasado.
  • No tienes relación de soporte. Hay una página de estado y un gestor de incidencias en GitHub, que es más de lo que ofrecen muchos servicios gratuitos, pero no hay SLA ni nadie a quien avisar.

La propia recomendación del proyecto es explícita: para uso de alto volumen, cachea las respuestas, auto-alójalo o consulta los conjuntos de datos directamente. Es un consejo honesto, y es también el momento en que muchos equipos empiezan a evaluar alternativas a la API de Frankfurter — no porque los datos estén mal, sino porque han asumido una dependencia de producción sin ningún contrato detrás.

5. No hay endpoint de conversión

Frankfurter lo documenta deliberadamente: obtén la tasa y multiplica. Son tres líneas de código.

También son tres líneas de código que se escriben ligeramente distintas en seis sitios de tu base de código, y en uno de ellos se divide cuando se debería multiplicar. Un endpoint convert dedicado no es una necesidad técnica; es una forma de tener exactamente una implementación de las reglas de redondeo y de dirección. Si alguna vez has publicado un fallo en el que EUR→USD y USD→EUR no cuadraban por un 0,3 %, ya sabes por qué importa. Nuestra guía de redondeo y decimales en divisas cubre el resto de ese campo de minas.

Alternativas a la API de Frankfurter, comparadas

Los detalles de los planes gratuitos a continuación son los publicados por cada proveedor en el momento de escribir. Verifícalos antes de comprometerte: los planes gratuitos cambian más a menudo que la documentación.

APIPlan gratuitoFrecuencia de actualizaciónAutenticaciónDivisa baseIdeal para
FrankfurterIlimitado (con límite anti-abuso, sin SLA)Diaria, días hábilesNingunaCualquieraProyectos personales, contabilidad, investigación histórica
Frankfurter auto-alojadoGratis + coste de tu infraestructuraDiaria, días hábilesLa tuyaCualquieraEquipos que necesitan control y ya usan Docker
Finexly1.000 sol./mesCada minuto en horario de mercadoClave BearerCualquiera (base personalizada en planes superiores)Productos que necesitan tasas intradía y una vía de soporte
ExchangeRate-API~1.500 sol./mesDiariaClaveCualquieraPaneles que se refrescan una vez al día
Open Exchange Rates1.000 sol./mesCada horaClaveSolo USD en gratuitoApps de servidor que pueden vivir con base USD
Fixer.io100 sol./mesCada horaClaveSolo EUR en gratuitoIntegraciones heredadas
Dos cosas destacan. Primero, nadie supera a Frankfurter en cuota, porque Frankfurter no tiene ninguna. Si tu restricción es el volumen bruto de llamadas contra tasas diarias, la respuesta es auto-alojar Frankfurter, no comprar una cuota menor en otro sitio. Segundo, las opciones de pago no te venden los mismos datos con mejor envoltorio: venden una frecuencia de actualización distinta y una relación de soporte. Si ninguna de esas dos es tu problema, cambiar es un retroceso.

Tenemos desgloses lado a lado de varias de ellas en la comparativa de APIs de divisas y en nuestra comparativa de APIs de tipos de cambio en tiempo real.

Opción 1: auto-alojar Frankfurter

La respuesta más infrautilizada. Frankfurter publica una imagen de Docker, y ejecutarla tú mismo elimina las dos cosas que de verdad preocupan a los equipos en producción: el limitador de tasa compartido y la falta de control.

docker run -d -p 8080:8080 --name frankfurter \
  lineofflight/frankfurter

Lo que ganas: llamadas internas ilimitadas, tu propio destino en cuanto a disponibilidad y la capacidad de fijar un proveedor. Lo que asumes: un contenedor, una base de datos, monitorización y alguien que se dé cuenta cuando el scraping de origen se rompa un día festivo. Es un coste real: es básicamente el argumento de nuestro análisis de construir o comprar, aplicado a un código que ya escribió otra persona.

Auto-alojar es lo correcto cuando tu volumen es alto, tus requisitos de latencia son estrictos y las tasas de referencia diarias son realmente suficientes. No ayuda en absoluto si el problema es que necesitas tasas intradía: solo estarás ejecutando tu propia copia de los mismos datos diarios.

Opción 2: migrar a una API con clave y tasas intradía

Si la razón por la que estás aquí es la frescura de las tasas, la cobertura de pares exóticos o la necesidad de que alguien responda a un correo, una API comercial con clave es la respuesta honesta.

Aquí está la misma tarea en ambas. Primero Frankfurter:

curl "https://api.frankfurter.dev/v2/rate/USD/EUR"

Y el equivalente en Finexly:

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.finexly.com/v1/rate?from=USD&to=EUR"
{ "pair": "USD_EUR", "rate": 0.9215 }

Mapeo de endpoints

TareaFrankfurter v2Finexly v1
Listar divisasGET /v2/currenciesGET /v1/currencies
Un solo parGET /v2/rate/EUR/USDGET /v1/rate?from=EUR&to=USD
Varios paresGET /v2/rates?base=USD&quotes=EUR,GBPGET /v1/convert?q=USD_EUR,USD_GBP
Convertir un importe(no existe — multiplica tú)GET /v1/convert-amount?from=USD&to=EUR&amount=100
HistóricoGET /v2/rates?date=1999-01-04Planes de pago — ver la guía de tasas históricas
El principal cambio de forma es la llamada multi-par. Frankfurter usa una base y una lista de cotizadas; Finexly toma una lista de pares BASE_QUOTE explícitos, lo que te permite pedir USD_EUR y GBP_JPY en la misma petición sin hacer una división cruzada.

Un envoltorio de migración

No repartas un cliente nuevo por toda tu base de código. Pon ambos detrás de una única interfaz, de forma que volver atrás sea un cambio de configuración:

import os
import requests

FINEXLY_KEY = os.environ["FINEXLY_API_KEY"]

def get_rate(base: str, quote: str, provider: str = "finexly") -> float:
    """Return the mid-market rate for base->quote."""
    if provider == "frankfurter":
        r = requests.get(
            f"https://api.frankfurter.dev/v2/rate/{base}/{quote}",
            timeout=5,
        )
        r.raise_for_status()
        return float(r.json()["rate"])

    r = requests.get(
        "https://api.finexly.com/v1/rate",
        params={"from": base, "to": quote},
        headers={"Authorization": f"Bearer {FINEXLY_KEY}"},
        timeout=5,
    )
    r.raise_for_status()
    return float(r.json()["rate"])

print(get_rate("USD", "EUR"))

Dos detalles que merece la pena copiar. La clave de API viene del entorno, nunca del código fuente: la documentación de Finexly señala que las claves pasadas como parámetro de consulta pueden filtrarse por los registros de acceso del servidor y por las cabeceras HTTP Referrer, así que la cabecera Authorization es la vía de producción. Y cada llamada tiene un timeout, porque el valor por defecto en la mayoría de clientes HTTP es «esperar para siempre».

Vigila las cabeceras de respuesta X-RateLimit-Limit, X-RateLimit-Used y X-RateLimit-Units para ver el consumo de cuota en tiempo real. Esa telemetría es justo lo que no puedes obtener de una API sin autenticación, y a menudo es la verdadera razón por la que los equipos migran.

Opción 3: el híbrido — cachea una, recurre a la otra

El patrón al que converge la mayoría de los sistemas en producción. Usa tu proveedor principal, cachea de forma agresiva y mantén la API gratuita sin autenticación como último recurso:

const CACHE = new Map();
const TTL_MS = 60_000;

async function getRate(base, quote) {
  const key = `${base}_${quote}`;
  const hit = CACHE.get(key);
  if (hit && Date.now() - hit.at < TTL_MS) return hit.rate;

  let rate;
  try {
    const res = await fetch(
      `https://api.finexly.com/v1/rate?from=${base}&to=${quote}`,
      { headers: { Authorization: `Bearer ${process.env.FINEXLY_API_KEY}` } }
    );
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    rate = (await res.json()).rate;
  } catch (err) {
    // Degrade to daily reference rates rather than failing the request
    const res = await fetch(`https://api.frankfurter.dev/v2/rate/${base}/${quote}`);
    rate = (await res.json()).rate;
  }

  CACHE.set(key, { rate, at: Date.now() });
  return rate;
}

Una caché de 60 segundos sobre un plan gratuito de 1.000 peticiones cubre con holgura una aplicación pequeña, porque tu volumen de llamadas pasa a ser función del tiempo, no del tráfico. Marca las respuestas de reserva en tus registros para que una degradación silenciosa a la tasa de ayer no pase inadvertida durante una semana. Hay más sobre elección de TTL y comportamiento de reintentos en nuestra guía de caché y manejo de errores.

Una lista de decisión

Recorre esta lista y párate en el primer «sí»:

  1. ¿Las tasas deben cambiar durante la jornada de negociación? → Necesitas una API de datos de mercado, no de tasas de referencia.
  2. ¿Es un flujo regulado o auditado? → Fija un proveedor concreto, guarda la tasa que usaste y no la vuelvas a derivar.
  3. ¿Tu volumen de llamadas es alto pero las tasas diarias te sirven? → Auto-aloja Frankfurter.
  4. ¿Necesitas que alguien responda cuando algo se rompa? → Necesitas un plan con clave y nivel de soporte.
  5. ¿Nada de lo anterior? → Quédate en Frankfurter. Cachéala, gestiona el hueco del fin de semana y dedica tu tiempo a otra cosa.

La mayoría de los equipos que salen a buscar alternativas a la API de Frankfurter descubren en el paso 5 que su problema real era una caché ausente y un domingo sin gestionar.

Preguntas frecuentes

¿La API de Frankfurter es realmente gratuita para uso comercial? Sí. El proyecto declara que es gratuita para uso comercial, sin cuota mensual ni diaria: las peticiones solo se limitan para prevenir abusos. La contrapartida es que no hay SLA ni contrato de soporte, así que el riesgo es tuyo.

¿Frankfurter solo ofrece tasas del BCE? Ya no. La API v2 mezcla datos de 84 bancos centrales en 201 divisas, y puedes acotar a una única fuente con el parámetro providers. La descripción extendida de «solo BCE, 30 divisas» se refiere a versiones antiguas.

¿Por qué Frankfurter no devuelve datos los fines de semana? Porque los bancos centrales no publican tasas de referencia en días no hábiles. Cualquier API construida sobre datos de bancos centrales tiene el mismo hueco. O rellenas hacia adelante con la última tasa publicada, o usas una fuente de datos de mercado que cotiza de forma continua.

¿Cuál es la mejor alternativa gratuita a Frankfurter? Depende de qué necesites que te compre lo «gratuito». Para tasas diarias ilimitadas, nada supera a Frankfurter: auto-alójalo. Para un plan gratuito con actualizaciones intradía y una clave de API real, el plan gratuito de Finexly te da 1.000 peticiones al mes en más de 170 divisas. Consulta nuestra guía de APIs de divisas gratuitas para ver el panorama completo.

¿Puedo usar Frankfurter y una API de pago a la vez? Sí, y es una arquitectura sensata. Dirige el tráfico normal a tu proveedor principal y recurre a Frankfurter en caso de error, como en el ejemplo híbrido anterior. Solo asegúrate de registrar las respuestas de reserva, ya que llevan garantías de frescura distintas.

Empieza ahora

Si las tasas de referencia diarias son suficientes para lo que estás construyendo, quédate en Frankfurter: es un buen proyecto y no te costará nada. Si necesitas tasas que se muevan durante el día, cobertura más allá de los conjuntos de referencia de los bancos centrales o cabeceras de uso que puedas monitorizar de verdad, consigue tu clave gratuita de la API de Finexly — sin tarjeta de crédito. Empieza con 1.000 peticiones al mes en más de 170 divisas y amplía a medida que crezcas, o compara antes los planes en nuestra página de precios.

Vlado Grigirov

Senior Currency Markets Analyst & Financial Strategist

Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...

View full profile →