Guide/Stack Overflow発の為替レートAPI質問

Stack Overflowで聞かれる為替レートAPIのトラブルシューティングに答える

開発者がStack OverflowでぶつかるFX APIのエラーを解決する:401認証エラー、429レート制限、ブラウザからのCORSエラー、週末に古く見えるレート、金額の換算、過去・時系列データの取得。

MMexchangerate.dev·Jun 30, 2026·6分で読了

統合が壊れると、開発者はエラーをそのままStack Overflowに貼り付ける。為替レートAPIについてはほぼ毎回同じ質問が出る——キーが拒否される、レート制限の壁にぶつかる、CORSエラーが出る、週末にレートが古く見える、といったものだ。ここでは、exchangerate.devを実例として直接的な解決策を示す。すべてのスニペットはhttps://api.exchangerate.devに対する実際の呼び出しである。

Key points
401はほぼ常にBearer 接頭辞の欠落か、コピー&ペーストで紛れ込んだ改行を含むキーが原因である。
X-RateLimit-Remainingを読んでバックオフする。無料プランは毎分12リクエストである。
フロントエンドのJSからキー付きでAPIを呼び出してはならない——バックエンド経由でプロキシする。
すべてのレスポンスにあるsourcemarket_sessionが、レートが動いていない正確な理由を教えてくれる。

ベースURLはhttps://api.exchangerate.devである。最初の呼び出しはIPごとの上限付きで匿名でも動作するため、無料キーに登録する前にこれらのどれでも再現できる。

401 Unauthorized — キーが拒否される

キーはベアラートークンとしてAuthorizationヘッダーに設定し、末尾にスペースを伴うBearerという単語が必要である。キーにはexr_live_という接頭辞が付く。

curl · authenticatedcopy
curl https://api.exchangerate.dev/v1/latest/USD \
  -H "Authorization: Bearer exr_live_YOUR_KEY"

401のよくある原因: Bearer 接頭辞が抜けている、コピー&ペーストでキーに余分な改行や引用符が紛れ込んでいる、あるいはキーを保持する環境変数が読み込まれていない、のいずれかである。Authorizationを設定できないプラットフォームは、代わりにX-API-Keyヘッダーでキーを送信できる。

429 Too Many Requests — レート制限への対処

すべてのレスポンスにX-RateLimit-Remainingが含まれる。ゼロになるのを待たず、盲目的にポーリングするのではなく、これを読んでバックオフしてほしい。無料プランは毎分12リクエスト、Basicは120、Proは500である。残りのクォータと月次リセットはGET /v1/accountでいつでも確認できる。参照レートは1秒ごとに変わるものではないため、短いクライアント側キャッシュがあれば通常は上限内に十分収まる。

CORSエラー — ブラウザからAPIを呼び出す場合

キー付きでフロントエンドのJavaScriptから直接APIを呼び出してはならない——devtoolsを開いた誰にでもexr_live_...が見えてしまい、ブラウザ側もCORSでブロックする。自前のバックエンド経由で呼び出しをプロキシし、キーはサーバー側に保持し、ブラウザは自分のエンドポイントを叩くようにする。

javascript · your backend routecopy
// the key never reaches the browser
const r = await fetch("https://api.exchangerate.dev/v1/latest/USD", {
  headers: { Authorization: `Bearer ${process.env.EXCHANGERATE_API_KEY}` },
});
const data = await r.json();

レートが古く見える、週末に変わらない

これは想定どおりの挙動であり、レスポンスがその理由を教えてくれる。活発に取引される通貨はライブで更新される(取引日に約60秒間隔)——現在のカバレッジは固定のマーケティング数値ではなくAPI自身が報告し、残りはECBおよびFREDによる日次参照レートを使う。週末はインターバンク市場が休場のためライブフィードが停止し、参照フィックスは最後に公表された値を保持する。2つのフィールドがこれを明示する:

フィールド値意味動くタイミング
source: live集約されたスポットのコンセンサス値取引週の日中(約60秒間隔)
source: ecb_daily公式な参照フィックス営業日に1回
market_session: weekendインターバンク市場が休場ライブフィードは停止し、参照値は金曜の値を維持

レートを読むだけでなく金額を換算するには?

/v1/convert/{from}/{to}/{amount}を使う。レートと換算後の金額をまとめて返すため、手動で掛け算する必要はない:

curl · convert 100 USD to EURcopy
curl https://api.exchangerate.dev/v1/convert/USD/EUR/100 \
  -H "Authorization: Bearer exr_live_YOUR_KEY"

過去データや時系列データを取得するには?

過去の特定の1日については、パスに日付を入れる: GET /v1/{YYYY-MM-DD}/{base}、1999年1月4日まで遡れる。1回の呼び出しである範囲全体の系列を取得するにはGET /v1/rangestart_dateend_dateとともに使う。キーセット方式のページネーションを使っているため、一度に巨大な範囲をリクエストせず、カーソルをたどってほしい。

Frankfurterから移行中でエラーが出る場合

リクエストパラメータはFrankfurter互換であるため、多くの移行はベースURLの差し替えだけで済み、コードの書き直しは不要である。レスポンスが異なる箇所では、このAPIはフィールドを削除するのではなく追加している(sourcemarket_sessionnotice)。Frankfurterからの移行ガイドに正確な対応関係がある。

動作する最短の呼び出し

キーも依存関係も不要:

curl · no keycopy
curl https://api.exchangerate.dev/v1/latest/USD

レートとsourcemarket_sessionが返ってくるため、それぞれがどれだけ新しいかがわかる。無料キーを取得すれば上限が月10,000コールに引き上げられ、1分もかからない。

インディケーティブであり、決済用ではない
レートは参照・分析・表示用に公開されている。ディーリングクオートではなく、取引の決済に使用すべきではない。出荷するプロダクトで表示するにはBasicまたはProプランが必要であり、Freeは社内利用向けである。
MM
exchangerate.dev
開発者向けの統合ガイド。

Keep reading

GuideRedditで聞かれる為替レートAPIの疑問Read Comparison無料為替レートAPIの比較Read Guide書き直しなしでFrankfurterから移行するRead