Frankfurter suit les taux de change quotidiens de 98 banques centrales et sources officielles pour 206 devises, remontant jusqu'à 1948.

L'API publique est accessible sur api.frankfurter.dev et ne requiert aucune clé API. Le projet est open source, tu peux donc aussi l'auto-héberger pour un contrôle total.

Tu travailles avec un agent IA ? Donne-lui le fichier llms.txt ou connecte le serveur MCP.

Taux

Obtiens les derniers taux de change.

curl https://api.frankfurter.dev/v2/rates

Change la devise de base avec base.

curl https://api.frankfurter.dev/v2/rates?base=usd

Filtre les devises cibles avec quotes.

curl https://api.frankfurter.dev/v2/rates?quotes=usd,gbp

Taux historiques

Consulte les taux pour une date précise.

curl https://api.frankfurter.dev/v2/rates?date=1999-01-04

Séries temporelles

Obtiens les taux sur une période avec from et to.

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01&quotes=usd

Astuce : Limiter les devises permet de garder des réponses légères. Pour les longues périodes, demande du NDJSON pour diffuser les résultats ligne par ligne en streaming.

Regroupement

Sous-échantillonne une série temporelle avec group. Valeurs supportées : week et month.

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01&group=month

Filtrer par source

Limite la requête à certaines sources avec providers.

curl https://api.frankfurter.dev/v2/rates?providers=ecb

Par défaut, l'API combine les taux de toutes les sources. Pour obtenir les taux d'une seule source, utilise providers ou interroge directement les routes de la source.

Attribution des sources

Ajoute expand=providers pour voir quelles sources ont alimenté chaque taux combiné.

curl https://api.frankfurter.dev/v2/rates?expand=providers

Chaque ligne reçoit un tableau providers contenant les identifiants des sources contributrices. Les devises à parité fixe n'ont pas ce champ : leurs taux découlent de la parité, pas de données de sources.

Sortie CSV

Les taux sont aussi disponibles en CSV. Ajoute .csv au chemin ou définis l'en-tête Accept sur text/csv.

curl https://api.frankfurter.dev/v2/rates.csv

Sortie NDJSON

Pour les réponses volumineuses, demande du NDJSON (JSON délimité par des retours à la ligne) en définissant l'en-tête Accept sur application/x-ndjson. Chaque ligne est un objet JSON autonome, idéal pour streamer de longues séries temporelles sans mettre en mémoire tampon toute la réponse.

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01

Taux unique

Obtiens le taux d'une seule paire de devises. Tu peux ajouter date ou providers.

curl https://api.frankfurter.dev/v2/rate/eur/usd

Devises

Liste les devises disponibles avec leur couverture par les sources.

curl https://api.frankfurter.dev/v2/currencies

Inclus les devises historiques avec scope.

curl https://api.frankfurter.dev/v2/currencies?scope=all

Devise unique

Obtiens les détails et la couverture d'une devise spécifique.

curl https://api.frankfurter.dev/v2/currency/eur

Sources

Liste les sources de données derrière l'API.

curl https://api.frankfurter.dev/v2/providers

Obtiens les détails d'une source en particulier.

curl https://api.frankfurter.dev/v2/providers/ecb

Taux par source

Interroge directement les taux d'une source spécifique. Les mêmes paramètres que /v2/rates et /v2/rate sont acceptés.

curl https://api.frankfurter.dev/v2/providers/ecb/rates

Obtiens une seule paire de devises pour cette source.

curl https://api.frankfurter.dev/v2/providers/ecb/rate/eur/usd

Combine avec date, des plages de dates (from et to) ou un regroupement. Les formats .csv et ndjson fonctionnent aussi ici.

curl https://api.frankfurter.dev/v2/providers/ecb/rates?date=2024-05-15

Conversion

Il n'y a pas d'endpoint de conversion dédié. Récupère le taux et convertis en quelques lignes de code.

function convert(base, quote, amount) {
  const api = "https://api.frankfurter.dev";
  return fetch(`${api}/v2/rate/${base}/${quote}`)
    .then((r) => r.json())
    .then((d) => (amount * d.rate).toFixed(2));
}

convert("eur", "usd", 10).then((result) =>
  alert(`10 EUR = ${result} USD`)
);

Erreurs

L'API renvoie des codes de statut HTTP standards avec un corps JSON.

{
  "message": "Could not find currency ABC"
}
400
Paramètre invalide ou requête mal formée.
404
Devise, taux ou ressource introuvable.
422
Requête comprise mais impossible à traiter.

Auto-hébergement

Tu peux auto-héberger avec Docker. Consulte le guide de déploiement pour la configuration en production et les clés API.

FAQ

À qui s'adresse Frankfurter (et à qui ne s'adresse-t-elle pas) ?
L'API convient parfaitement à la facturation SaaS, au e-commerce, aux déclarations fiscales, aux ERP et systèmes comptables, ainsi qu'à la recherche académique sur des séries historiques remontant jusqu'à 1948. Elle n'est pas conçue pour le trading en temps réel, ni pour les activités traitant des devises exotiques soumises à de fortes fluctuations intrajournalières.
L'utilisation commerciale de l'API est-elle autorisée ?
Oui, tout à fait. Consulte les conditions de chaque source pour les détails concernant les données sous-jacentes.
Existe-t-il des quotas ou des limites d'appels ?
Il n'y a aucun quota. Une limitation de débit prévient les abus, mais il n'y a aucun plafond mensuel ou quotidien. Pour les volumes élevés, prévois la mise en cache des réponses, l'auto-hébergement ou l'interrogation directe des jeux de données.
L'API supporte-t-elle GraphQL ?
Non. L'API REST est assez simple pour que GraphQL n'ajoute que de la complexité sans réel bénéfice. Cela casserait aussi le cache en périphérie (edge caching), garant de la rapidité de l'API. Utilise les paramètres d'URL comme base, quotes et from/to pour obtenir exactement les données voulues.
L'API v1 va-t-elle disparaître ?
Non. L'API v1 est deprecated au profit de la v2, mais reste disponible indéfiniment. Pour en savoir plus, consulte la documentation v1. Pour les données de la Banque centrale européenne, utilise /v2/providers/ecb/rates.
Quelle est la politique de confidentialité de l'API ?
L'API ne collecte ni n'enregistre aucune donnée personnelle, adresse IP ou URL de requête. L'instance publique utilise Cloudflare pour le cache et la protection DDoS, qui ne fournit que des statistiques globales de trafic.
Faut-il mentionner l'API dans les fiches de confidentialité App Store ou Google Play ?
Non. Les requêtes étant anonymes et sans journalisation conservée, elles relèvent de la catégorie Données non collectées selon les règles d'Apple et de Google Play.
Où signaler un bug ou poser une question ?
Ouvre un ticket pour signaler un bug, suggérer une fonctionnalité ou proposer une nouvelle source de données. Utilise les Discussions pour poser des questions ou partager une bibliothèque ou un outil développé avec Frankfurter.
Quelle est la précision des taux ?
Pour la conformité légale, filtre par source spécifique pour obtenir ses taux de référence officiels. Pour un usage général, les taux combinés par défaut conviennent bien, même si les dernières décimales peuvent varier au fil des nouvelles données reçues.
Les taux sont-ils moyens, acheteurs ou vendeurs ?
L'API renvoie des taux moyens du marché (mid-market). Lorsqu'une source publie des cours acheteur et vendeur au lieu d'un taux de référence, Frankfurter enregistre les deux et calcule le point médian.
Tous les taux sont-ils mis à jour quotidiennement ?
Presque tous. Seules 2 sources publient selon un calendrier non quotidien : le HMRC britannique (mensuel) et l'UST américain (trimestriel). Leurs taux restant valables plusieurs semaines ou mois, ils ne sont jamais intégrés au flux combiné et n'apparaissent qu'en interrogeant ces sources directement.
Pourquoi certaines anciennes et nouvelles devises se chevauchent-elles dans le temps ?
Certaines sources antidatent les devises de remplacement sur la période de l'ancienne devise (par exemple, TRL prend fin en 2010 alors que TRY démarre dès 1996). Nous enregistrons les données des sources telles quelles, et filtrons les chevauchements uniquement lors de la combinaison.
Pourquoi Frankfurter ?
Parce que la Banque centrale européenne, notre source de données initiale, a son siège à Francfort.
European Central Bank and Main riverfront, Frankfurt