WebSocket為替レートAPI
対応ペアを購読し、永続接続でレート更新を受け取ります。APIキーはサーバーに保管してください。
接続を開始する
wss://api.exchangerate.dev/v1/stream に接続し、10秒以内に auth を送信して、authenticated の後に subscribe を送信します。
接続例
このサーバー側の手順ではキーを認証し、USD/EUR と USD/JPY を購読します。
// 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 は明示的な状態として扱ってください。
{
"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接続あたりのペア | 商用利用 |
|---|---|---|---|
| Free | 1 | 5 | いいえ |
| Basic | 3 | 25 | はい |
| Pro | 10 | 100 | はい |
承認された接続1つにつき月間クォータを1単位消費します。
料金を見る商用利用
ストリームに依存する製品を配布する前に、現在のプランと商用利用条件を確認してください。
安全に再接続する
切断後は待機してから再接続し、再認証して authenticated を待ち、再購読します。キーをURLや公開JavaScriptに入れないでください。
欠落した更新は欠落したままです。ストリームは値を作りません。
匿名で接続できますか?
できません。WebSocket接続にはAPIキーが必要です。匿名での評価は対応するRESTエンドポイントで行えます。
すべての通貨ペアをストリーミングできますか?
できません。WebSocketの対応範囲はペアごとに異なります。対応表を確認し、非対応の購読を適切に処理してください。