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 支持的货币对

更新是指示性观测。请检查每条消息中的状态和观测时间。

查看当前覆盖范围

计划限制

连接数和每条连接的货币对数量取决于计划。每个获准连接消耗一个月度配额单位。

计划连接数每条连接的货币对商业使用
Free15
Basic325
Pro10100

每个获准连接消耗一个月度配额单位。

查看价格

商业使用

分发依赖此串流的产品前,请查看当前计划和商业使用条款。

安全重连

断开后先等待再重连,重新验证,等待 authenticated,然后重新订阅。不要将密钥放在 URL 或公开 JavaScript 中。

缺少的更新会保持缺少;串流不会编造数值。

可以匿名连接吗?

不可以。WebSocket 连接需要 API 密钥。可通过支持的 REST 端点进行匿名试用。

每个货币对都可以串流吗?

不可以。WebSocket 覆盖范围按货币对区分。请查看覆盖表,并明确处理不支持的订阅。