Free Exchange Rate API, No Key Required

Live currency rates for 100+ currencies · No signup · CORS enabled · 100 req/min per IP

GETCopy this URL for your first request
https://www.currencyexchangetool.com/api/v1/convert?amount=100&from=USD&to=EUR
url

Paste it into a browser, terminal, app, or Google Sheets workflow. No API key, token, dashboard, or account setup is required.

✓ Why This API Is Different

Most free currency APIs require signup, an API key, or a credit card. This API is completely open — no registration, no auth, no monthly cap.

Zero frictionNo signup, no headers, no SDK
100+ currenciesUSD, EUR, UAH, GBP, JPY, THB, ZAR...
Live ratesUpdated every request from Yahoo Finance
CORS enabledBrowser-ready, no proxy needed
Structured envelopesuccess/error + code on every response
XML formatGoogle Sheets IMPORTXML compatible

Base URL

All endpoints are relative to:

https://www.currencyexchangetool.com
url

Supported Currencies

USDEURUAHGBPCHFPLNRONCADAUDJPYCNYTRYINRBRLKRWSEKNOKMXNSGDNZDHKDDKKHUFCZKILS+75 more
100+ currencies are supported across all endpoints, including major, emerging-market, and cross-rate pairs. Fetch the full list from /api/v1/currencies.

Endpoints

CORS enabled. Every endpoint returns Access-Control-Allow-Origin: * and supports OPTIONS preflight (204) — safe to call directly from the browser.
GET/api/v1/convert

Convert an amount from one currency to another at the live exchange rate. Returns a success/error envelope. Add format=xml for Google Sheets.

Parameters

NameTypeRequiredDescription
fromstringYesSource currency code (e.g. USD)
tostringYesTarget currency code (e.g. UAH)
amountnumberNoThe amount to convert (default: 1)
formatstringNojson (default) or xml

Request

curl -s "https://www.currencyexchangetool.com/api/v1/convert?amount=100&from=USD&to=UAH"
bash

Response

{ "success": true, "from": "USD", "to": "UAH", "amount": 100, "rate": 44.979, "result": 4497.9, "change24h": 0.012, "changePct24h": 0.03, "updatedAt": "2026-06-12T06:06:45.059Z" }
json
GET/api/v1/currencies

Returns all supported currencies with codes and names. 100+ currencies including emerging-market pairs.

Request

curl -s "https://www.currencyexchangetool.com/api/v1/currencies"
bash

Response

{ "success": true, "count": 100, "currencies": [ { "code": "USD", "name": "US Dollar" }, { "code": "EUR", "name": "Euro" }, { "code": "JPY", "name": "Japanese Yen" } ] }
json
GET/api/v1/history

Historical daily rates. Three modes: last N days, a single date (weekend/holiday fallback), or a date range (max 1825 days).

Parameters

NameTypeRequiredDescription
fromstringYesSource currency code
tostringYesTarget currency code
daysnumberNoLast N days (1-1825)
datestringNoSingle date YYYY-MM-DD
start_datestringNoRange start YYYY-MM-DD (with end_date)
end_datestringNoRange end YYYY-MM-DD (with start_date)

Request

# Last 7 days curl -s "https://www.currencyexchangetool.com/api/v1/history?from=USD&to=UAH&days=7" # Date range (max 1825 days) curl -s "https://www.currencyexchangetool.com/api/v1/history?from=USD&to=UAH&start_date=2026-01-01&end_date=2026-06-01"
bash

Response

{ "success": true, "from": "USD", "to": "UAH", "days": 7, "count": 7, "data": [ { "date": "2026-06-06", "rate": 44.564 }, { "date": "2026-06-07", "rate": 44.890 }, { "date": "2026-06-08", "rate": 44.979 } ], "source": "Yahoo Finance" }
json

Error (400)

{ "success": false, "error": "Unsupported currency", "code": "unsupported_currency", "supported": ["USD", "EUR", "GBP", "JPY", "CHF", "CAD"], "hint": "Use ISO 4217 currency codes such as USD, EUR, GBP, JPY, CAD, AUD, CNY, or UAH." }
json

Try It

Send a live request to /api/v1/convert and inspect the response, status code, and rate-limit headers.

GET https://www.currencyexchangetool.com/api/v1/convert?amount=100&from=USD&to=EUR

Quick Start — by Language

JavaScript

const res = await fetch( 'https://www.currencyexchangetool.com/api/v1/convert?amount=100&from=USD&to=UAH' ); const data = await res.json(); console.log(`100 USD = ${data.result} UAH`);
javascript

Python

import requests res = requests.get( 'https://www.currencyexchangetool.com/api/v1/convert', params={'amount': 100, 'from': 'USD', 'to': 'UAH'} ) data = res.json() print(f"100 USD = {data['result']} UAH")
python

Go

package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Add("amount", "100") params.Add("from", "USD") params.Add("to", "UAH") resp, _ := http.Get( "https://www.currencyexchangetool.com/api/v1/convert?" + params.Encode(), ) defer resp.Body.Close() var data map[string]any json.NewDecoder(resp.Body).Decode(&data) fmt.Printf("100 USD = %v UAH\n", data["result"]) }
go

PHP

<?php $response = file_get_contents( 'https://www.currencyexchangetool.com/api/v1/convert?' . http_build_query(['amount' => 100, 'from' => 'USD', 'to' => 'UAH']) ); $data = json_decode($response, true); echo "100 USD = {$data['result']} UAH"; ?>
php

Ruby

require 'net/http' require 'json' uri = URI('https://www.currencyexchangetool.com/api/v1/convert') uri.query = URI.encode_www_form({ amount: 100, from: 'USD', to: 'UAH' }) data = JSON.parse(Net::HTTP.get(uri)) puts "100 USD = #{data['result']} UAH"
ruby

cURL

curl -s "https://www.currencyexchangetool.com/api/v1/convert?amount=100&from=USD&to=UAH"
curl

Google Sheets — IMPORTXML

Add format=xml to /api/v1/convert to use it with Google Sheets IMPORTXML.

=VALUE(IMPORTXML( "https://www.currencyexchangetool.com/api/v1/convert?amount=1&from=USD&to=EUR&format=xml", "/response/rate" ))
excel

💡 Tip: Use ENCODEURL for cell references. Sheets caches results — update a referenced cell to force refresh.

How It Compares to Other Free Currency APIs

Most "free" currency APIs require signup, an API key, or a credit card. Here is the 2026 landscape:

APIAPI KeySignupCurrenciesFree LimitUpdates
Currency Exchange Tool ⭐NoNo100+100/min, no monthly capLive
FrankfurterNoNo~30 (ECB)UnlimitedDaily
MoneyConvertNoNo182+Rate-limited5 min
ExchangeRate-API (Open)NoNo160+Rate-limitedDaily
ExchangeRate-API (Free)YesYes160+1,500/moDaily
FreeCurrencyAPIYesYes321,000/moDaily
Open Exchange RatesYesYes170+1,000/moHourly
AllRatesTodayYesYes160+Limited60 sec
Fixer.ioYesYes170+100/moDaily
CurrencyAPI.netYesYes300+500/moDaily

Key takeaway: This is the only API combining no API key, no signup, 100+ currencies, live rates, and no monthly cap.

Rate Limits

Convert & currencies100 req/min per IP. Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
HistoryStricter limit at 30 req/min per IP.
429 responsesInclude a Retry-After header (seconds). Back off and retry after it elapses.
CachingData changes every request. Cache at your discretion — max 1 hour recommended.

Example — 429 Too Many Requests

HTTP/1.1 429 Too Many Requests Retry-After: 60 X-RateLimit-Limit: 100 X-RateLimit-Remaining: 0 { "success": false, "error": "Rate limit exceeded", "code": "rate_limited" }
http

HTTP Status Codes

CodeMeaning
200Success
400Bad request — invalid amount or unsupported currency
404Rate not found for this pair
429Rate limit exceeded — includes Retry-After header
500Internal server error

Frequently Asked Questions

Do I need an API key?

No. All endpoints are open — no signup, no key, no auth. Requests are rate-limited per IP, not per account.

Do I need to sign up?

No signup is required. You can copy a URL, paste it into your app, browser, terminal, or spreadsheet, and get a live exchange-rate response immediately.

Is there a monthly limit?

No monthly cap. There is a per-IP rate limit: 100 requests/minute for convert and currencies, 30 requests/minute for history.

What happens if I exceed the rate limit?

You receive HTTP 429 with a Retry-After header (seconds to wait). Every response also includes X-RateLimit-Limit and X-RateLimit-Remaining so you can back off early.

How often are rates updated?

Fetched live from Yahoo Finance on each request. No cached or stale data.

Can I use this in production?

Yes. The API returns a structured success/error envelope, CORS headers, and rate-limit headers suitable for production use.

Does the API support CORS?

Yes. Every endpoint returns Access-Control-Allow-Origin: * and supports OPTIONS preflight, so browser JavaScript can call it directly.

Can I use this in Google Sheets?

Yes — add format=xml to /api/v1/convert and use IMPORTXML. See the Google Sheets section above.

Is historical data available?

Yes — up to 1825 days via /api/v1/history (by days, single date, or a date range).

📋
Attribution

If you use this API in a public project, we appreciate a link back to currencyexchangetool.com. Not required, but it helps keep the API free.

Open Currency Converter