Compare exchange rate APIs side-by-side. Convert between fiat currencies and cryptocurrencies programmatically. Find the best free currency API for your project.
Currency APIs power everything from e-commerce checkout flows to fintech dashboards. Here are the most common use cases:
Display product prices in the visitor's local currency. Auto-convert at checkout for international customers.
Build standalone currency converter tools or embed conversion widgets in apps and websites.
Track exchange rates over time. Show historical trends, alerts on rate changes, and portfolio valuations.
Generate invoices in multiple currencies. Record historical rates for tax compliance and auditing.
Help travelers estimate costs in foreign currencies. Expense tracking with automatic conversion at the rate of the day.
Monitor forex rates for arbitrage opportunities. Trigger alerts when a currency pair crosses a threshold.
Most exchange rate APIs follow a simple pattern: request a base currency, get rates for all target currencies.
// Example: Convert 100 USD to EUR
const response = await fetch('https://api.frankfurter.dev/v1/latest?base=USD&symbols=EUR');
const data = await response.json();
const eurAmount = 100 * data.rates.EUR;
// Result: ~92 EUR (varies with current rate)Feature matrix across all 6 exchange rate APIs. Scroll horizontally on mobile.
| Provider | Free Tier | API Key | Currencies | Base Currencies | Historical | Update Frequency |
|---|---|---|---|---|---|---|
| Frankfurter FREE | Unlimited | No key needed | ~30 (ECB currencies) | Any | ✓ Since 1999 | Daily (16:00 CET) |
| ExchangeRate-API FREEMIUM | 1,500 req/mo | Required | 161 | Any | ✗ Paid only | Daily |
| Open Exchange Rates FREEMIUM | 1,000 req/mo | Required | 200+ | USD only (free) | ✗ Paid only | Hourly |
| FreeCurrencyAPI FREEMIUM | 5,000 req/mo | Required | 32 | Any | ✓ Since 1999 | Every 10 min |
| AbstractAPI FREEMIUM | 1,000 req/mo | Required | 60+ (fiat + crypto) | Any | ✓ Included | Every 60 sec |
| Frostbyte Crypto 200 CREDITS | 200 credits | No key needed | 50+ crypto | USD | ✗ Latest only | Real-time |
Detailed breakdown of each exchange rate API with pros, cons, and best use cases.
Free, open-source, ECB-powered exchange rates
Reliable rates API with 15+ years of operation
200+ currencies with community integrations
Generous free tier with historical data included
Fiat + crypto currencies in one API
Real-time crypto rates, no signup required
Two different worlds of currency data. Choose based on what you're building.
| Feature | Fiat APIs | Crypto APIs |
|---|---|---|
| Data source | Central banks (ECB, Fed) | Exchange aggregators (Binance, Coinbase) |
| Update frequency | Hourly to daily | Real-time (seconds) |
| Market hours | Weekdays only (forex market) | 24/7/365 |
| Volatility | Low (0.1-2% daily) | High (5-20% swings common) |
| Currencies | ~180 fiat currencies | Thousands of tokens |
| Typical free tier | 1,000-5,000 req/mo | 10,000-50,000 req/mo |
| Best for | E-commerce, invoicing, travel apps | Trading bots, DeFi, portfolio trackers |
Copy-paste examples for the most popular exchange rate APIs. All examples work with free tiers.
# Latest rates (USD base)
curl "https://api.frankfurter.dev/v1/latest?base=USD"
# Specific currencies only
curl "https://api.frankfurter.dev/v1/latest?base=USD&symbols=EUR,GBP,JPY"
# Historical rate for a specific date
curl "https://api.frankfurter.dev/v1/2025-01-15?base=USD&symbols=EUR"
# Time series (date range)
curl "https://api.frankfurter.dev/v1/2025-01-01..2025-01-31?base=USD&symbols=EUR"// Latest USD rates — no API key needed
const res = await fetch('https://api.frankfurter.dev/v1/latest?base=USD&symbols=EUR,GBP,JPY');
const data = await res.json();
console.log(`1 USD = ${data.rates.EUR} EUR`);
console.log(`1 USD = ${data.rates.GBP} GBP`);
console.log(`1 USD = ${data.rates.JPY} JPY`);
// Convert 250 USD to EUR
const eurAmount = 250 * data.rates.EUR;
console.log(`250 USD = ${eurAmount.toFixed(2)} EUR`);import requests
# Latest rates
r = requests.get('https://api.frankfurter.dev/v1/latest', params={
'base': 'USD',
'symbols': 'EUR,GBP,JPY'
})
data = r.json()
for currency, rate in data['rates'].items():
print(f"1 USD = {rate} {currency}")
# Historical rate
r = requests.get('https://api.frankfurter.dev/v1/2025-06-15', params={
'base': 'USD', 'symbols': 'EUR'
})
print(f"Historical: {r.json()}")# Latest rates for USD
curl "https://v6.exchangerate-api.com/v6/YOUR_KEY/latest/USD"
# Pair conversion: USD to EUR
curl "https://v6.exchangerate-api.com/v6/YOUR_KEY/pair/USD/EUR"
# Pair conversion with amount
curl "https://v6.exchangerate-api.com/v6/YOUR_KEY/pair/USD/EUR/250"const API_KEY = 'YOUR_KEY'; // Get free at exchangerate-api.com
// Latest rates
const res = await fetch(`https://v6.exchangerate-api.com/v6/${API_KEY}/latest/USD`);
const data = await res.json();
console.log(`1 USD = ${data.conversion_rates.EUR} EUR`);
console.log(`Last updated: ${data.time_last_update_utc}`);
// Direct pair conversion with amount
const pair = await fetch(`https://v6.exchangerate-api.com/v6/${API_KEY}/pair/USD/EUR/250`);
const result = await pair.json();
console.log(`250 USD = ${result.conversion_result} EUR`);import requests
API_KEY = 'YOUR_KEY' # Get free at exchangerate-api.com
# Latest rates
r = requests.get(f'https://v6.exchangerate-api.com/v6/{API_KEY}/latest/USD')
data = r.json()
print(f"1 USD = {data['conversion_rates']['EUR']} EUR")
print(f"1 USD = {data['conversion_rates']['GBP']} GBP")
# Pair conversion
r = requests.get(f'https://v6.exchangerate-api.com/v6/{API_KEY}/pair/USD/EUR/250')
print(f"250 USD = {r.json()['conversion_result']} EUR")# Get Bitcoin price in USD
curl "https://api-catalog-three.vercel.app/v1/crypto-feeds/api/price/BTC"
# Get Ethereum price
curl "https://api-catalog-three.vercel.app/v1/crypto-feeds/api/price/ETH"
# Get Solana price
curl "https://api-catalog-three.vercel.app/v1/crypto-feeds/api/price/SOL"// Get crypto prices — no API key needed
const btc = await fetch('https://api-catalog-three.vercel.app/v1/crypto-feeds/api/price/BTC');
const eth = await fetch('https://api-catalog-three.vercel.app/v1/crypto-feeds/api/price/ETH');
const btcData = await btc.json();
const ethData = await eth.json();
console.log(`BTC: $${parseFloat(btcData.price).toLocaleString()}`);
console.log(`ETH: $${parseFloat(ethData.price).toLocaleString()}`);
// Calculate portfolio value
const portfolio = { BTC: 0.5, ETH: 10 };
const total = (0.5 * parseFloat(btcData.price)) + (10 * parseFloat(ethData.price));
console.log(`Portfolio: $${total.toLocaleString()}`);import requests
# Get crypto prices — no API key needed
symbols = ['BTC', 'ETH', 'SOL', 'DOGE']
for symbol in symbols:
r = requests.get(f'https://api-catalog-three.vercel.app/v1/crypto-feeds/api/price/{symbol}')
data = r.json()
price = float(data['price'])
print(f"{symbol}: ${price:,.2f}")Try it now — converts using real exchange rates from Frankfurter (fiat) or Frostbyte (crypto).
What happens when you outgrow free tiers. Monthly cost for 10,000 requests/month:
Pick the right API based on your specific requirements.
Use Frankfurter. No signup, no API key, unlimited requests. Perfect for MVPs and weekend projects. Works client-side.
Use ExchangeRate-API. 161 currencies, pair conversion endpoint, 15 years of reliability. Scale to paid when needed ($9.99/mo).
Use Open Exchange Rates. 200+ currencies including exotic ones. Best community integrations. USD base on free tier.
Use Frankfurter for free historical data since 1999. Or FreeCurrencyAPI for 5,000 free req/mo with historical included.
Use AbstractAPI for unified fiat+crypto in one API. Or combine Frankfurter (fiat) + Frostbyte (crypto) for zero-signup coverage.
Use Frostbyte Crypto Prices. No signup, real-time data for 50+ cryptocurrencies. Simple REST API with instant responses.