Dúvidas ou problemas? Participe no GitHub Discussions.

Você não precisa de um SDK. O Frankfurter funciona com HTTPS padrão e retorna JSON simples, portanto a biblioteca HTTP que você já usa é suficiente. Sem chave de API nem conta de usuário.

Início rápido

Obtenha uma taxa e converta:

import requests

res = requests.get("https://api.frankfurter.dev/v2/rate/usd/eur")
data = res.json()
total = 100 * data["rate"]

A resposta é um único objeto simples: {"date": "2026-07-17", "base": "USD", "quote": "EUR", "rate": 0.8739}. Um código de moeda inválido retorna 422 com uma mensagem em JSON.

Cálculo financeiro preciso

Valores em ponto flutuante (floats) servem para exibição, mas são inadequados para contabilidade. Faça o parse das taxas como Decimal passando parse_float para 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"]

Várias cotações de uma vez

/v2/rates retorna um array simples, com uma linha por cotação. Transforme-o em um dicionário com uma compreensão. Omite quotes para obter todas as moedas.

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

Armazene em cache o que não muda

Taxas históricas são imutáveis, portanto podem ser armazenadas em cache para sempre. Taxas mais recentes mudam apenas conforme as fontes publicam, no máximo algumas vezes por dia útil, então um TTL curto é suficiente. Com requests-cache, o cache é configurado em uma linha:

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

Em uma aplicação web assíncrona, use 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"]

Fixar uma fonte oficial

Por padrão, você obtém a taxa combinada de todas as fontes. Adicione providers para fixar uma autoridade específica, o que importa quando uma regulamentação exige a taxa publicada pelo seu banco central, como a taxa de referência do BCE para IVA da UE.

res = requests.get(
    "https://api.frankfurter.dev/v2/rate/usd/eur",
    params={"providers": "ecb"},
)
data = res.json()

Explore todas as fontes. Uma fonte fixada segue seu próprio calendário de publicação, portanto sua cotação mais recente pode ficar um dia atrás da média combinada mais recente.

Analisando uma série?

Para intervalos de datas, agrupamento mensal e gráficos, o endpoint CSV é carregado diretamente em um DataFrame. Veja pandas.