API nilai tukar WebSocket
Berlangganan pasangan yang didukung dan terima pembaruan melalui koneksi persisten. Simpan API key di server.
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+ · 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.
{
"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 iniBatas paket
Jumlah koneksi dan pasangan per koneksi bergantung pada paket. Setiap koneksi yang diterima memakai satu unit kuota bulanan.
| Paket | Koneksi | Pasangan per koneksi | Penggunaan komersial |
|---|---|---|---|
| Free | 1 | 5 | Tidak |
| Basic | 3 | 25 | Ya |
| Pro | 10 | 100 | Ya |
Setiap koneksi yang diterima memakai satu unit kuota bulanan.
Lihat hargaPenggunaan 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.