認証と制限
データエンドポイントは匿名で試せます。IPごとに毎分10リクエスト、毎時100リクエストです。キーを付けるとアカウントの月間枠が使われます。 Freeの価格は15分遅れです(X-Price-Delay-Seconds: 900ヘッダー)。
Authorization: Bearer YOUR_KEYX-RateLimit-Remaining: 9999X-RateLimit-Reset: 1788220800鮮度を説明するフィールド
sourceはデータ種別、market_sessionは市場状態、data_updated_atはレスポンスに寄与した最も古い観測の時刻です。3つとも保存してください。
エンドポイント
| GET /v1/latest[/{BASE}] | 現在のレート。全通貨またはsymbolsで絞り込み。 |
| GET /v1/{YYYY-MM-DD}[/{BASE}] | 指定日とベース通貨の履歴スナップショット。 |
| GET /v1/convert/{FROM}/{TO}[/{AMOUNT}] · POST /v1/convert | 金額換算。単発GETと一括POST。 |
| GET /v1/rate/{slug} | slugで1通貨ペアを取得するフラットなレスポンス。 |
| GET /v1/range | ページングとダウンロードに対応した日次系列。 |
| GET /v1/currencies | 対応通貨一覧。パラメーターなし。 |
| GET /v1/account | アカウント、プラン、有効キー、当月利用量。 |
| GET /v1/indices/{index_slug} · GET /v1/indices/{index_slug}/timeseries | USD指数の最新値と履歴系列。 |
イントラデイ系列と対象通貨
/v1/timeseries は1m、5m、15m、1h、4hと日次参照値1dに対応します。2hはありません。USDを含まないSGDクロスは4hの対象外ですが、USD/SGDと逆方向は対象です。市場データの収集開始日は2026-09-14です。1mは30日間保持し、それより大きい間隔には定期的な削除期限がありません。保持期間と実際に蓄積した履歴の長さは異なります。 1mから1hのイントラデイ対応範囲は221のユニークペアで、USDペア143組とクロス78組です。
履歴クロスは同じUTC区間にある実際の終値観測を使い、時刻差は最大5秒です。effective_atは古い方の観測時刻です。欠損は補完せず、進行中の区間は変わる場合があります。1dは全カタログの日次参照値です。表は通貨ペアを重複せず数え、両方向に対応します。
| interval | 通貨ペア数 |
|---|---|
1m | 221 |
5m | 221 |
15m | 221 |
1h | 221 |
4h | 209 |
1d | 10296 |
curl "https://api.exchangerate.dev/v1/timeseries?base=EUR&symbols=JPY&interval=15m&from=2026-09-14T12:00:00Z&to=2026-09-14T13:00:00Z" \ -H "Authorization: Bearer YOUR_API_KEY"対象期間に観測がない場合はHTTP 200でdata: []、has_more: false、next_cursor: nullを返します。不明な間隔はunsupported_interval、対象外ペアはunsupported_pair_intervalとrejected_pairsを返します(HTTP 400)。対象外を含むリクエストは全体を拒否します。
ライブWebSocket
wss://api.exchangerate.dev/v1/streamへ接続し、10秒以内にauthを送信します。APIキーはサーバーに保存し、URLや公開JavaScriptに含めないでください。匿名接続は非対応です。authenticatedの後にsubscribeを送ります。対象通貨は下記のとおりです。クロスには両方の最新観測が新鮮で、時刻差が最大5秒であることが必要です。unavailableやstaleになる場合があります。受け付けた接続ごとに月間クォータを1回消費します。
表は新規アカウントの上限。既存アカウントは旧Basic 3 × 25または旧Pro 10 × 100(接続数 × 接続あたりの通貨ペア数)を維持します。実際の上限はauthenticatedメッセージに表示されます。
AUD, CAD, CHF, EUR, GBP, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR
| プラン | 同時接続数 | 接続あたりのペア数 |
|---|---|---|
| Free | 0 | 0 |
| Basic | 0 | 0 |
| Plus | 1 | 10 |
| Pro | 3 | 100 |
{"action":"auth","api_key":"YOUR_KEY"}{"action":"subscribe","base":"EUR","symbols":["USD","JPY"]}エラー
REST: すべて{ result: "error", code, message }形式です。429にはRetry-Afterが付き、取得失敗時にモック値へ切り替わることはありません。 HTTP 403のplan_gatedにはtier、intervalが含まれ、履歴期間の制限ではhistory_days、earliest_allowedも返します。アップグレードでリクエストが可能になる場合はupgrade_plans、upgrade_offers(plan、loses)、upgrade_urlを返します。
{ "result": "error", "code": "missing_parameter", "message": "required parameter missing: symbols"}{ "result": "error", "code": "plan_gated", "message": "The 15m interval is not included in your plan.", "tier": "plus_2026", "interval": "15m", "upgrade_plans": ["pro_2026"], "upgrade_offers": [{ "plan": "pro_2026", "loses": [] }], "upgrade_url": "https://exchangerate.dev/pricing?plan=pro_2026&source=api&reason=plan_gated"}curl -fsS --max-time 10 "https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP"from urllib.request import Request, urlopenimport json# Identify your application explicitly when calling the API.request = Request("https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP", headers={"User-Agent": "exchangerate-docs/1.0"})with urlopen(request, timeout=10) as response: data = json.load(response)print(data["rates"]["EUR"])const response = await fetch("https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP", { signal: AbortSignal.timeout(10_000),});if (!response.ok) throw new Error(`HTTP ${response.status}`);const data = await response.json();console.log(data.rates.EUR);統合ガイド: Python · JavaScript / Node.js · Google Sheets · Excel · Go · Swift · Zapier