Des questions ou des problèmes ? Écris dans les GitHub Discussions.

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.