Domande o problemi? Scrivi nelle GitHub Discussions.

Non serve un SDK. Frankfurter è semplice HTTPS che restituisce JSON piatto, quindi basta la libreria HTTP che usi già. Nessuna chiave API, nessun account.

Avvio rapido

Ottieni un tasso e converti:

import requests

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

La risposta è un singolo oggetto piatto: {"date": "2026-07-17", "base": "USD", "quote": "EUR", "rate": 0.8739}. Un codice valuta non valido restituisce un 422 con un messaggio JSON.

Calcoli monetari sicuri

I float vanno bene per la visualizzazione, non per la contabilità. Fai il parsing dei tassi come Decimal passando 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"]

Più valute in una richiesta

/v2/rates restituisce un array piatto, con una riga per valuta. Trasformalo in un dizionario di lookup con una comprehension. Ometti quotes per avere tutte le valute.

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

Metti in cache ciò che non cambia

I tassi storici di un fornitore scelto non cambiano, quindi puoi tenerli in cache per sempre. I tassi combinati possono variare quando arrivano nuovi dati, e gli ultimi tassi cambiano quando i fornitori pubblicano, al massimo qualche volta per giorno lavorativo. Per questi basta un TTL breve. Con requests-cache, il caching è una riga:

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

In un'app web asincrona, 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"]

Scegliere una fonte ufficiale

Di default ottieni il tasso combinato di tutte le fonti. Aggiungi providers per usare una sola istituzione, cosa importante quando una giurisdizione richiede il tasso pubblicato dalla propria banca centrale, come il tasso di riferimento BCE per l'IVA UE.

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

Vedi tutte le fonti. Una singola fonte segue il proprio calendario di pubblicazione, quindi il suo ultimo tasso può arrivare con un giorno di ritardo rispetto a quello combinato.

Vuoi analizzare una serie?

Per intervalli di date, raggruppamento mensile e grafici, l'endpoint CSV si carica direttamente in un DataFrame. Vedi pandas.