This documents the new v2 API. For v1 docs, go here.

Frankfurter tracks daily exchange rates from 20+ central banks and official institutions, covering 150 currencies. The API requires no keys and has no usage limits.

The public API lives at api.frankfurter.dev. You can also self-host.

Rates

Fetch the latest exchange rates.

/* /v2/rates */
[
  {
    "date": "2024-11-25",
    "base": "EUR",
    "quote": "AUD",
    "rate": 1.6111
  },
  {
    "date": "2024-11-25",
    "base": "EUR",
    "quote": "BGN",
    "rate": 1.9558
  },
  "..."
]

Change the base currency with base. Filter target currencies with quote.

/* /v2/rates?base=USD&quotes=EUR,GBP */
[
  {
    "date": "2024-11-25",
    "base": "USD",
    "quote": "EUR",
    "rate": 0.95294
  },
  {
    "date": "2024-11-25",
    "base": "USD",
    "quote": "GBP",
    "rate": 0.79538
  }
]

Historical Rates

Look up rates for a specific date.

/* /v2/rates?date=1999-01-04 */
[
  {
    "date": "1999-01-04",
    "base": "EUR",
    "quote": "GBP",
    "rate": 0.7111
  },
  {
    "date": "1999-01-04",
    "base": "EUR",
    "quote": "JPY",
    "rate": 133.73
  },
  "..."
]

Time Series

Fetch rates over a period with from and to.

/* /v2/rates?from=2024-01-01&to=2024-01-05&quotes=USD */
[
  {
    "date": "2024-01-02",
    "base": "EUR",
    "quote": "USD",
    "rate": 1.0956
  },
  {
    "date": "2024-01-03",
    "base": "EUR",
    "quote": "USD",
    "rate": 1.0919
  },
  "..."
]

Tip: Narrowing down currencies keeps responses small and speeds things up.

Grouping

Downsample a time series with group.

/* /v2/rates?from=2024-01-01&group=month */
[
  {
    "date": "2024-01-01",
    "base": "EUR",
    "quote": "AUD",
    "rate": 1.6263
  },
  {
    "date": "2024-01-01",
    "base": "EUR",
    "quote": "BGN",
    "rate": 1.9558
  },
  "..."
]

Filtering by Provider

Scope to specific providers with providers.

/* /v2/rates?providers=ECB */
[
  {
    "date": "2024-11-25",
    "base": "EUR",
    "quote": "AUD",
    "rate": 1.6111
  },
  {
    "date": "2024-11-25",
    "base": "EUR",
    "quote": "BGN",
    "rate": 1.9558
  },
  "..."
]

By default, rates are blended across all providers. Use providers to retrieve rates from a specific source.

Currencies

Get available currencies with provider coverage.

/* /v2/currencies */
[
  {
    "iso_code": "AUD",
    "iso_numeric": "036",
    "name": "Australian Dollar",
    "symbol": "$",
    "...": "..."
  },
  {
    "iso_code": "BGN",
    "iso_numeric": "975",
    "name": "Bulgarian Lev",
    "symbol": "лв.",
    "...": "..."
  },
  "..."
]

Providers

List the data sources behind the API.

/* /v2/providers */
[
  {
    "key": "BOC",
    "name": "Bank of Canada",
    "description": "Daily exchange rates for...",
    "...": "..."
  },
  {
    "key": "ECB",
    "name": "European Central Bank",
    "description": "Reference rates for...",
    "...": "..."
  },
  "..."
]

Conversion

Fetch the rate and convert in your own code.

function convert(from, to, amount) {
  fetch(`https://api.frankfurter.dev/v2/rates?base=${from}&quotes=${to}`)
    .then((resp) => resp.json())
    .then((data) => {
      const convertedAmount = (amount * data[0].rate).toFixed(2);
      alert(`${amount} ${from} = ${convertedAmount} ${to}`);
    });
  }

convert("EUR", "USD", 10);

Click or tap the snippet to run it.

Self-Hosting

You can self-host with Docker. See the deploy guide for production setup and API key configuration.

FAQ

Is the API free for commercial use?
Yes, absolutely.
Does the API have any call limits?
There are no limits. For high-volume use, consider caching responses or self-hosting.
Is the v1 API being retired?
No. The v1 API will continue to work. See the v1 documentation.
What is the privacy policy of the API?
The API itself does not collect personal data. However, the public app runs behind Cloudflare for performance, and Cloudflare will collect some basic information for analytics. This does not apply if you run the API privately.
What should I do if a currency is missing?
If you notice a currency missing from our data, please open an issue and include a suggested source with the missing data. We're looking for non-commercial sources that publish current and historical daily rates at the end of each working day.
How accurate are the rates?
It depends on your use case. If you need official reference rates for reporting or compliance, filter by a specific provider. The numbers will match what that institution publishes. If you're converting prices for display, say, localizing an e-commerce site, the default blended rates work well. They're drawn from multiple sources and are accurate for practical use, though the last decimal places may shift slightly as new data comes in.
Why is it called Frankfurter?
Frankfurt is home to the European Central Bank, the original data source of this project.