Retour au blog

D'où viennent les données des API de taux de change ? (Et pourquoi elles divergent)

V
Vlado Grigirov
August 15, 2026
Currency API Exchange Rates FX Data API Integration Finexly Developer Guide

Demandez à cinq services différents le taux EUR/USD à l'instant même et vous obtiendrez cinq chiffres légèrement différents. Pas radicalement différents — mais différents à la quatrième décimale, parfois à la troisième. Si votre équipe financière a déjà ouvert un ticket parce que le checkout affichait 1,0847 alors que le relevé bancaire indique 1,0821, vous savez déjà que la question n'a rien d'académique.

Alors, d'où viennent les données des API de taux de change ? La réponse honnête est qu'aucune API ne « connaît » le taux de change, parce qu'il n'existe pas un taux de change unique à connaître. Le marché des changes est un marché de gré à gré sans bourse centrale ni cloche de clôture : simplement des milliers d'institutions qui se cotent des prix les unes aux autres à travers le monde. Chaque API que vous pouvez appeler est un pipeline qui échantillonne ce marché, le nettoie et vous renvoie un seul chiffre. Ce guide parcourt ce pipeline couche par couche, explique précisément pourquoi deux fournisseurs divergent, et vous montre comment auditer un flux avant d'y adosser votre logique de facturation.

La réponse courte : trois couches entre le marché et votre JSON

Toute API de taux de change — gratuite ou payante, la nôtre comprise — repose sur les mêmes trois couches :

  1. Acquisition. Les prix bruts sont récupérés depuis des sources amont : flux FX institutionnels, publications de banques centrales, cotations de courtiers ou de détail.
  2. Normalisation. Ces prix bruts sont validés, les valeurs aberrantes écartées, plusieurs sources mélangées, et un taux de référence unique par paire est dérivé.
  3. Livraison. Le taux dérivé est capturé selon une cadence donnée, mis en cache, puis servi en HTTP avec un horodatage.

Une différence dans n'importe laquelle de ces trois couches produit un chiffre différent dans votre corps de réponse. La plupart des développeurs supposent que la divergence vient de la couche 1. En pratique, les couches 2 et 3 en causent tout autant.

Couche 1 — D'où viennent réellement les prix bruts

Flux interbancaires et institutionnels

Ce qui se rapproche le plus d'un « vrai » taux de change, c'est le marché interbancaire : les prix auxquels les grandes banques et les fournisseurs de liquidité traitent entre eux. Ces prix arrivent sous forme de flux continus de cotations bid et ask depuis des plateformes de négociation, des prime brokers et des fournisseurs de données de marché.

Ce type de flux est la source la plus fidèle disponible. C'est aussi la plus coûteuse, ce qui explique pourquoi les API gratuites l'utilisent rarement comme source principale. Quand un fournisseur annonce des taux « en temps réel » ou « infra-minute », c'est presque toujours parce que des flux institutionnels se trouvent en haut de son pipeline.

Notez qu'un flux interbancaire vous donne deux prix, pas un : un bid et un ask. Le taux unique que vous voyez dans une réponse d'API est généralement le point médian entre les deux. Si cette distinction vous est nouvelle, notre guide sur le spread bid-ask dans le change le détaille.

Taux de référence des banques centrales

La deuxième grande source, ce sont les publications officielles des banques centrales. L'exemple le plus connu est la Banque centrale européenne, qui publie ses taux de change de référence de l'euro chaque jour ouvré TARGET vers 16h00 CET, sur la base d'une procédure de concertation entre banques centrales européennes. Des dizaines d'autres banques centrales publient des taux quotidiens équivalents pour leur propre devise.

Les taux de banque centrale ont deux avantages considérables : ils sont gratuits et ils font autorité. De nombreuses administrations fiscales et normes comptables les acceptent explicitement pour le reporting. C'est pourquoi une grande partie de l'écosystème d'API gratuites se construit dessus. Frankfurter, un projet open source très utilisé dans ce domaine, suit les taux quotidiens de 84 banques centrales couvrant 201 devises, avec un historique remontant à 1948 — le tout constitué de données publiques redistribuées.

Ils ont aussi deux limites sérieuses :

  • Ce sont des instantanés quotidiens, pas des prix en direct. Un taux de référence de 16h00 CET ne vous dit rien de ce qui s'est passé à 9h00 ou à 22h00.
  • Ils s'arrêtent les week-ends et jours fériés. Si votre API ne renvoie pas de données pour un samedi, ou répète le chiffre du vendredi, une source dérivée de la BCE en est l'explication habituelle.

Cotations de détail et de courtiers

La troisième source, c'est le prix côté client final : ce qu'une banque, un réseau de cartes, un processeur de paiement ou un service de transfert donnera réellement à un client. Ces taux incluent déjà une marge — un profit intégré au prix par-dessus le taux de marché.

C'est pour cela qu'un taux vu sur un comparateur grand public ne correspond pas à celui de votre relevé bancaire. Ce n'est une erreur ni d'un côté ni de l'autre ; ils mesurent des choses différentes. Les sites grand public affichent généralement le taux mid-market, tandis que votre banque vous cote le taux mid-market plus son spread. Pour la plupart des usages logiciels, vous voulez le chiffre mid-market et vous voulez appliquer votre propre marge explicitement, là où vous pouvez la voir et l'auditer.

Couche 2 — Comment les fournisseurs transforment des flux en un taux unique

Une fois les prix bruts arrivés, le fournisseur doit décider quel chiffre publier. Quatre décisions se prennent ici, et chacune est un point de divergence entre fournisseurs.

Le mélange (blending). La plupart des API commerciales ne dépendent pas d'une source amont unique. Open Exchange Rates, par exemple, décrit ses données comme collectées auprès de plusieurs fournisseurs puis mélangées algorithmiquement. Le mélange lisse un tick aberrant isolé, mais les pondérations sont propriétaires — et c'est précisément pour cela que deux flux mélangés ne coïncident jamais exactement.

Le rejet des aberrations. Une mauvaise cotation d'une plateforme peut être décalée d'un ordre de grandeur. Les fournisseurs appliquent des filtres qui écartent les prix hors d'une bande de tolérance autour du consensus. Un filtrage agressif donne des taux stables mais une réaction plus lente aux vrais mouvements. Un filtrage souple donne une réaction rapide mais du bruit occasionnel.

La dérivation du mid. Si le flux amont est bid/ask, le fournisseur publie un mid. Le point médian simple (bid + ask) / 2 est la norme, mais les approches pondérées par le volume donnent un résultat légèrement différent.

La triangulation des croisés. Aucun fournisseur ne source directement les plus de 30 000 paires de devises possibles. La plupart des paires sont calculées via une devise pivot — généralement USD ou EUR :

GBP/JPY = (USD/JPY) / (USD/GBP)

Cela signifie que le taux obtenu pour une paire exotique hérite de l'arrondi et du timing de deux autres paires. Les fournisseurs qui pivotent sur USD et ceux qui pivotent sur EUR aboutissent à des chiffres différents pour le même croisé. Nous détaillons la mécanique dans les taux de change croisés expliqués.

Couche 3 — Comment le taux parvient à votre code

La dernière couche est celle que les développeurs contrôlent le plus et à laquelle ils pensent le moins.

La cadence de mise à jour est le principal facteur de différenciation entre fournisseurs et entre paliers tarifaires. Les offres gratuites rafraîchissent souvent une ou deux fois par jour. Les paliers payants rafraîchissent chaque heure, toutes les dix minutes, ou toutes les 60 secondes. Deux API alimentées par des données identiques divergeront simplement parce que l'une a capturé à 14h00 et l'autre à 14h47.

La mise en cache aggrave le phénomène. La plupart des API sont derrière un CDN, et la plupart des clients bien construits mettent en cache localement par-dessus. Ajoutez un cache edge de 15 minutes à un rafraîchissement de 10 minutes et votre application travaille potentiellement avec un taux vieux de 25 minutes. C'est acceptable pour afficher des prix et inacceptable pour dénouer une opération — la vraie question est toujours à partir de quel âge est-ce trop vieux pour cette opération précise. Notre guide sur le cache et la gestion d'erreurs des API de devises explique comment dimensionner ces fenêtres.

Les horodatages sont votre défense. Toute API sérieuse renvoie l'instant où le taux a été capturé. Lisez-le. Ne supposez pas que le moment où vous avez reçu la réponse est le moment où le taux était vrai :

const MAX_AGE_SECONDS = 900; // 15 minutes

async function getRate(base, symbol) {
  const res = await fetch(
    `https://api.finexly.com/v1/latest?base=${base}&symbols=${symbol}`,
    { headers: { Authorization: `Bearer ${process.env.FINEXLY_API_KEY}` } }
  );

  const data = await res.json();
  const ageSeconds = Math.floor(Date.now() / 1000) - data.timestamp;

  if (ageSeconds > MAX_AGE_SECONDS) {
    throw new Error(`Rate is ${ageSeconds}s old — refusing to price on stale data`);
  }

  return { rate: data.rates[symbol], ageSeconds };
}

Voici la requête sous-jacente et une forme représentative de la réponse :

curl "https://api.finexly.com/v1/latest?base=USD&symbols=EUR,GBP,JPY" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "success": true,
  "base": "USD",
  "timestamp": 1755244800,
  "rates": {
    "EUR": 0.9241,
    "GBP": 0.7863,
    "JPY": 147.2150
  }
}

Tous les détails de paramètres et d'endpoints figurent dans la documentation de l'API Finexly.

Pourquoi deux API renvoient des chiffres différents pour la même paire

En combinant les trois couches, voici les six causes de divergence, à peu près par ordre de dégâts causés :

  1. Des instants de capture différents. La cause de loin la plus fréquente. Aucun des deux flux n'est en défaut ; ils ont simplement regardé à des moments différents.
  2. Des mélanges de sources différents. Un taux dérivé de banque centrale et un taux dérivé de l'interbancaire mesurent par définition deux choses distinctes.
  3. Mid-market contre taux marge incluse. Un fournisseur vous donne le point médian du marché, un autre un prix client avec le spread déjà dedans.
  4. Des devises pivots différentes pour les croisés. Une triangulation via USD et une via EUR produisent des résultats différents pour la même paire non-USD.
  5. Précision et arrondi. Six décimales tronquées à quatre, ou des taux publiés en paires inverses puis ré-inversés, introduisent tous deux une dérive.
  6. Des couches de cache oubliées. Votre CDN, le cache HTTP de votre framework et votre propre couche Redis ajoutent chacun de l'ancienneté.

Une règle empirique utile : pour les paires majeures, un écart de quelques points de base (0,01 % = 1 pb) entre deux sources mid-market réputées est normal et attendu. Un écart de 50 pb ou plus signifie que l'une des deux est périmée, chargée d'une marge, ou cassée — et il faut découvrir laquelle avant de livrer.

Comment auditer une API de taux de change avant de lui faire confiance

Ne croyez pas sur parole les promesses de précision d'un fournisseur. Faites tourner ce contrôle pendant une semaine face à la source que votre équipe financière considère comme faisant autorité :

import os
import requests
from datetime import datetime, timezone

FINEXLY_URL = "https://api.finexly.com/v1/latest"
HEADERS = {"Authorization": f"Bearer {os.environ['FINEXLY_API_KEY']}"}


def get_rate(base: str, symbol: str) -> dict:
    r = requests.get(
        FINEXLY_URL,
        headers=HEADERS,
        params={"base": base, "symbols": symbol},
        timeout=5,
    )
    r.raise_for_status()
    data = r.json()
    return {
        "rate": data["rates"][symbol],
        "captured_at": datetime.fromtimestamp(data["timestamp"], tz=timezone.utc),
    }


def basis_points(a: float, b: float) -> float:
    """Difference between two rates, in basis points."""
    return abs(a - b) / ((a + b) / 2) * 10_000


primary = get_rate("EUR", "USD")
reference = 1.0839  # whatever your accounting source published

diff = basis_points(primary["rate"], reference)
print(f"Finexly: {primary['rate']}  captured {primary['captured_at']:%H:%M UTC}")
print(f"Reference: {reference}")
print(f"Delta: {diff:.1f} bp  ->  {'OK' if diff < 25 else 'INVESTIGATE'}")

Trois choses à regarder dans les résultats :

  • L'écart est-il stable ou dérive-t-il ? Un décalage constant suggère une marge systématique. Un décalage aléatoire suggère un problème de timing.
  • L'écart s'envole-t-il à certaines heures ? Cela pointe vers l'instant de capture, généralement autour d'une fenêtre de publication de banque centrale.
  • Que se passe-t-il le week-end ? Si votre source se fige le vendredi après-midi et reprend le lundi, elle est dérivée d'une banque centrale — planifiez votre rapprochement du lundi en conséquence.

Vous pouvez aussi vérifier la triangulation en récupérant un croisé directement puis en le calculant via USD ; les deux doivent concorder à un ou deux points de base près.

Choisir une source de données selon votre cas d'usage

Il n'existe pas de source universellement « meilleure » — seulement la bonne source pour ce que vous construisez.

Cas d'usageCe qu'il vous fautAncienneté acceptable
Afficher des prix aux acheteursTaux mid-market, votre marge appliquée par-dessusHeures
Facturation d'abonnements SaaSMid-market, un instantané par cycle de facturation, stocké avec la factureHeures, mais doit être enregistré
Comptabilité et déclarations fiscalesTaux de référence de banque centrale pour la date préciseQuotidien, par définition
Analytique et tableaux de bordSérie historique cohérente issue d'une seule sourceQuotidien
Paiements et transfertsMid-market frais avec une bande de tolérance expliciteMinutes
Trading et couvertureVrais bid/ask depuis un flux institutionnelSecondes
Deux règles pratiques traversent tous ces cas. D'abord, stockez toujours le taux réellement utilisé avec la transaction, son horodatage et sa source — le reconstituer plus tard est impossible et les auditeurs le demanderont. Ensuite, utilisez une seule source par système de référence. Mélanger les fournisseurs entre votre checkout et votre grand livre garantit des centimes de dérive que personne ne saura expliquer six mois plus tard.

Si vous évaluez encore les options, notre comparatif des API de devises gratuites et payantes détaille ce qui change en montant de palier, et la page plans tarifaires montre où se situent la fréquence de rafraîchissement et les limites de requêtes. Pour une vérification manuelle rapide sur une paire, le convertisseur de devises utilise le même flux sous-jacent que l'API.

Foire aux questions

D'où les API de devises gratuites tirent-elles leurs données ?

Presque toujours des publications de banques centrales, le plus souvent les taux de référence quotidiens de l'euro de la Banque centrale européenne, parfois mélangés à quelques autres sources publiques. C'est pourquoi les paliers gratuits rafraîchissent généralement une fois par jour, sautent les week-ends et couvrent moins de devises exotiques que les paliers payants.

Pourquoi le taux de mon API diffère-t-il de celui de Google ?

Google affiche un taux de référence mid-market, qui est un instantané et non un prix continu en direct, et il n'est pas nécessairement échantillonné au même moment que votre appel d'API. Un petit écart est normal. Un écart important signifie généralement que l'un des deux est un taux de détail avec marge plutôt qu'un taux mid-market.

Quel taux de change utiliser pour la comptabilité et la fiscalité ?

Utilisez le taux de référence officiel publié par la banque centrale compétente pour la date de la transaction — c'est ce qu'attendent la plupart des administrations fiscales. Récupérez-le via un endpoint historique avec une date explicite plutôt que de réutiliser un taux en direct, et stockez-le avec l'enregistrement de la transaction.

Une API de taux de change en temps réel l'est-elle vraiment ?

Rarement au sens littéral. « Temps réel » signifie généralement que le fournisseur rafraîchit à intervalle court — 60 secondes est courant au palier supérieur — et non qu'il diffuse tick par tick. Vérifiez l'horodatage dans la réponse et l'intervalle de rafraîchissement documenté, pas l'argumentaire marketing.

Puis-je scraper les taux de change au lieu d'utiliser une API ?

Vous pouvez, mais vous héritez de tous les modes de défaillance de la page scrapée : changements de mise en page, limitation de débit, absence d'horodatage, absence d'historique, et fréquemment une violation des conditions d'utilisation. Nous avons traité l'arbitrage complet dans API de devises contre web scraping.

Construisez sur un flux que vous pouvez auditer

Savoir d'où viennent vos données de taux de change fait la différence entre un bug de devise que vous expliquez en une phrase et un bug qui dévore une semaine d'ingénierie. Posez trois questions à tout fournisseur avant d'intégrer : quelles sont les sources, à quelle fréquence rafraîchit-il, et chaque réponse porte-t-elle un horodatage de capture ?

Prêt à intégrer des taux de change réellement auditables ? Obtenez votre clé API Finexly gratuite — sans carte bancaire. Démarrez avec 1 000 requêtes gratuites par mois sur plus de 170 devises, avec des réponses horodatées et des données historiques dès le premier jour.

Vlado Grigirov

Senior Currency Markets Analyst & Financial Strategist

Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...

View full profile →

Partager cet article