API อัตราแลกเปลี่ยนผ่าน WebSocket
สมัครรับคู่เงินที่รองรับและรับการอัปเดตผ่านการเชื่อมต่อแบบต่อเนื่อง เก็บ API key ไว้บนเซิร์ฟเวอร์
เริ่มการเชื่อมต่อ
เชื่อมต่อ wss://api.exchangerate.dev/v1/stream ส่ง auth ภายใน 10 วินาที แล้วส่ง subscribe หลังได้รับ authenticated
ตัวอย่างการเชื่อมต่อ
ลำดับการทำงานฝั่งเซิร์ฟเวอร์นี้ยืนยัน key และสมัครรับ 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 คู่เงินที่รองรับ
การอัปเดตเป็นข้อมูลสังเกตการณ์เชิงบ่งชี้ โปรดตรวจสอบสถานะและเวลาสังเกตในแต่ละข้อความ
ดูความครอบคลุมปัจจุบันขีดจำกัดแพ็กเกจ
จำนวนการเชื่อมต่อและคู่เงินต่อการเชื่อมต่อขึ้นอยู่กับแพ็กเกจ การเชื่อมต่อที่ได้รับอนุมัติแต่ละครั้งใช้โควตรายเดือนหนึ่งหน่วย
| แพ็กเกจ | การเชื่อมต่อ | คู่ต่อการเชื่อมต่อ | การใช้งานเชิงพาณิชย์ |
|---|---|---|---|
| Free | 1 | 5 | ไม่ |
| Basic | 3 | 25 | ใช่ |
| Pro | 10 | 100 | ใช่ |
การเชื่อมต่อที่ได้รับอนุมัติแต่ละครั้งใช้โควตรายเดือนหนึ่งหน่วย
ดูราคาการใช้งานเชิงพาณิชย์
ตรวจสอบแพ็กเกจและเงื่อนไขการใช้งานเชิงพาณิชย์ปัจจุบันก่อนเผยแพร่ผลิตภัณฑ์ที่พึ่งพาสตรีมนี้
เชื่อมต่อใหม่อย่างปลอดภัย
เมื่อหลุด ให้รอก่อนเชื่อมต่อใหม่ ยืนยันตัวตนอีกครั้ง รอ authenticated แล้วสมัครรับใหม่ อย่าใส่ key ใน URL หรือ JavaScript สาธารณะ
ข้อมูลอัปเดตที่หายไปยังคงหายไป สตรีมจะไม่สร้างค่าเอง
เชื่อมต่อแบบไม่ระบุตัวตนได้ไหม
ไม่ได้ การเชื่อมต่อ WebSocket ต้องใช้ API key การทดลองแบบไม่ระบุตัวตนทำได้ผ่าน REST endpoint ที่รองรับ
สตรีมได้ทุกคู่เงินไหม
ไม่ได้ ความครอบคลุมของ WebSocket ขึ้นอยู่กับคู่เงิน โปรดดูตารางความครอบคลุมและจัดการการสมัครที่ไม่รองรับอย่างชัดเจน