Python
Tu n'as pas besoin de SDK. Frankfurter fonctionne en pur HTTPS et renvoie du JSON plat, donc la bibliothèque HTTP que tu utilises déjà suffit amplement. Pas de clé API, pas de compte utilisateur.
Démarrage rapide
Récupère un taux et convertis :
import requests
res = requests.get("https://api.frankfurter.dev/v2/rate/usd/eur")
data = res.json()
total = 100 * data["rate"] La réponse est un objet plat : {"date": "2026-07-17", "base": "USD", "quote": "EUR", "rate": 0.8739}. Un code de devise invalide renvoie une erreur 422 avec un message JSON.
Calculs financiers précis sans arrondis
Les nombres à virgule flottante (floats) conviennent pour l'affichage mais sont inadaptés à la comptabilité. Parse les taux en Decimal en passant parse_float à 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"]Plusieurs taux à la fois
/v2/rates renvoie un tableau plat avec une ligne par devise cible. Transforme-le en dictionnaire de correspondance par compréhension. Omets quotes pour obtenir toutes les devises.
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()}Mettre en cache ce qui ne change pas
Les taux historiques sont immuables : garde-les indéfiniment en cache. Les taux les plus récents ne changent que lors de la publication des sources, au plus quelques fois par jour ouvré ; un TTL court est largement suffisant. Avec requests-cache, la mise en cache ne prend qu'une seule ligne :
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()Asynchrone
Dans une application web asynchrone, utilise 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"]Fixer une source officielle
Par défaut, tu obtiens le taux combiné de toutes les sources. Ajoute providers pour cibler une institution spécifique, ce qui est nécessaire lorsqu'une juridiction exige le taux officiel de sa banque centrale, comme le taux de référence de la BCE pour la TVA européenne.
res = requests.get(
"https://api.frankfurter.dev/v2/rate/usd/eur",
params={"providers": "ecb"},
)
data = res.json()Consulte toutes les sources. Une source spécifique suit son propre calendrier de publication, son dernier taux peut donc avoir un jour de décalage par rapport au taux combiné.
Analyser une série temporelle ?
Pour les plages de dates, les regroupements mensuels et les graphiques, l'endpoint CSV se charge directement dans un DataFrame. Voir pandas.