API nilai tukar WebSocket

Berlangganan pasangan yang didukung dan terima pembaruan melalui koneksi persisten. Simpan API key di server.

Buat key gratisBaca referensi API

Mulai koneksi

Hubungkan ke wss://api.exchangerate.dev/v1/stream, kirim auth dalam 10 detik, lalu kirim subscribe setelah authenticated.

Contoh koneksi

Urutan di sisi server ini mengautentikasi key dan berlangganan USD/EUR serta USD/JPY.

Node.js 22+ · klien WebSocket di server
// 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();

Koneksi WebSocket memerlukan autentikasi.

Baca setiap pesan

Pesan berisi pasangan, kurs, waktu observasi, dan status kesegaran. Perlakukan unavailable dan stale sebagai status yang jelas.

JSON · contoh pesan; nilai dan waktunya hanya ilustrasi
{
  "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
}

Cakupan

Hanya pasangan dalam tabel cakupan saat ini yang dapat dipilih. Pasangan silang memerlukan observasi terbaru dari kedua kaki.

AUD, CAD, CHF, EUR, GBP, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR · 182 Pasangan yang didukung

Pembaruan adalah observasi indikatif. Periksa status dan waktu observasi di setiap pesan.

Periksa cakupan saat ini

Batas paket

Jumlah koneksi dan pasangan per koneksi bergantung pada paket. Setiap koneksi yang diterima memakai satu unit kuota bulanan.

PaketKoneksiPasangan per koneksiPenggunaan komersial
Free15Tidak
Basic325Ya
Pro10100Ya

Setiap koneksi yang diterima memakai satu unit kuota bulanan.

Lihat harga

Penggunaan komersial

Periksa paket dan ketentuan penggunaan komersial saat ini sebelum mendistribusikan produk yang bergantung pada stream.

Sambungkan kembali dengan aman

Saat terputus, tunggu sebelum menyambung kembali, autentikasi ulang, tunggu authenticated, lalu berlangganan ulang. Jangan taruh key di URL atau JavaScript publik.

Pembaruan yang hilang tetap hilang; stream tidak mengarang nilai.

Bisakah saya terhubung secara anonim?

Tidak. Koneksi WebSocket memerlukan API key. Uji coba anonim tersedia melalui endpoint REST yang didukung.

Apakah semua pasangan mata uang bisa di-stream?

Tidak. Cakupan WebSocket berbeda untuk tiap pasangan. Periksa tabel cakupan dan tangani langganan yang tidak didukung secara eksplisit.