DocsDocs

Convert an amount between currencies

GET /v1/convert: copy a request to convert an amount between two currencies

20 Oct 2026 · 2 min read

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.

Shell
curl "https://api.exchangerate.dev/v1/convert/USD/EUR/100" \  -H "Authorization: Bearer $EXCHANGERATE_API_KEY"
JavaScript
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)
Python
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

NameLocationRequiredDescription
frompathYesSource currency
topathYesTarget currency
amountpathNo (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.

Response example (19 Oct 2026)
{  "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."}
FieldDescription
resultsuccess or error
source, sourcesRate source: live, ecb_daily or market_daily; source reports the least fresh
market_sessionopen, weekend or interbank_closed
timestampTime the response was served (UTC)
data_updated_atTime of the oldest observation returned (UTC)
amount, rate, convertedSubmitted amount, applied rate and converted amount
derived, derivation_bps_maxWhether the rate was calculated through another currency; check derived, as derivation_bps_max can be null
staleTrue if the rate is outside its source's freshness window
noticeReminder that rates are indicative and aren't for settlement

Errors

StatuscodeWhen
400invalid_requestInvalid path value, such as a non-numeric amount
429ip_rate_limitedKeyless requests exceed 100 in an hour per IP
429quota_exceededPlan's monthly request limit exceeded
Error response
{  "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.

Questions

How can I convert an amount using exchangerate.dev?

Request /v1/convert/FROM/TO/AMOUNT, such as /v1/convert/USD/EUR/100. The response includes rate and converted.

What does derived tell me?

derived is true if the rate was calculated through another currency rather than quoted directly.

Does the API round the converted amount?

Yes, converted is rounded. Use rate with your own rounding rules for amounts you book.

Keep reading

Use your own quota for /v1/convert

Add a free key to count this request against your own quota instead of the shared per-IP limit.

Get a free key