WebSocket為替レートAPI

対応ペアを購読し、永続接続でレート更新を受け取ります。APIキーはサーバーに保管してください。

無料キーを作成APIリファレンスを読む

接続を開始する

wss://api.exchangerate.dev/v1/stream に接続し、10秒以内に auth を送信して、authenticated の後に subscribe を送信します。

接続例

このサーバー側の手順ではキーを認証し、USD/EUR と USD/JPY を購読します。

Node.js 22+ · サーバー側WebSocketクライアント
// Node.js 22+ · run on your server · set EXCHANGERATE_API_KEY in the environment
const key = process.env.EXCHANGERATE_API_KEY;
if (!key) throw new Error("EXCHANGERATE_API_KEY is required");

let retries = 0;
let stopped = false;
function connect() {
  const ws = new WebSocket("wss://api.exchangerate.dev/v1/stream");
  ws.addEventListener("open", () => {
    ws.send(JSON.stringify({ action: "auth", api_key: key }));
  });
  ws.addEventListener("message", ({ data }) => {
    const frame = JSON.parse(String(data));
    if (frame.type === "authenticated") {
      retries = 0;
      ws.send(JSON.stringify({ action: "subscribe", base: "USD", symbols: ["EUR", "JPY"] }));
    } else if (frame.type === "snapshot" || frame.type === "update") {
      if (frame.stale) return; // Keep the observation time; don't treat it as a fresh tick.
      console.log(frame.base, frame.symbol, frame.rate, frame.effective_at);
    } else if (frame.type === "state") {
      console.log(frame.base, frame.symbol, frame.state); // stale or unavailable
    } else if (frame.type === "error") {
      console.error(frame.code, frame.message);
      if (["invalid_api_key", "quota_exceeded", "connection_limit_exceeded", "subscription_limit_exceeded"].includes(frame.code)) {
        stopped = true;
        ws.close();
      }
    }
  });
  ws.addEventListener("close", () => {
    if (stopped) return;
    const delay = Math.min(30_000, 1_000 * 2 ** Math.min(retries++, 5));
    setTimeout(connect, delay + Math.random() * 250);
  });
}
connect();

WebSocket接続には認証が必要です。

各メッセージを読む

メッセージにはペア、レート、観測時刻、鮮度状態が含まれます。unavailable と stale は明示的な状態として扱ってください。

JSON · サンプルメッセージ(数値と時刻は例示)
{
  "type": "update",
  "base": "USD",
  "symbol": "JPY",
  "rate": "154.792",
  "effective_at": "2026-09-15T02:59:44Z",
  "source": "live",
  "source_type": "market",
  "market_session": "open",
  "derived": false,
  "stale": false
}

対応範囲

購読できるのは現在の対応表にあるペアだけです。クロスには両方のレッグの新しい観測が必要です。

AUD, CAD, CHF, EUR, GBP, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR · 182 対応ペア

更新は指標となる観測値です。各メッセージの状態と観測時刻を確認してください。

現在の対応範囲を確認

プランの制限

接続数と1接続あたりのペア数はプランによって異なります。承認された接続1つにつき月間クォータを1単位消費します。

プラン接続数1接続あたりのペア商用利用
Free15いいえ
Basic325はい
Pro10100はい

承認された接続1つにつき月間クォータを1単位消費します。

料金を見る

商用利用

ストリームに依存する製品を配布する前に、現在のプランと商用利用条件を確認してください。

安全に再接続する

切断後は待機してから再接続し、再認証して authenticated を待ち、再購読します。キーをURLや公開JavaScriptに入れないでください。

欠落した更新は欠落したままです。ストリームは値を作りません。

匿名で接続できますか?

できません。WebSocket接続にはAPIキーが必要です。匿名での評価は対応するRESTエンドポイントで行えます。

すべての通貨ペアをストリーミングできますか?

できません。WebSocketの対応範囲はペアごとに異なります。対応表を確認し、非対応の購読を適切に処理してください。