Best Currency API for Python Developers (2026)
Python dominates in fintech, data science, and backend development. If your Python application needs exchange rate data — whether for a Django e-commerce store, a Flask microservice, a data pipeline, or a Jupyter notebook — you need a currency API that integrates cleanly with the Python ecosystem.
The problem: most currency APIs were not built with Python developers in mind. They offer no SDK, no type hints, and force you to write boilerplate HTTP code with requests or httpx for every call. Some have Python wrappers maintained by third parties that break when the API changes. Others cap their free tier at 100 requests per month, which is barely enough for local development.
This article compares the 6 most popular currency exchange rate APIs for Python in 2026 and shows you exactly how to integrate each one. Spoiler: AllRatesToday is the clear winner for Python developers, with an official PyPI package, real-time mid-market rates, and a free tier that does not require a credit card.
Side-by-Side Comparison
Here is an honest look at how the top 6 currency APIs stack up for Python developers:
| API | Python SDK | Free Tier | Real-Time | Historical Data |
|---|---|---|---|---|
| AllRatesToday | Official (PyPI) | Free tier, no CC | Yes (60s) | Yes |
| Open Exchange Rates | Community only | 1,000 req/mo | Hourly | Paid only |
| Fixer.io | No | 100 req/mo | No (daily) | Paid only |
| CurrencyAPI | Official | 300 req/mo | No (daily) | Paid only |
| Frankfurter | No | Unlimited | No (daily ECB) | Yes (ECB only) |
| ExchangeRate-API | No | 1,500 req/mo | No (daily) | Paid only |
Key takeaway: AllRatesToday is the only API on this list that offers an official Python SDK on PyPI, real-time rates updated every 60 seconds, historical data on the free tier, and no credit card requirement.
1. AllRatesToday — Best Overall for Python
AllRatesToday was built API-first with official SDKs for Python, JavaScript, and PHP. The Python package is published on PyPI, maintained by the AllRatesToday team, and provides a clean, Pythonic interface with proper type annotations.
Install the SDK
pip install allratestoday Or with a virtual environment (recommended):
python -m venv venv
source venv/bin/activate # Linux/macOS
pip install allratestoday Get a single exchange rate
from allratestoday import AllRatesToday
client = AllRatesToday("YOUR_API_KEY")
# Fetch real-time USD to EUR rate
rate = client.get_rate("USD", "EUR")
print(f"1 USD = {rate} EUR") Convert an amount
result = client.convert("USD", "EUR", 1000)
print(f"$1,000 = €{result['result']}")
print(f"Rate used: {result['rate']}")
print(f"Timestamp: {result['time']}") Fetch historical rates
history = client.get_historical_rates("USD", "EUR", "30d")
for point in history["rates"]:
print(f"{point['time']}: {point['rate']}") Using requests directly (no SDK)
If you prefer raw HTTP calls, the REST API is straightforward:
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://allratestoday.com/api/v1"
# Get USD to EUR rate
response = requests.get(
f"{BASE_URL}/rates",
params={"source": "USD", "target": "EUR"},
headers={"Authorization": f"Bearer {API_KEY}"}
)
data = response.json()
print(f"1 USD = {data['rate']} EUR")
print(f"Updated: {data['time']}") Batch rates for multiple currencies
import requests
API_KEY = "YOUR_API_KEY"
# Get all rates against USD
response = requests.get(
"https://allratestoday.com/api/v1/rates",
params={"source": "USD"},
headers={"Authorization": f"Bearer {API_KEY}"}
)
rates = response.json()
for currency, rate in rates["rates"].items():
print(f"USD/{currency}: {rate}") PyPI: allratestoday — View on GitHub
- Data source: Reuters/Refinitiv and interbank feeds
- Update frequency: Every 60 seconds (real-time)
- Currencies: 160+ including majors, minors, and exotics
- Rate type: Mid-market (no bank markup)
- Free tier: Available — no credit card required
- Authentication: Bearer token
2. Open Exchange Rates
Open Exchange Rates has been around since 2012 and is one of the more established currency APIs. However, it has no official Python SDK. You need to use requests or a third-party wrapper like openexchangerates (community maintained).
import requests
APP_ID = "YOUR_APP_ID"
response = requests.get(
"https://openexchangerates.org/api/latest.json",
params={"app_id": APP_ID, "base": "USD"}
)
data = response.json()
eur_rate = data["rates"]["EUR"]
print(f"1 USD = {eur_rate} EUR") - Free tier: 1,000 requests/month, USD base only
- Update frequency: Hourly on free, more frequent on paid
- Limitation: Free plan locked to USD as base currency
- Python SDK: Community only, not officially maintained
3. Fixer.io
Fixer was popular in the early days but has fallen behind. It was acquired by APILayer and now sits behind a paywall for most useful features. There is no Python SDK.
import requests
API_KEY = "YOUR_API_KEY"
# Note: free tier is HTTP only, not HTTPS
response = requests.get(
"http://data.fixer.io/api/latest",
params={
"access_key": API_KEY,
"base": "EUR", # Free tier: EUR base only
"symbols": "USD,GBP,JPY"
}
)
data = response.json()
print(data["rates"]) - Free tier: 100 requests/month, EUR base only
- Update frequency: Daily
- Limitation: Free plan uses HTTP (not HTTPS), locked to EUR base
- Python SDK: None
4. CurrencyAPI
CurrencyAPI (currencyapi.com) offers an official Python package, which puts it ahead of most competitors on developer experience. However, the free tier is very limited at 300 requests per month.
# pip install currencyapi
import currencyapi
client = currencyapi.Client("YOUR_API_KEY")
result = client.latest(
base_currency="USD",
currencies=["EUR", "GBP", "JPY"]
)
for code, info in result["data"].items():
print(f"USD/{code}: {info['value']}") - Free tier: 300 requests/month
- Update frequency: Daily on free tier
- Python SDK: Official (currencyapi on PyPI)
- Limitation: Historical data requires paid plan
5. Frankfurter
Frankfurter is a free, open-source API that wraps European Central Bank (ECB) data. It requires no API key, which makes it easy to get started. But it only covers about 30 currencies and updates once per business day when the ECB publishes rates at 16:00 CET.
import requests
# No API key needed
response = requests.get(
"https://api.frankfurter.app/latest",
params={"from": "USD", "to": "EUR,GBP,JPY"}
)
data = response.json()
print(f"Date: {data['date']}")
for currency, rate in data["rates"].items():
print(f"USD/{currency}: {rate}") - Free tier: Unlimited (no API key)
- Update frequency: Daily (ECB publishes at 16:00 CET)
- Currencies: ~30 (ECB reference rates only)
- Limitation: No exotic currencies, no real-time data, no weekends
- Python SDK: None
6. ExchangeRate-API
ExchangeRate-API offers a simple REST interface with no SDK. The free tier gives 1,500 requests per month but only provides daily rates.
import requests
API_KEY = "YOUR_API_KEY"
response = requests.get(
f"https://v6.exchangerate-api.com/v6/{API_KEY}/latest/USD"
)
data = response.json()
eur_rate = data["conversion_rates"]["EUR"]
print(f"1 USD = {eur_rate} EUR")
print(f"Last updated: {data['time_last_update_utc']}") - Free tier: 1,500 requests/month
- Update frequency: Daily
- Python SDK: None
- Limitation: No real-time rates, historical data requires paid plan
Using Exchange Rates in Pandas and Data Science
If you work with data in Python, you probably use pandas. Here is how to pull exchange rate data into a DataFrame using AllRatesToday:
import pandas as pd
from allratestoday import AllRatesToday
client = AllRatesToday("YOUR_API_KEY")
# Get historical rates for the past 90 days
history = client.get_historical_rates("USD", "EUR", "90d")
# Convert to DataFrame
df = pd.DataFrame(history["rates"])
df["time"] = pd.to_datetime(df["time"])
df.set_index("time", inplace=True)
# Basic statistics
print(df.describe())
print(f"\nAverage rate: {df['rate'].mean():.4f}")
print(f"Min rate: {df['rate'].min():.4f}")
print(f"Max rate: {df['rate'].max():.4f}")
print(f"Volatility (std): {df['rate'].std():.4f}") Plotting exchange rate trends
import matplotlib.pyplot as plt
df["rate"].plot(
figsize=(12, 6),
title="USD/EUR Exchange Rate - Last 90 Days",
ylabel="Rate",
color="#2ed06e",
linewidth=2
)
plt.tight_layout()
plt.savefig("usd_eur_trend.png", dpi=150)
plt.show() Django Integration Example
A common use case is displaying localized prices in a Django e-commerce application. Here is a reusable utility:
# pricing/exchange.py
from allratestoday import AllRatesToday
from django.conf import settings
from django.core.cache import cache
client = AllRatesToday(settings.ALLRATESTODAY_API_KEY)
def get_exchange_rate(source: str, target: str) -> float:
"""Get exchange rate with 5-minute cache."""
cache_key = f"fx_rate_{source}_{target}"
rate = cache.get(cache_key)
if rate is None:
rate = client.get_rate(source, target)
cache.set(cache_key, rate, timeout=300) # Cache for 5 minutes
return rate
def convert_price(amount: float, source: str, target: str) -> float:
"""Convert a price from one currency to another."""
rate = get_exchange_rate(source, target)
return round(amount * rate, 2) # In your Django view or template tag
from pricing.exchange import convert_price
# Convert $99.99 USD to EUR
price_eur = convert_price(99.99, "USD", "EUR")
print(f"€{price_eur}") Flask Microservice Example
Build a lightweight currency conversion endpoint with Flask:
from flask import Flask, request, jsonify
from allratestoday import AllRatesToday
app = Flask(__name__)
client = AllRatesToday("YOUR_API_KEY")
@app.route("/convert")
def convert():
source = request.args.get("from", "USD")
target = request.args.get("to", "EUR")
amount = float(request.args.get("amount", 1))
result = client.convert(source, target, amount)
return jsonify({
"from": source,
"to": target,
"amount": amount,
"converted": result["result"],
"rate": result["rate"],
"timestamp": result["time"]
})
if __name__ == "__main__":
app.run(debug=True) Test it:
curl "http://localhost:5000/convert?from=USD&to=EUR&amount=500" FastAPI Async Example
For async Python applications, you can use httpx with the AllRatesToday REST API:
from fastapi import FastAPI
import httpx
app = FastAPI()
API_KEY = "YOUR_API_KEY"
@app.get("/rate/{source}/{target}")
async def get_rate(source: str, target: str):
async with httpx.AsyncClient() as http:
response = await http.get(
"https://allratestoday.com/api/v1/rates",
params={"source": source, "target": target},
headers={"Authorization": f"Bearer {API_KEY}"}
)
data = response.json()
return {
"source": source,
"target": target,
"rate": data["rate"],
"time": data["time"]
} Why AllRatesToday Wins for Python
After comparing all six APIs, here is why AllRatesToday is the best choice for Python developers:
- Official PyPI package:
pip install allratestoday— maintained by the AllRatesToday team, not a community fork that may break or go unmaintained. - Real-time rates: Updated every 60 seconds from Reuters/Refinitiv and interbank feeds. Every other free API on this list provides daily rates at best.
- Mid-market rates: The true interbank rate with no markup. This is the rate used by financial professionals and displayed on platforms like Google Finance.
- 160+ currencies: Covers majors, minors, and exotic currency pairs. Frankfurter only offers ~30 ECB currencies.
- Historical data on free tier: Most competitors lock historical rates behind paid plans.
- No credit card required: Sign up and start building immediately. Fixer, CurrencyAPI, and Open Exchange Rates all require a credit card.
- Clean API design: Standard REST conventions, Bearer token auth, consistent JSON responses. Works perfectly with
requests,httpx, or the official SDK. - Works with pandas: The response format converts cleanly into DataFrames for data analysis and visualization.
Quick Reference
- Install:
pip install allratestoday - Get rates:
GET /api/v1/rates?source=USD&target=EUR - Historical:
GET /api/historical-rates?source=USD&target=EUR&from=2026-01-01&to=2026-05-24 - Auth:
Authorization: Bearer YOUR_API_KEY - PyPI: pypi.org/project/allratestoday
- GitHub: allratestoday/exchange-rates-api
Start Building with Python and Real-Time Rates
Get your free API key in 30 seconds. Install the SDK with pip install allratestoday and fetch real-time mid-market rates for 160+ currencies. Compare all options on our Exchange Rate API page.