---
title: "exchangeratesapi.io Alternative: Drop-in Replacement, Same JSON, Free"
description: "exchangeratesapi.io stopped being free in 2021. Point your code at allratestoday.com/api/compat/exchangeratesapi/ and keep the same {base, date, rates} JSON, same query parameters, no key for latest rates."
canonical: https://allratestoday.com/migrate/exchangeratesapi/
source: AllRatesToday (https://allratestoday.com/) — Markdown mirror of the page above; index of all pages at https://allratestoday.com/llms.txt
generated: 2026-10-25T19:01:44.866Z
---

# exchangeratesapi.io Alternative: Drop-in Replacement, Same JSON, Free

exchangeratesapi.io stopped being free in 2021. Point your code at allratestoday.com/api/compat/exchangeratesapi/ and keep the same {base, date, rates} JSON, same query parameters, no key for latest rates.

By [Madhushan](https://allratestoday.com/authors/madhushan/), Founder & Lead Developer

# Migrate from exchangeratesapi.io in one line

exchangeratesapi.io started in 2018 as a free, keyless JSON wrapper around the European Central Bank's daily reference rates and became the default in thousands of tutorials. In 2021 the domain was sold to apilayer, which moved every request behind an `access_key`, restricted the free plan to 100 calls a month, dropped HTTPS and base-currency switching from it, and later changed the path to `/v1/`. Code written against the original API simply stopped working.

  **The fix is a hostname change.** Same path, same query parameters, same JSON fields. Latest, dated and range lookups need no key at all.

## Before and after

```
# before
curl "https://api.exchangeratesapi.io/latest?base=USD&symbols=GBP,JPY"

# after
curl "https://allratestoday.com/api/compat/exchangeratesapi/latest?base=USD&symbols=GBP,JPY"
```

Response:

```
{"base":"USD","date":"2026-09-12","rates":{"GBP":0.7377,"JPY":146.91}}
```

Python:

```
import requests

# before
# r = requests.get("https://api.exchangeratesapi.io/latest?base=USD&symbols=GBP,JPY").json()
# after
r = requests.get("https://allratestoday.com/api/compat/exchangeratesapi/latest?base=USD&symbols=GBP,JPY").json()
print(r["date"], r["rates"])
```

JavaScript:

```
// before
// const r = await fetch("https://api.exchangeratesapi.io/latest?base=USD&symbols=GBP,JPY").then(x => x.json());
// after
const r = await fetch("https://allratestoday.com/api/compat/exchangeratesapi/latest?base=USD&symbols=GBP,JPY").then(x => x.json());
console.log(r.date, r.rates);
```

## Endpoints

| Endpoint | Returns | Key |
| --- | --- | --- |
| `/api/compat/exchangeratesapi/latest?base=USD&symbols=GBP,JPY` | Latest ECB table, any base, optional symbols | No key |
| `/api/compat/exchangeratesapi/2026-01-15?base=USD` | Table in force on a date (weekends roll back to the last fixing) | No key |
| `/api/compat/exchangeratesapi/history?start_at=2026-01-01&end_at=2026-03-31&base=USD&symbols=GBP` | One table per published date (up to 366 days per call) | No key |

None of these needs a key. Rates come from the European Central Bank's daily reference table, the same source exchangeratesapi.io used; a non-EUR base is a cross-rate inside that table. Every response also carries the ECB publication date, so the number is citable.

## When you need more than ECB rates

- **Real-time mid-market rates** for 160+ currencies, refreshed every 60 seconds: [the main exchange rate API](https://allratestoday.com/exchange-rate-api/) on the same key.
- **Official rates from [122 central banks and tax authorities](https://allratestoday.com/central-bank-rates-api/institutions/)**, not only the ECB: the [central bank rates API](https://allratestoday.com/central-bank-rates-api/), with the latest table of every source keyless.
- **The full ECB archive as files** on [Hugging Face](https://huggingface.co/datasets/AllRatesToday/central-bank-exchange-rates) and [GitHub](https://github.com/AllRates-Today/central-bank-exchange-rates), refreshed daily, if you would rather not call an API at all.

## Frequently asked questions

### Is the exchangeratesapi.io compatible endpoint really free?

Yes, for everything: latest, dated and range lookups are all keyless, with no quota, CORS enabled and edge-cached. The data is the ECB's public reference table, so it is free for any use, commercial included. Public displays must carry a visible attribution link to allratestoday.com.

### Are the numbers the same?

Yes. Both serve the European Central Bank's daily reference rates. Cross-rates for a non-EUR base are computed inside the same ECB table, exactly as the original API did. Rates change once per business day at about 16:00 CET.

### What is different?

Two additive fields, source and attribution, appear at the top level; every original field is unchanged. HTTPS and any base currency work on the keyless tier. Date ranges are limited to a year per request.

### Can I get real-time market rates too?

Yes, on the same key. GET /api/v1/rates returns mid-market rates for 160+ currencies refreshed every 60 seconds; the compatible endpoints stay ECB-only so existing code keeps its semantics.

## Fix it now

Latest rates, dates and ranges work with no key. A free key adds real-time rates for 160+ currencies.

 [Get a free API key](https://allratestoday.com/register) [All migration guides](https://allratestoday.com/migrate/)

## Related

  [exchangeratesapi.io vs AllRatesTodayFull feature comparison](https://allratestoday.com/compare/exchangeratesapi-io-alternative/) [Migration guidesEvery dead free API, one line each](https://allratestoday.com/migrate/) [Best exchange rate APIs 202610 providers compared](https://allratestoday.com/best/best-exchange-rate-api/) [Open APIKeyless official rates, attribution terms](https://allratestoday.com/open-api/)
