Skip to content

Methodology

Currency methodology

ECB daily rates, Frankfurter API, ISR cache, hourly refresh.

By Published Updated

The Currency clusterships 50 live FX pairs against the European Central Bank’s published mid-market rates. The data path is intentionally simple: ECB publishes daily reference rates; the open-source Frankfurter API republishes them as JSON; we cache the result with Next.js ISR for one hour. No proprietary spread, no aggregation across providers, no “our pricing” layer.

The data source: ECB daily reference rates

The European Central Bank publishes reference exchange rates for the euro against ~32 currencies each banking day at 16:00 CET. These are mid-market rates derived from a concertation between EU central banks; they aren’t transactable but they are the canonical reference benchmark.

For non-EUR pairs (USD → GBP, JPY → TRY) we triangulate via EUR: USD/EUR × EUR/GBP gives USD/GBP. The triangulation is algebraically exact and is what Frankfurter computes internally.

The caching strategy

Currency rates update at most once per day (ECB doesn’t publish weekend rates), so a 1-hour cache is generous. We use Next.js incremental static regeneration:

  • First request to a currency page: server fetches Frankfurter, renders, caches.
  • Subsequent requests within 1 hour: cached HTML, sub-100ms.
  • After 1 hour: next request gets the stale page immediately, triggers a background refresh.

This means the rate you see is up to one hour stale. For retail conversion that’s irrelevant — bank spreads change the answer by far more than an hour’s drift. For high-precision contexts (algorithmic trading, large wire transfers) get the rate from your bank, not from any public reference.

Spread vs the rate you’ll actually get

The mid-market rate is the rate two banks would transact at. You — a retail customer — won’t get this rate. Your actual cost includes a spread on top:

  • Card networks (Visa, Mastercard): typically 0.2-1% above mid-market.
  • Issuer banks adding their own spread: common in the US; 1-3% added on top of network rate.
  • Currency-conversion fees at ATMs and POS terminals (DCC): 3-8% spread. Always decline if asked to pay in your home currency abroad.
  • Specialised forex providers (Wise, Revolut): 0.3-1% above mid-market, no DCC. Closest to the reference rate of any retail option.
  • Traditional banks for wires: 2-5% spread. Worst of all common retail options.

Algorithm details: rate resolution and triangulation

Every currency request resolves to a single multiplication. The interesting part is how we get to the correct per-unit rate when the requested base isn’t EUR.

  1. Normalise both currencies to ISO 4217 three-letter codes and validate against the supported list (~32 currencies — every code in the ECB reference series plus a small set of cross-rates).
  2. Fetch the latest EUR-based rate set from the Frankfurter cache (1-hour TTL via ISR). The payload is a map { "USD": 1.0865, "GBP": 0.8479, ... } all quoted as 1 EUR = X target.
  3. Triangulate if neither side is EUR. For JPY → TRY: rate_JPY_TRY = rate_EUR_TRY / rate_EUR_JPY. The triangulation is algebraically exact in real arithmetic; the floating-point error of the division is < 10⁻¹⁵, well below any meaningful retail spread.
  4. Compute the conversion. output = input × rate_from_to. Display rounds to 4 decimal places for FX-style outputs and 2 decimal places when paired with major currency symbols.
  5. Stamp the response metadata with rateDate (the ECB publication date, e.g. 2026-05-13) and source(“ECB via Frankfurter”).

Sources & references

Every rate this tool emits ultimately traces back to the ECB’s daily reference series published at 16:00 CET. Frankfurter is a transparent open-source republisher of that series; our cache simply respects its Cache-Control headers. ISO 4217 governs the currency-code namespace. The retail-spread figures cited elsewhere on this page draw on BIS and IMF reference data — full citations in the Sources block below.

Assumptions & limitations

  • EUR-pivot triangulation only.If both currencies are non-EUR and the ECB series doesn’t cover one of them on a given date, the converter returns the closest prior business day’s rate rather than attempting a different pivot.
  • Weekday-only data.ECB doesn’t publish on weekends or TARGET holidays. Weekend requests return Friday’s rate; the rateDate field flags it.
  • No live tick-by-tick market data. The ECB reference rate is a daily mid-fix, not a streaming quote. Algorithmic trading needs a Bloomberg or Reuters feed; this converter is a reference, not a market data service.
  • No spread modelling. The displayed rate is mid-market with zero bid/ask spread. Real retail conversion typically pays 0.3-4% above mid; the converter shows the floor, not the price.
  • No cryptocurrencies. BTC, ETH, and stablecoins live under /crypto/ and use a different methodology and data source.
  • Historical rates limited to ECB coverage (1999-present). Pre-euro currency conversion (DEM, FRF, ITL) requires a separate fixed-conversion-rate table.
  • Hyperinflation outliers may lag. Currencies with regime changes (TRY, ARS, VES) sometimes show stale rates briefly during the ECB’s republication cycle.

What we don’t do

We don’t aggregate rates across providers (so we can’t tell you who’s offering the best deal right now). We don’t support cryptocurrency pairs in the Currency cluster (those live under /crypto/). We don’t back the rate with a transactional API — Convertitive shows you the number, your bank or provider handles the actual money movement.

Frequently asked questions

Why ECB rates and not the Federal Reserve?
ECB rates are public, well-documented, free of access restrictions, and updated daily at 16:00 CET on the bank's website. The Fed's H.10 release is similar but biased toward USD pairs. ECB's coverage is broader for cross-currency pairs.
How accurate is the rate I see on the site?
It's the ECB mid-market reference rate, refreshed hourly. That's the rate two banks would transact at — not the rate you'd get from a retail bank, money-changer, or card-network conversion, all of which add a spread of 1-4%. Use Convertitive's rate as the baseline and check what your payment provider actually charges separately.

Sources & references

Authoritative references cited by this piece. Verified by Buğra Sözeri on the dates shown and re-checked at every deploy.

Related

Published May 14, 2026 · Last reviewed May 31, 2026