Python
No necesitas un SDK. Frankfurter es HTTPS sin más y devuelve JSON plano, así que te basta con la librería HTTP que ya usas. Sin clave API ni cuenta.
Inicio rápido
Obtén un tipo 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álculos monetarios seguros
Los floats valen para mostrar valores, 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 divisas a la vez
/v2/rates devuelve un array plano, con una fila por divisa. Conviértelo en un diccionario con una comprensión de diccionario. Si omites quotes, obtienes 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()}Cachea lo que no cambia
Los tipos históricos de un proveedor fijado no cambian, así que puedes cachearlos para siempre. Los tipos combinados pueden moverse cuando llegan datos nuevos, y los últimos tipos cambian cuando publican los proveedores, como mucho unas pocas veces por día hábil. Para esos basta con un TTL corto. Con requests-cache, cachear es 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, usa 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 el tipo combinado de todas las fuentes. Añade providers para fijar una institución concreta, algo que importa cuando una jurisdicción exige el tipo publicado por su banco central, como el tipo de referencia del BCE para el IVA en la UE.
res = requests.get(
"https://api.frankfurter.dev/v2/rate/usd/eur",
params={"providers": "ecb"},
)
data = res.json()Consulta todas las fuentes. Una fuente fijada sigue su propio calendario de publicación, así que su último tipo puede ir un día por detrás del último tipo combinado.
¿Vas a analizar una serie?
Para rangos de fechas, agrupación mensual y gráficos, el endpoint CSV se carga directamente en un DataFrame. Consulta pandas.