Python
No necesitas un SDK. Frankfurter funciona con HTTPS estándar y devuelve JSON plano, por lo que la librería HTTP que ya utilizas es suficiente. Sin clave API ni cuenta de usuario.
Inicio rápido
Obtén un tipo de cambio y convierte:
import requests
res = requests.get("https://api.frankfurter.dev/v2/rate/usd/eur")
data = res.json()
total = 100 * data["rate"] La respuesta es un único objeto plano: {"date": "2026-07-17", "base": "USD", "quote": "EUR", "rate": 0.8739}. Un código de divisa no válido devuelve un 422 con un mensaje JSON.
Cálculo monetario preciso
Los tipos de coma flotante (floats) son adecuados para mostrar información en pantalla, pero no para contabilidad. Parsea los tipos como Decimal pasando parse_float a json.loads:
from decimal import Decimal
import requests
res = requests.get("https://api.frankfurter.dev/v2/rate/usd/eur")
data = res.json(parse_float=Decimal)
total = Decimal("100") * data["rate"]Varias cotizaciones a la vez
/v2/rates devuelve un array plano, con una fila por cotización. Conviértelo en un diccionario con una comprensión. Omite quotes para obtener todas las divisas.
res = requests.get(
"https://api.frankfurter.dev/v2/rates",
params={"base": "usd", "quotes": "eur,gbp,jpy"},
)
rates = {row["quote"]: row["rate"] for row in res.json()}Almacena en caché lo que no cambia
Los tipos históricos son inmutables, por lo que puedes guardarlos en caché de forma permanente. Los tipos actuales solo cambian conforme publican las fuentes, como mucho unas pocas veces por día laborable, así que un TTL corto es más que suficiente. Con requests-cache, la caché se configura en una sola línea:
import requests_cache
session = requests_cache.CachedSession("frankfurter", expire_after=3600)
res = session.get("https://api.frankfurter.dev/v2/rate/usd/eur")
data = res.json()Async
En una aplicación web asíncrona, utiliza httpx:
import httpx
API = "https://api.frankfurter.dev"
async def rate(base, quote):
async with httpx.AsyncClient(base_url=API) as client:
res = await client.get(f"/v2/rate/{base}/{quote}")
res.raise_for_status()
return res.json()["rate"]Fijar una fuente oficial
Por defecto obtienes la combinación de todas las fuentes. Añade providers para fijar una entidad concreta, algo importante si una normativa exige el tipo publicado por su propio banco central, como el tipo de referencia del BCE para el IVA de la UE.
res = requests.get(
"https://api.frankfurter.dev/v2/rate/usd/eur",
params={"providers": "ecb"},
)
data = res.json()Explora todas las fuentes. Una fuente fijada sigue su propio calendario de publicación, por lo que su último tipo puede ir un día por detrás del tipo combinado más reciente.
¿Analizando una serie?
Para rangos de fechas, agrupación mensual y gráficos, el endpoint CSV se carga directamente en un DataFrame. Consulta pandas.