GET /v1/latest/USD returns the latest rates from USD to every other currency. Use symbols to select specific currencies. Without a key, you can make 10 requests a minute per IP. A free key includes 5,000 requests a month. Free and keyless rates are delayed by 15 minutes.
Make a request
Set the base currency in the path or with ?base=. Store your key on your server.
curl "https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP,JPY" \ -H "Authorization: Bearer $EXCHANGERATE_API_KEY"const res = await fetch("https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP,JPY", { headers: { Authorization: `Bearer ${process.env.EXCHANGERATE_API_KEY}` },})const data = await res.json()if (data.result !== "success") throw new Error(data.code)import os, requestsres = requests.get( "https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP,JPY", headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"}, timeout=10,)data = res.json()if data["result"] != "success": raise RuntimeError(data["code"])Parameters
| Name | Location | Required | Description |
|---|---|---|---|
base | path, or ?base= | No (USD) | Currency used as the base for rates |
symbols | query | No (every other currency) | Currencies to include, separated by commas |
Read the response
This example was captured without a key on 19 Oct 2026. Rates and timestamps will differ in your response.
{ "result": "success", "base": "USD", "source": "live", "sources": { "EUR": "live", "GBP": "live", "JPY": "live" }, "market_session": "open", "timestamp": "2026-10-19T12:44:20Z", "data_updated_at": "2026-10-19T12:28:59Z", "effective_at": { "EUR": "2026-10-19T12:28:59Z", "GBP": "2026-10-19T12:28:59Z", "JPY": "2026-10-19T12:28:59Z" }, "rates": { "EUR": 0.89124, "GBP": 0.75048, "JPY": 158.274 }, "stale": { "EUR": false, "GBP": false, "JPY": false }, "derived_symbols": [], "notice": "Indicative rates, not for settlement."}| Field | Description |
|---|---|
result | success or error |
source, sources | Rate source: live, ecb_daily or market_daily; source reports the least fresh |
market_session | open, weekend or interbank_closed |
timestamp | Time the response was served (UTC) |
data_updated_at | Time of the oldest observation returned (UTC) |
effective_at | Observation time for each currency |
rates | Units of each currency per 1 unit of the base |
stale | True if a rate is outside its source's freshness window |
derived_symbols | Currencies with rates calculated through another currency |
notice | Reminder that rates are indicative and aren't for settlement |
Errors
| Status | code | When |
|---|---|---|
| 400 | unsupported_base | Unsupported base currency |
| 429 | ip_rate_limited | Keyless requests exceed 100 in an hour per IP |
| 429 | quota_exceeded | Plan's monthly request limit exceeded |
{ "result": "error", "code": "unsupported_base", "message": "unsupported base: XYZ"}Request limits
Free includes 5,000 requests a month and 10 a minute, with rates delayed by 15 minutes. Paid plans provide live rates. See free plan limits for details on every plan.