LearnComparison

How to compare free currency APIs in 2026

A free FX data source is only useful when its limits fit the job. Compare quota, update timing, freshness metadata, history, conversion support, and the tools your application actually needs.

1 Oct 2026 · 6 min read

Most free exchange-rate APIs look similar on the surface: JSON, a bearer token, and a list of currencies. The useful differences show up when the source updates, when the request reaches a limit, and when your code needs to know how old a value is. Choose the source that fits the job.

  • Free-tier quotas vary widely. Check both the monthly allowance and the per-minute limit before you put a scheduled job on top of one.
  • Intraday freshness is the sharpest differentiator. ECB-only sources publish one fix per business day, the market keeps moving after 16:00 CET but the rate does not.
  • source and market_session in every response tell your code what it is actually looking at, without guessing from the clock.
  • Plus and Pro daily history can begin in 1999 where observations exist; use /v1/{date}/{base} for one day.
  • A built-in /v1/convert endpoint and an MCP server at /v1/mcp mean less glue code for common tasks.

Why dimensions beat rankings

A ranked list of APIs tells you which one the author preferred on the day they wrote it. A dimension-by-dimension breakdown tells you which one fits your project. A dashboard that only consumes once-daily reference data has different needs from a travel app that quotes prices through the day.

The six dimensions below cover the questions that come up in almost every FX integration. Work through them in order and most projects will have a clear answer before they finish.

Dimension 1: free monthly quota and rate limit

Quota determines whether you can prototype and run a small production workload for free, or whether you hit a wall inside a week. Rate limit determines whether you can burst calls in a batch job without writing retry logic from day one.

The ECB publishes its reference rates at no cost and with no API quota. The trade-off is that its feed is XML rather than a developer JSON API, and it updates once per business day.

A third keyless category is worth knowing apart from either of those: community-maintained, CDN-hosted static-JSON projects such as fawazahmed0/exchange-api. There is no server answering your request at all, just versioned JSON files served from jsDelivr or Cloudflare Pages, updated daily, covering 200+ currencies (including common cryptocurrencies) under a CC0 public-domain license, with no key and no enforced rate limit. The trade-off is architectural: no source or freshness metadata, no conversion endpoint, no live intraday updates, and no single party accountable if a mirror goes down, the project's own docs recommend wiring a fallback between its two CDN hosts for exactly that reason.

For a keyless starting point, exchangerate.dev accepts anonymous calls capped per IP address. A free key, available at /signup with no card, raises that to 5,000 calls a month and 10 requests a minute.

Count calls before you commit

A page that fetches a rate on every load at 10,000 monthly visits consumes 10,000 calls. A cron job checking 20 pairs separately every 5 minutes makes 5,760 calls a day; batching those pairs into one symbols request cuts that to 288. Know your number before you pick a tier.

Dimension 2: intraday freshness

This is the dimension most developers do not think about until something breaks. The ECB reference fix is published around 16:00 CET each business day, after that, the market keeps moving but the fix does not update until the next business day. Any API sourced only from that fix will return the prior day's rate for the rest of the afternoon, overnight, and through the weekend.

For a pipeline that only ever consumes once-daily closing rates, that is fine. For a consumer-facing app, an e-commerce site, or any code that expects "latest" to mean the current market, you need to know whether the rate reflects intraday movement or a fix from up to 24 hours ago.

exchangerate.dev has a live source that updates approximately every 60 seconds through the trading week. When a pair comes from that source, market_session tells you the current session state (open, weekend, etc.) and data_updated_at confirms exactly when the rate last moved.

Dimension 3: freshness metadata

A rate is a number. Knowing whether that number is from a spot aggregation three minutes ago or a reference fix from yesterday morning changes what you can responsibly do with it.

Most APIs return a timestamp. That tells you when the response was built, not when the underlying data last moved. exchangerate.dev returns two fields that together answer the real question:

  • source: live, ecb_daily, market_daily (stored daily market-feed close for currencies without an ECB fix).
  • market_session: open, weekend, or interbank_closed; tells you the state of the interbank trading week.
  • data_updated_at: when the underlying rate was last written, separate from timestamp (when the response was built).
  • is_forward_filled: on history and range responses, true means no rate was published that day and the prior value was carried forward.

A caching layer that checks data_updated_at instead of timestamp avoids serving stale data to users while also avoiding unnecessary upstream calls.

Dimension 4: history depth

Daily history determines whether you can backfill a dataset, build a chart of the past year, or run a regression over a decade of rates. Some free APIs cap history at 90 days. Others gate deeper history behind a paid tier.

Free includes the last 30 days of daily history. Plus and Pro reach 1999 where available; pair and source start dates vary. With a Plus or Pro key in the Authorization header, /v1/2024-01-15/USD returns one day; /v1/range with start_date and end_date returns an available series. ECB fixes and stored daily market-feed closes underlie those records; check pair coverage first.

Dimension 5: a built-in conversion endpoint

Many APIs return a table of rates and leave the multiplication to you. That is fine for a single pair, but a batch conversion job or a checkout flow converting a cart total needs a conversion primitive, not a math helper.

GET /v1/convert/USD/EUR/100 returns rate, converted, and derived in one call. A POST /v1/convert endpoint handles batch conversions in a single request. Triangulated crosses, pairs not quoted directly against each other, are handled server-side.

Dimension 6: agent and MCP support

LLM agents and AI assistants need structured tool definitions to call an API reliably. A raw REST API requires you to write that glue yourself; an MCP server ships the tool definitions with the API.

exchangerate.dev runs a Model Context Protocol server at https://api.exchangerate.dev/v1/mcp (server name exchangerate-dev). Tools include start_checkout, list_currencies, get_rate, get_usd_index, convert, get_range, and search_docs (FAQ search). Checkout requires explicit human confirmation. Tools share the same monthly quota and per-minute limit as the REST API, so there is no separate billing to track.

Six dimensions side by side

DimensionECB reference feedexchangerate.dev (free tier)
Free monthly quotaNo API quota on the public ECB feed5,000 calls/month, 10 req/min
Intraday freshnessPrior ECB fix returned until next business-day fix (~16:00 CET)Live source updates ~60s through the trading week
Freshness metadataTimestamp onlysource, market_session, data_updated_at
History depthPublished ECB series to ~1999 in XMLFree: last 30 days of daily history
Conversion endpointNot provided; arithmetic is caller's responsibility/v1/convert/{from}/{to}/{amount} + batch POST
Agent / MCP supportNo native MCP serverMCP server at /v1/mcp with MCP tools
Rates are indicative in every case

Whether the source is the ECB or a live aggregation, all publicly available FX rates are reference figures for analytics and display. They are not dealing quotes and should not be used to settle a trade.

Picking the right fit

If your project only needs a daily reference rate and can parse the ECB XML feed, the public ECB series may be sufficient. Handle its business-day publication schedule and missing dates explicitly.

If you need intraday freshness (rates that move through the day, not just at the ECB fix), want source and market_session in the response, need history past what is easily available from the ECB feed, or are building an LLM agent that calls FX tools, exchangerate.dev is designed for those cases. The free tier does not require a card and the MCP server is included.

The right API is the one whose limitations match your use case, not the one with the longest feature list.

Questions

What is the most important difference between free exchange-rate APIs?

Intraday freshness and freshness metadata are the sharpest practical differences. APIs sourced only from the ECB reference fix stop updating after the ~16:00 CET publication each business day, the market keeps moving but the API does not. They also do not carry metadata fields that tell your code what the data class is. If your project needs rates that reflect intraday movement, or needs to distinguish live spot from a reference fix, those gaps matter.

How many free calls does exchangerate.dev give per month?

The free tier gives 5,000 calls a month at 10 requests a minute. No card is required. Anonymous calls without a key work too, capped per IP address, but for anything past a quick test a free key is the better choice.

How far back does the historical data go?

Plus and Pro daily history can begin in 1999; Free includes 30 days and Basic one year. You can fetch one day with `/v1/{date}/{base}` or an available range with `/v1/range`. On a day without a new publication, such as a weekend, `is_forward_filled` can show that a prior value was carried forward; a pair without coverage returns missing data rather than a fabricated rate.

Can I use the exchange-rate API with an AI agent or LLM?

Yes. A Model Context Protocol server is mounted at `https://api.exchangerate.dev/v1/mcp`. Tools include `start_checkout`, `list_currencies`, `get_rate`, `get_usd_index`, `convert`, `get_range`, and `search_docs`. Checkout requires explicit human confirmation. The tools use the same API key and quota as the REST endpoints, so there is no separate account to manage.

What about GitHub-hosted, no-key APIs like fawazahmed0/exchange-api?

Those are a different category entirely: static JSON files served from a CDN (jsDelivr or Cloudflare Pages), not a live API. They are genuinely free with no rate limit, cover 200+ currencies including common cryptocurrencies, and update daily. What they do not provide is freshness metadata, a conversion endpoint, live intraday rates, or MCP/agent support. They are a reasonable choice for a low-stakes daily lookup where a CDN dependency is acceptable; for intraday freshness, structured metadata, or agent tooling, check exchangerate.dev’s supported pair coverage.

Keep reading

Start with a free API key

5,000 requests a month on the free plan. No credit card.

Get a free key