Domande o problemi? Scrivi nelle GitHub Discussions.

Non serve un SDK. Frankfurter funziona su standard HTTPS e restituisce JSON lineare, quindi la libreria HTTP che già utilizzi è sufficiente. Nessuna chiave API né account richiesto.

Avvio rapido

Ottieni un tasso di cambio 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 semplice: {"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 precisi

I numeri in virgola mobile (float) vanno bene per la visualizzazione a schermo, ma non per la contabilità. Esegui 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ù quotazioni contemporaneamente

/v2/rates restituisce un array semplice, con una riga per quotazione. Convertilo in un dizionario con una dictionary comprehension. Ometti quotes per ottenere 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()}

Memorizza nella cache ciò che non cambia

I tassi storici sono immutabili, quindi puoi memorizzarli nella cache a tempo indeterminato. I tassi attuali cambiano solo quando le fonti pubblicano nuovi dati, al massimo poche volte per giorno lavorativo, quindi un TTL breve è più che sufficiente. Con requests-cache, la cache si imposta in una sola 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()

Asincrono

In un'applicazione 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"]

Fissare una fonte ufficiale

Per impostazione predefinita ottieni la combinazione di tutte le fonti. Aggiungi providers per fissare una specifica istituzione, importante se una norma richiede il tasso ufficiale della propria banca centrale, come il tasso di riferimento della BCE per l'IVA UE.

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

Esplora tutte le fonti. Una fonte fissata segue il proprio calendario di pubblicazione, quindi il suo ultimo tasso può essere indietro di un giorno rispetto al tasso combinato più recente.

Vuoi analizzare una serie?

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