GET /v1/convert/USD/EUR/100 converts 100 US dollars into euros, returning the rate and converted amount. Omit the amount to get the rate for 1. Keyless calls allow 10 requests a minute per IP. Free and keyless rates are delayed by 15 minutes.
Make a request
Set the source currency, target currency and amount in the path. To convert many pairs in one call, pass a list to POST /v1/convert.
curl "https://api.exchangerate.dev/v1/convert/USD/EUR/100" \ -H "Authorization: Bearer $EXCHANGERATE_API_KEY"const res = await fetch("https://api.exchangerate.dev/v1/convert/USD/EUR/100", { 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/convert/USD/EUR/100", 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 |
|---|---|---|---|
from | path | Yes | Source currency |
to | path | Yes | Target currency |
amount | path | No (1) | Amount to convert |
Read the response
This example was captured without a key on 19 Oct 2026. The rate and amount in your response will differ.
{ "result": "success", "from": "USD", "to": "EUR", "amount": 100, "rate": 0.89124, "converted": 89.12, "derived": false, "derivation_bps_max": null, "source": "live", "sources": { "EUR": "live" }, "stale": false, "market_session": "open", "timestamp": "2026-10-19T12:44:21Z", "data_updated_at": "2026-10-19T12:28:59Z", "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) |
amount, rate, converted | Submitted amount, applied rate and converted amount |
derived, derivation_bps_max | Whether the rate was calculated through another currency; check derived, as derivation_bps_max can be null |
stale | True if the rate is outside its source's freshness window |
notice | Reminder that rates are indicative and aren't for settlement |
Errors
| Status | code | When |
|---|---|---|
| 400 | invalid_request | Invalid path value, such as a non-numeric amount |
| 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": "invalid_request", "message": "invalid or malformed request parameters"}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.