Why Open Exchange Rates' USD-Only Base Currency Is a Problem
Open Exchange Rates' free plan locks you to a single base currency: USD. If you want to query rates with EUR, GBP, INR, or any other currency as the base, you have to upgrade to the Developer plan at $12/month — and even that has per-base limits on the cheaper tiers.
For a US-market product, this is fine. For everyone else, it's an unnecessary constraint that leaks into your codebase. This article explains why, what the workarounds actually cost, and why AllRatesToday lets you use any base currency on any plan, including the free tier.
What "USD-only base" means in practice
When you call Open Exchange Rates' free /latest.json endpoint, the response is always "1 USD equals X of each target":
{
"base": "USD",
"rates": {
"EUR": 0.9234,
"GBP": 0.7891,
"INR": 83.42,
...
}
} If your product thinks in EUR ("what's 1 EUR in USD and GBP?"), you can't ask that question directly. You have to ask for USD rates, then derive the EUR rates yourself:
const usdRates = await getOpenExchangeRates(); // base = USD
const eurToUsd = 1 / usdRates.EUR; // invert
const eurToGbp = usdRates.GBP / usdRates.EUR; // cross-rate
const eurToInr = usdRates.INR / usdRates.EUR; // cross-rate Three problems show up immediately:
- Rounding accumulates. Every inversion and cross-rate multiplication introduces floating-point error. Over thousands of conversions a day, the drift is measurable.
- Code clutter. Every place you'd write a single API call becomes three lines of math. Bugs hide in the transformation code.
- Mental model mismatch. Your product thinks in EUR; your API thinks in USD. Engineers constantly translate back and forth when reading logs, tests, and metrics.
The workarounds (and what each costs you)
Workaround 1: Do the cross-rate math. Cheapest option, zero infra cost, but adds code complexity and a rounding-bug surface area. Fine for low-stakes use cases; risky for payments.
Workaround 2: Upgrade to the Developer plan. $12/month ($144/year) buys you base-currency flexibility — but you're also paying for features you might not need (larger quotas, priority support). If base currency is the only reason you're upgrading, that's $144/year for what should be a free feature.
Workaround 3: Cache both directions. Fetch USD-based rates, then pre-compute EUR-based rates on the way into your cache. Works, but now you have two code paths and a cache invalidation concern.
How AllRatesToday handles it
Any base currency, any plan, including the free tier:
curl -X GET "https://allratestoday.com/api/v1/rates?source=EUR&target=USD,GBP,INR" \
-H "Authorization: Bearer YOUR_API_KEY" Response:
{
"source": "EUR",
"rates": {
"USD": 1.0830,
"GBP": 0.8546,
"INR": 90.34
},
"time": "2026-04-21T12:00:00Z"
} No inversion, no cross-rate math, no upgrade required.
Who this actually affects
Most products outside the US hit this wall:
- European SaaS billing in EUR, showing prices in GBP and CHF.
- Indian fintech with INR as the home currency, quoting cross-border remittances.
- Southeast Asian marketplaces with SGD or MYR as the base, displaying prices in regional currencies.
- LATAM payment platforms with BRL, MXN, or ARS as the base.
- Canadian and Australian products where CAD or AUD is the natural home currency.
Any of these use cases require either paying for Open Exchange Rates or writing cross-rate glue code. With AllRatesToday, you skip both.
Multi-base queries in one call
AllRatesToday also supports multi-target queries with any base. One request gives you EUR against every currency you care about:
GET /api/v1/rates?source=EUR Open Exchange Rates' equivalent requires either upgrading or making one request per base — each of which counts against your quota.
The bigger picture
USD-only base on the free tier is an artifact of Open Exchange Rates' original design from the early 2010s, when USD was the default reference for almost every web app. In 2026, that assumption is showing its age. Cross-border commerce, EU and UK fintech, Indian SaaS, and Southeast Asian marketplaces all benefit from native multi-base support.
AllRatesToday was built with this in mind: every endpoint accepts any supported currency as the source, and there's no plan-gated "base currency" feature.
Done paying for a feature that should be free?
Any base currency, real-time rates, 160+ currencies, no credit card.
Get your free API key