Introduction

exchangerate.dev is a REST API for indicative foreign exchange rates — live 24/7 including weekends, with source, market_session, and honest freshness on every response. Start with a free key, no credit card required.

Indicative rates — not for settlement
Rates are indicative only — not for settlement, regulated trading, or as a “source of record.” The market_session and source fields tell you exactly what you are looking at on every call.

Quickstart

Sign up for a free key, then make your first call. Every endpoint accepts your key as a header.

bash · curl
# 1. Get a key at exchangerate.dev/signup (free, no card)
# 2. Call /v1/latest — base=USD, all symbols
curl https://api.exchangerate.dev/v1/latest/USD \
  -H "Authorization: Bearer YOUR_KEY"

# Response
{
  "result": "success",
  "base": "USD",
  "source": "live",
  "market_session": "open",
  "timestamp": "2026-06-16T14:02:11Z",
  "data_updated_at": "2026-06-16T14:02:00Z",
  "rates": { "EUR": 0.92450, "GBP": 0.78910, "JPY": 157.32 }
}

Authentication

Pass your key in the Authorization: Bearer header on every request. Keys are tied to a tier; quota is metered per calendar month and resets at 00:00 UTC on the 1st.

NameTypeDescription
AuthorizationheaderBearer <your-key>. Required on all /v1/* endpoints.
X-RateLimit-RemainingresponseCalls remaining in the current window.
X-RateLimit-ResetresponseUnix timestamp when the window resets.

Rate limits

Limits are per key, per calendar month. On 429 the response includes Retry-After.

Free50,000/monthDaily reference (ECB/FRED)
Basic100,000/monthWeekend-fresh live$9/mo
Pro1,000,000/monthLive rates$39/mo

The source field

Every response carries a source that tells you the quality of the rate. This is not a vendor name — it is a freshness class.

  • live — intraday spot consensus, updates on short intervals including weekends
  • ecb_daily — ECB reference fix, published each business day ~16:00 CET
  • fred_daily — FRED reference rate (NZD and others not on ECB)

The market_session field

The market_session field tells you whether the market is open and trading or in a reduced-liquidity period.

  • open — major FX session active (Sydney / Tokyo / London / New York)
  • weekend — Saturday/Sunday; live rates continue from spot consensus
  • interbank_closed — post-Friday close before Sydney open

Indicative rates

All rates are indicative — from aggregated market data + public reference rates, ±5–15 bps. They are not bank-grade, not for settlement, and carry no SLA at v1. The notice field on ECB/FRED responses makes this explicit.

Derived crosses

Pairs not directly quoted (e.g. EUR/GBP derived from EUR/USD and GBP/USD) are triangulated. Derived rates are flagged in derived_symbols and carry a derivation_bps_max field. Filter them out with ?source=native.

GET /v1/latest

Latest rates for all supported pairs, or a filtered subset via ?symbols=.

curl
GET /v1/latest[/{BASE}]

# Examples
curl /v1/latest/USD                         # base=USD (default)
curl /v1/latest/EUR?symbols=USD,GBP,JPY     # EUR base, 3 symbols
NameTypeDescription
basestringBase currency (default USD). Also accepts path: /v1/latest/EUR.
symbolsstringComma-separated list to filter rates (e.g. EUR,GBP). Omit for all.

GET /v1/{YYYY-MM-DD}

Historical snapshot — returns the reference rate as published on that date. Dates back to 1999-01-04 (ECB series start).

curl
GET /v1/2024-01-15/EUR?symbols=USD,GBP

# On a weekend or holiday: returns the most recent published fix
# is_forward_filled: true will be set in the response

GET /v1/convert

Single or batch currency conversion. The POST form accepts multiple pairs in one call.

curl
# Single
GET /v1/convert/USD/EUR/100

# Batch POST (counts as N calls)
POST /v1/convert
{
  "from": "USD",
  "pairs": [["EUR", 100], ["GBP", 50], ["JPY", 1000]]
}

GET /v1/range

Daily time-series for a date window. Capped at 366 rows/page; keyset pagination for longer windows.

curl
GET /v1/range?base=USD&symbols=EUR,GBP&start_date=2024-01-01&end_date=2024-06-30

# Response includes next_cursor + has_more for pagination

GET /v1/currencies

Full list of supported pairs with name, type, decimal precision, and derived flag.

curl
GET /v1/currencies              # all
GET /v1/currencies?type=fiat    # fiat only

GET /v1/account

Your current quota, tier, and monthly reset timestamp.

response
{
  "tier": "pro",
  "calls_this_month": 142820,
  "limit_this_month": 5000000,
  "reset_at": "2026-07-01T00:00:00Z"
}

Python SDK

python
pip install exchangerate-dev

import exchangerate
client = exchangerate.Client(api_key="YOUR_KEY")
rates = client.latest(base="USD", symbols=["EUR", "GBP"])
print(rates.rates)  # {"EUR": 0.9245, "GBP": 0.7891}

Node SDK

npm
npm install @exchangerate-dev/sdk

import { ExchangeRateClient } from "@exchangerate-dev/sdk";
const client = new ExchangeRateClient({ apiKey: "YOUR_KEY" });
const rates = await client.latest({ base: "USD", symbols: ["EUR", "GBP"] });

MCP server

Use exchangerate.dev as a tool in any MCP-compatible AI agent.

bash
npx @exchangerate-dev/mcp

# Or add to your MCP config:
{
  "mcpServers": {
    "exchangerate": {
      "command": "npx",
      "args": ["@exchangerate-dev/mcp"],
      "env": { "EXCHANGERATE_API_KEY": "YOUR_KEY" }
    }
  }
}