Free Exchange Rates API

Daily euro foreign exchange reference rates from the European Central Bank for 30 currencies, back to January 1999 – latest, historical, time series and currency conversion, with any base currency. JSON over HTTPS, no API key, CORS enabled, and the same response format as Frankfurter v1.

  • No API key
  • 30 currencies
  • Daily since 1999
  • Frankfurter-compatible

Quick start

One request, no key. Get today's rates against the US dollar:

curl "https://api.quotelinks.com/v1/fx/latest?base=USD"
Response (shortened)
{"amount":1.0,"base":"USD","date":"2026-11-06","rates":{"AUD":1.45544,"BRL":5.50372,"CAD":1.40663,"CHF":0.818898, … ,"EUR":0.895656,"GBP":0.747112,"JPY":158.325, …}}

date is the ECB publication date of the rates. Each value in rates is how many units of that currency one unit of base buys (times amount).

Try it

Build a request, press Run, and see the live JSON from api.quotelinks.com.

https://api.quotelinks.com/v1/fx/latest

Endpoints

Base URL: https://api.quotelinks.com/v1/fx/. All endpoints are GET. Currency codes are ISO 4217 and case-insensitive (usd works).

EndpointReturns
/latestThe most recent rates
/{date}Rates for one date (YYYY-MM-DD)
/{start}..{end}Daily rates for a date range (end optional)
/history/{currency}One currency, every day since 1999 (fast, cached)
/convertAn amount converted from one currency to another
/currenciesAvailable currency codes and names

GET/v1/fx/latest

The most recent rates published by the ECB.

ParameterDescription
baseBase currency. Default EUR. Alias: from.
symbolsComma-separated currencies to return, e.g. USD,GBP. Default: all. Alias: to.
amountAmount of the base currency to convert. Default 1.
Request
GET https://api.quotelinks.com/v1/fx/latest?base=USD&symbols=EUR,JPY&amount=100
Response
{"amount":100.0,"base":"USD","date":"2026-11-06","rates":{"EUR":89.5656,"JPY":15832.5}}

GET/v1/fx/{date}

Rates for one date, YYYY-MM-DD, from 1999-01-04. For a weekend or TARGET holiday you get the last working day before it – check the date field. Same parameters as /latest.

Request
GET https://api.quotelinks.com/v1/fx/2026-11-08?symbols=USD
Response (2026-11-08 is a Sunday)
{"amount":1.0,"base":"EUR","date":"2026-11-06","rates":{"USD":1.1165}}

GET/v1/fx/{start}..{end}

Daily rates from start to end, both inclusive. Leave end out (2026-01-01..) to go up to the latest date. Only ECB working days appear. Same parameters as /latest; use symbols to keep responses small.

Request
GET https://api.quotelinks.com/v1/fx/2026-11-04..2026-11-06?base=USD&symbols=JPY
Response (shortened)
{"amount":1.0,"base":"USD","start_date":"2026-11-04","end_date":"2026-11-06","rates":{"2026-11-04":{"JPY":158.25}, … ,"2026-11-06":{"JPY":158.325}}}

GET/v1/fx/history/{currency}

The full daily history of one currency since 1999, against base (default EUR). Served as a pre-built file, so it is the fastest way to get long series for charts.

Request
GET https://api.quotelinks.com/v1/fx/history/JPY?base=USD
Response (shortened)
{"amount":1.0,"base":"USD","start_date":"1999-01-04","end_date":"2026-11-06","rates":{"1999-01-04":{"JPY":113.436},"1999-01-05":{"JPY":111.077}, … ,"2026-11-06":{"JPY":158.325}}}

GET/v1/fx/convert

Convert an amount. Returns the same shape as /latest.

ParameterDescription
fromCurrency to convert from. Default EUR.
toCurrency (or comma-separated currencies) to convert to. Required.
amountAmount to convert. Default 1.
dateOptional YYYY-MM-DD to use that day's rates instead of the latest.
Request
GET https://api.quotelinks.com/v1/fx/convert?from=USD&to=JPY&amount=100
Response
{"amount":100.0,"base":"USD","date":"2026-11-06","rates":{"JPY":15832.5}}

GET/v1/fx/currencies

Currencies available in the latest rates, with their names.

Response (shortened)
{"AUD":"Australian Dollar","BRL":"Brazilian Real","CAD":"Canadian Dollar", … ,"USD":"United States Dollar","ZAR":"South African Rand"}

Currencies

The 30 currencies in the current ECB reference rates. Any of them can be the base.

AUD Australian DollarBRL Brazilian RealCAD Canadian Dollar CHF Swiss FrancCNY Chinese Renminbi YuanCZK Czech Koruna DKK Danish KroneEUR EuroGBP British Pound HKD Hong Kong DollarHUF Hungarian ForintIDR Indonesian Rupiah ILS Israeli New SheqelINR Indian RupeeISK Icelandic Króna JPY Japanese YenKRW South Korean WonMXN Mexican Peso MYR Malaysian RinggitNOK Norwegian KroneNZD New Zealand Dollar PHP Philippine PesoPLN Polish ZłotyRON Romanian Leu SEK Swedish KronaSGD Singapore DollarTHB Thai Baht TRY Turkish LiraUSD United States DollarZAR South African Rand

Historical dates also include currencies the ECB no longer quotes – for example BGN, HRK, RUB or the pre-euro CYP – for the days they were published. The ECB does not publish some currencies at all (for example TWD, AED or SAR).

Data & updates

  • Source: the European Central Bank's euro foreign exchange reference rates, fetched directly from the ECB.
  • Schedule: the ECB publishes once per TARGET working day, around 16:00 CET. The API picks the new rates up shortly after.
  • No weekend or holiday rates: nothing is published on Saturdays, Sundays or TARGET holidays (1 January, Good Friday, Easter Monday, 1 May, 25 and 26 December). Requests for those days return the previous working day.
  • Other base currencies: the ECB publishes rates against the euro. For any other base, the API divides the two euro rates, e.g. JPY per USD = (JPY per EUR) ÷ (USD per EUR).
  • Precision: with base EUR and amount 1 you get the ECB's numbers exactly as published. Everything else is rounded to 6 significant digits.
  • Caching: current answers are cached for up to 1 hour, answers for past dates for up to 1 day.

Errors & limits

Errors return JSON with the HTTP status and a message:

{"status":404,"message":"not found"}
StatusWhen
404Unknown or unavailable currency, invalid date, a date before 1999-01-04, or an unknown path.
422Invalid amount, or /convert without to.
405Method other than GET or HEAD.
429Too many requests. Wait (see Retry-After) and retry.
503Temporary server problem. Retry later.

Fair use: up to 2 requests per second per IP address, or 10 per second with a free API key (add api_token=YOUR_KEY). The rates change once a day, so please cache responses – one request per day per currency pair is usually enough.

Switching from Frankfurter

The /latest, /{date}, /{start}..{end} and /currencies endpoints use the same paths, parameters (base, symbols, amount, from, to) and JSON shape as Frankfurter v1. Change only the base URL:

https://api.frankfurter.dev/v1/   →   https://api.quotelinks.com/v1/fx/

Differences to know about:

  • Rates for non-EUR bases have 6 significant digits (Frankfurter uses 5), e.g. 158.325 instead of 158.33.
  • Error responses also include the HTTP status next to message.
  • Two extra endpoints: /history/{currency} and /convert.

Code examples

JavaScript (browser or Node 18+)

const r = await fetch("https://api.quotelinks.com/v1/fx/convert?from=USD&to=EUR&amount=250");
const data = await r.json();
console.log(`250 USD = ${data.rates.EUR} EUR on ${data.date}`);

Python

import json, urllib.request

url = "https://api.quotelinks.com/v1/fx/latest?base=USD&symbols=EUR,GBP,JPY"
with urllib.request.urlopen(url) as r:
    data = json.load(r)
print(data["date"], data["rates"])

PHP

$data = json_decode(file_get_contents(
    "https://api.quotelinks.com/v1/fx/2025-12-31?base=USD&symbols=EUR,GBP"
), true);
echo $data["rates"]["EUR"];

Source & license

The rates are the European Central Bank's euro foreign exchange reference rates. Under the ECB's statistics reuse policy the ECB allows its statistics to be reused provided the source is quoted. The Quotelinks API itself is for personal, non-commercial use, and redistribution of the data obtained from it is not allowed (see the Terms of Service). When you show the rates, add a credit such as:

Source: European Central Bank reference rates, via Quotelinks

Rates against base currencies other than the euro, and converted amounts, are calculated by Quotelinks from the ECB's euro rates; they are not published by the ECB.

The ECB publishes the reference rates for information purposes only. They are not intended for transactions or trading, and Quotelinks provides the API as is, without warranty. See the disclaimer.

Frequently asked questions

Is the Exchange Rates API free?

Yes. No sign-up, no API key needed and no cost. Fair use is up to 2 requests per second per IP address, or 10 per second with a free API key; please cache responses.

Where do the exchange rates come from?

From the European Central Bank's euro foreign exchange reference rates, fetched directly from the ECB once per working day.

How often are the rates updated?

Once per TARGET working day. The ECB publishes around 16:00 CET and the API picks the new rates up shortly after. There are no rates on weekends and TARGET holidays; requests for those days return the previous working day.

Are these real-time exchange rates?

No. They are daily reference rates, published once a day by the ECB. They are suitable for reference, reporting and display, not for trading or transactions.

Is it compatible with Frankfurter?

Yes. The latest, historical, time series and currencies endpoints use the same paths, parameters and JSON shape as Frankfurter v1. Change the base URL to https://api.quotelinks.com/v1/fx/.

Can I use the rates in my app or website?

In personal, non-commercial projects, yes, with a source credit such as Source: European Central Bank. Commercial use and redistribution of the data are not allowed; contact support@quotelinks.com and see the Terms of Service. The rates are for information purposes only.