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"
{"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/latestEndpoints
Base URL: https://api.quotelinks.com/v1/fx/. All endpoints are GET. Currency codes are ISO 4217 and case-insensitive (usd works).
| Endpoint | Returns |
|---|---|
/latest | The 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) |
/convert | An amount converted from one currency to another |
/currencies | Available currency codes and names |
GET/v1/fx/latest
The most recent rates published by the ECB.
| Parameter | Description |
|---|---|
base | Base currency. Default EUR. Alias: from. |
symbols | Comma-separated currencies to return, e.g. USD,GBP. Default: all. Alias: to. |
amount | Amount of the base currency to convert. Default 1. |
GET https://api.quotelinks.com/v1/fx/latest?base=USD&symbols=EUR,JPY&amount=100
{"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.
GET https://api.quotelinks.com/v1/fx/2026-11-08?symbols=USD
{"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.
GET https://api.quotelinks.com/v1/fx/2026-11-04..2026-11-06?base=USD&symbols=JPY
{"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.
GET https://api.quotelinks.com/v1/fx/history/JPY?base=USD
{"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.
| Parameter | Description |
|---|---|
from | Currency to convert from. Default EUR. |
to | Currency (or comma-separated currencies) to convert to. Required. |
amount | Amount to convert. Default 1. |
date | Optional YYYY-MM-DD to use that day's rates instead of the latest. |
GET https://api.quotelinks.com/v1/fx/convert?from=USD&to=JPY&amount=100
{"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.
{"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.
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
EURand 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"}| Status | When |
|---|---|
404 | Unknown or unavailable currency, invalid date, a date before 1999-01-04, or an unknown path. |
422 | Invalid amount, or /convert without to. |
405 | Method other than GET or HEAD. |
429 | Too many requests. Wait (see Retry-After) and retry. |
503 | Temporary 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.325instead of158.33. - Error responses also include the HTTP
statusnext tomessage. - 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.