Chiedi a cinque servizi diversi il tasso EUR/USD in questo preciso istante e otterrai cinque numeri leggermente diversi. Non radicalmente diversi — ma diversi al quarto decimale, a volte al terzo. Se il tuo team finance ha mai aperto un ticket perché il checkout mostrava 1,0847 mentre l'estratto conto dice 1,0821, sai già che non è una questione accademica.
Quindi, da dove prendono i dati le API dei tassi di cambio? La risposta onesta è che nessuna API "conosce" il tasso di cambio, perché non esiste un tasso di cambio unico da conoscere. Il mercato valutario è un mercato over-the-counter senza borsa centrale e senza campanella di chiusura: solo migliaia di istituzioni che si quotano prezzi a vicenda in tutto il mondo. Ogni API che puoi chiamare è una pipeline che campiona quel mercato, lo ripulisce e ti consegna un numero. Questa guida percorre quella pipeline livello per livello, spiega esattamente perché due provider non concordano e ti mostra come verificare un feed prima di costruirci sopra la logica di fatturazione.
La risposta breve: tre livelli tra il mercato e il tuo JSON
Ogni API di tassi di cambio — gratuita o a pagamento, la nostra inclusa — è costruita sugli stessi tre livelli:
- Acquisizione. I prezzi grezzi vengono presi da fonti a monte: feed FX istituzionali, pubblicazioni di banche centrali e quotazioni di broker o retail.
- Normalizzazione. Quei prezzi vengono validati, gli outlier scartati, più fonti combinate e viene derivato un unico tasso di riferimento per coppia.
- Distribuzione. Il tasso derivato viene fotografato secondo una cadenza, messo in cache e servito via HTTP con un timestamp.
Differenze in uno qualsiasi di questi tre livelli producono un numero diverso nel tuo response body. La maggior parte degli sviluppatori presume che la discrepanza venga dal livello 1. In pratica, i livelli 2 e 3 ne causano altrettanta.
Livello 1 — Da dove arrivano davvero i prezzi grezzi
Feed interbancari e istituzionali
La cosa più vicina a un tasso di cambio "reale" è il mercato interbancario: i prezzi ai quali grandi banche e liquidity provider trattano tra loro. Questi prezzi arrivano come flussi continui di quotazioni bid e ask da sedi di negoziazione, prime broker e fornitori di dati di mercato.
Feed di questo tipo sono la fonte con la fedeltà più alta disponibile. Sono anche i più costosi, ed è il motivo principale per cui le API gratuite raramente li usano come fonte primaria. Quando un provider dichiara tassi "in tempo reale" o "sotto il minuto", è quasi sempre perché ci sono feed istituzionali in cima alla sua pipeline.
Nota che un feed interbancario ti dà due prezzi, non uno — un bid e un ask. Il tasso singolo che vedi in una risposta API è di solito il punto medio tra i due. Se questa distinzione ti è nuova, la nostra guida allo spread bid-ask nel cambio valuta la spiega in dettaglio.
Tassi di riferimento delle banche centrali
La seconda grande fonte sono le pubblicazioni ufficiali delle banche centrali. L'esempio più noto è la Banca Centrale Europea, che pubblica i tassi di cambio di riferimento dell'euro in ogni giorno lavorativo TARGET intorno alle 16:00 CET, sulla base di una procedura di concertazione tra banche centrali europee. Decine di altre banche centrali pubblicano tassi giornalieri equivalenti per le proprie valute.
I tassi delle banche centrali hanno due vantaggi enormi: sono gratuiti e sono autorevoli. Molte autorità fiscali e principi contabili li accettano esplicitamente per il reporting. È per questo che gran parte dell'ecosistema di API gratuite è costruito su di essi. Frankfurter, un progetto open source molto usato in questo ambito, traccia tassi giornalieri di 84 banche centrali coprendo 201 valute, con uno storico che risale al 1948 — tutti dati pubblici, ridistribuiti.
Hanno anche due limiti seri:
- Sono istantanee giornaliere, non prezzi live. Un tasso di riferimento delle 16:00 CET non dice nulla su cosa è successo alle 09:00 o alle 22:00.
- Si fermano nei weekend e nei festivi. Se la tua API non restituisce dati per un sabato, o ripete il numero di venerdì, una fonte derivata dalla BCE è la spiegazione più comune.
Quotazioni retail e di broker
La terza fonte è il prezzo rivolto al cliente finale: quello che una banca, un circuito di carte, un payment processor o un servizio di trasferimento darà realmente a un cliente. Questi tassi includono già un markup — un margine incorporato nel prezzo sopra il tasso di mercato.
È per questo che un tasso visto su un comparatore per consumatori non coincide con quello del tuo estratto conto. Non è un errore né dell'uno né dell'altro; misurano cose diverse. I siti consumer mostrano tipicamente il tasso mid-market, mentre la tua banca ti quota il mid-market più il suo spread. Per la maggior parte dei casi d'uso software vuoi il numero mid-market e vuoi applicare il tuo margine in modo esplicito, dove puoi vederlo e verificarlo.
Livello 2 — Come i provider trasformano i feed in un tasso unico
Una volta arrivati i prezzi grezzi, il provider deve decidere quale numero pubblicare. Qui avvengono quattro decisioni, e ognuna è un punto in cui i provider divergono.
Blending. La maggior parte delle API commerciali non dipende da una sola fonte a monte. Open Exchange Rates, per esempio, descrive i propri dati come raccolti da più provider e combinati algoritmicamente. Il blending smussa un singolo tick anomalo, ma i pesi della combinazione sono proprietari — ed è esattamente per questo che due feed combinati non coincidono mai esattamente.
Scarto degli outlier. Una quotazione errata da una sede può essere fuori di un ordine di grandezza. I provider applicano filtri che scartano i prezzi fuori da una banda di tolleranza attorno al consenso. Un filtraggio aggressivo significa tassi stabili ma reazione più lenta ai movimenti reali. Un filtraggio permissivo significa reazione rapida ma rumore occasionale.
Derivazione del mid. Se il feed a monte è bid/ask, il provider pubblica un mid. Il punto medio semplice (bid + ask) / 2 è lo standard, ma approcci ponderati per volume producono un risultato leggermente diverso.
Triangolazione dei cross. Nessun provider ricava direttamente tutte le oltre 30.000 coppie valutarie possibili. La maggior parte delle coppie viene invece calcolata attraverso una valuta pivot — di solito USD o EUR:
GBP/JPY = (USD/JPY) / (USD/GBP)Questo significa che il tasso che ottieni per una coppia esotica eredita arrotondamento e timing da altre due coppie. Provider che pivotano su USD e provider che pivotano su EUR arriveranno a numeri diversi per lo stesso cross. Copriamo la meccanica in tassi di cambio incrociati spiegati.
Livello 3 — Come il tasso arriva al tuo codice
L'ultimo livello è quello che gli sviluppatori controllano di più e a cui pensano di meno.
La cadenza di aggiornamento è il singolo fattore di differenziazione più grande tra provider e tra fasce di prezzo. I piani gratuiti aggiornano comunemente una o due volte al giorno. Le fasce a pagamento aggiornano ogni ora, ogni dieci minuti o ogni 60 secondi. Due API con dati identici divergeranno semplicemente perché una ha fotografato alle 14:00 e l'altra alle 14:47.
La cache aggrava il problema. Quasi tutte le API stanno dietro una CDN, e quasi tutti i client ben costruiti mettono in cache localmente sopra. Aggiungi una cache edge di 15 minuti a un refresh di 10 minuti e la tua applicazione potrebbe lavorare con un tasso vecchio di 25 minuti. Va benissimo per mostrare prezzi ed è inaccettabile per regolare un'operazione — la domanda pratica è sempre quanto vecchio è troppo vecchio per questa specifica operazione. La nostra guida su cache e gestione degli errori nelle API valutarie spiega come dimensionare quelle finestre.
I timestamp sono la tua difesa. Ogni API seria restituisce il momento in cui il tasso è stato catturato. Leggilo. Non dare per scontato che il momento in cui hai ricevuto la risposta sia il momento in cui il tasso era vero:
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 };
}Ecco la richiesta sottostante e una forma rappresentativa della risposta:
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
}
}Tutti i dettagli su parametri ed endpoint sono nella documentazione dell'API Finexly.
Perché due API restituiscono numeri diversi per la stessa coppia
Mettendo insieme i tre livelli, ecco le sei cause di disaccordo, grosso modo in ordine di danno prodotto:
- Momenti di cattura diversi. La causa di gran lunga più comune. Nessuno dei due feed è sbagliato; hanno semplicemente guardato in momenti diversi.
- Mix di fonti diversi. Un tasso derivato da banca centrale e uno derivato dall'interbancario misurano per definizione due cose diverse.
- Mid-market contro tasso con markup. Un provider ti dà il punto medio di mercato, un altro un prezzo al cliente con lo spread già dentro.
- Valute pivot diverse per i cross. Triangolazione via USD e via EUR producono risultati diversi per la stessa coppia non-USD.
- Precisione e arrotondamento. Sei decimali troncati a quattro, oppure tassi pubblicati come coppie inverse e re-invertiti, introducono entrambi deriva.
- Livelli di cache che hai dimenticato. La tua CDN, la cache HTTP del tuo framework e il tuo strato Redis aggiungono ciascuno anzianità.
Una regola pratica utile: per le coppie principali, uno scarto di pochi punti base (0,01% = 1 pb) tra due fonti mid-market affidabili è normale e atteso. Uno scarto di 50 pb o più significa che una delle due è vecchia, con markup o rotta — e dovresti scoprire quale prima di andare in produzione.
Come verificare un'API di tassi di cambio prima di fidartene
Non prendere per buone le dichiarazioni di accuratezza di un provider. Fai girare questo controllo per una settimana contro la fonte che il tuo team finance considera autorevole:
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'}")Tre cose da guardare nei risultati:
- Lo scarto è stabile o va alla deriva? Uno scostamento costante suggerisce un markup sistematico. Uno casuale suggerisce timing.
- Lo scarto si impenna in certe ore? Questo punta al momento di cattura, di solito attorno a una finestra di pubblicazione di una banca centrale.
- Cosa succede nei weekend? Se la tua fonte si congela il venerdì pomeriggio e riprende il lunedì, è derivata da banca centrale — pianifica la riconciliazione del lunedì di conseguenza.
Puoi anche verificare la triangolazione recuperando un cross direttamente e calcolandolo via USD; i due dovrebbero coincidere entro uno o due punti base.
Scegliere una fonte dati in base al caso d'uso
Non esiste una fonte universalmente "migliore" — solo la fonte giusta per quello che stai costruendo.
| Caso d'uso | Cosa ti serve | Anzianità accettabile |
|---|---|---|
| Mostrare prezzi agli acquirenti | Tasso mid-market, con il tuo markup applicato sopra | Ore |
| Fatturazione di abbonamenti SaaS | Mid-market, uno snapshot per ciclo di fatturazione, salvato con la fattura | Ore, ma va registrato |
| Contabilità e reporting fiscale | Tasso di riferimento della banca centrale per la data specifica | Giornaliera, per definizione |
| Analytics e dashboard | Serie storica coerente da un'unica fonte | Giornaliera |
| Payout e rimesse | Mid-market fresco con una banda di tolleranza esplicita | Minuti |
| Trading e hedging | Bid/ask reali da un feed istituzionale | Secondi |
Se stai ancora valutando le opzioni, il nostro confronto tra API valutarie gratuite e a pagamento spiega cosa cambia salendo di fascia, e la pagina piani e prezzi mostra dove si collocano frequenza di aggiornamento e limiti di richieste. Per un controllo manuale rapido su una coppia, il convertitore di valuta usa lo stesso feed sottostante dell'API.
Domande frequenti
Da dove prendono i dati le API valutarie gratuite?
Quasi sempre da pubblicazioni di banche centrali, più comunemente i tassi di riferimento giornalieri dell'euro della Banca Centrale Europea, a volte combinati con qualche altra fonte pubblica. È per questo che le fasce gratuite tipicamente aggiornano una volta al giorno, saltano i weekend e coprono meno valute esotiche di quelle a pagamento.
Perché il tasso della mia API è diverso da quello di Google?
Google mostra un tasso di riferimento mid-market, che è un'istantanea e non un prezzo live continuo, e non è necessariamente campionato nello stesso momento della tua chiamata API. Una piccola differenza è normale. Una grande di solito significa che uno dei due è un tasso retail con markup invece che un mid-market.
Quale tasso di cambio devo usare per contabilità e fisco?
Usa il tasso di riferimento ufficiale pubblicato dalla banca centrale competente per la data della transazione — è quello che si aspettano la maggior parte delle autorità fiscali. Recuperalo da un endpoint storico con data esplicita invece di riutilizzare un tasso live, e salvalo insieme al record della transazione.
Un'API di tassi in tempo reale è davvero in tempo reale?
Raramente in senso letterale. "Tempo reale" di solito significa che il provider aggiorna a intervalli brevi — 60 secondi è comune nella fascia più alta — non che trasmetta tick per tick. Controlla il timestamp nella risposta e l'intervallo di aggiornamento documentato, non il testo di marketing.
Posso fare scraping dei tassi invece di usare un'API?
Puoi, ma erediti ogni modalità di guasto della pagina che raschi: cambi di layout, rate limiting, nessun timestamp, nessun backfill storico e spesso una violazione dei termini di servizio. Abbiamo trattato il compromesso completo in API valutaria contro web scraping.
Costruisci su un feed che puoi verificare
Sapere da dove arrivano i tuoi dati di cambio è la differenza tra un bug valutario che spieghi in una frase e uno che si mangia una settimana di lavoro. Fai tre domande a qualsiasi provider prima di integrare: quali sono le fonti, ogni quanto aggiorna e se ogni risposta porta un timestamp di cattura.
Pronto a integrare tassi di cambio che puoi davvero verificare? Ottieni la tua chiave API Finexly gratuita — senza carta di credito. Parti con 1.000 richieste gratuite al mese su oltre 170 valute, con risposte timestampate e dati storici fin dal primo giorno.
Explore More
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 →