第一次呼叫,唔使 key
喺 Node 18 或者任何現代瀏覽器,fetch 已經有。一個 await 就讀到 EUR 匯率:
javascript · no keycopy
const response = await fetch("https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP", {
signal: AbortSignal.timeout(10_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}; Retry-After: ${response.headers.get("Retry-After")}`);
const data = await response.json();
console.log(data.rates.EUR);
console.log(data.sources.EUR, data.effective_at.EUR);
console.log(data.market_session);匿名呼叫係按 IP 地址設上限嘅,所以過咗簡單測試就應該轉用免費 key。
加 key 同錯誤處理
將 key 以 bearer token 形式放入 Authorization 標頭。檢查 res.ok,狀態唔對就 throw,等錯誤早啲浮面:
javascript · authenticated call with error handlingcopy
// Node.js server only. Never put an account key in browser code.
const KEY = process.env.EXCHANGERATE_API_KEY;
if (!KEY) throw new Error("Set EXCHANGERATE_API_KEY on your server");
async function getLatest(base = "USD") {
const response = await fetch(`https://api.exchangerate.dev/v1/latest/${encodeURIComponent(base)}`, {
headers: { Authorization: `Bearer ${KEY}` },
redirect: "error",
signal: AbortSignal.timeout(10_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}; Retry-After: ${response.headers.get("Retry-After")}`);
return response.json();
}
const data = await getLatest("USD");
console.log(data.rates.GBP, data.effective_at.GBP);X-API-Key: exr_live_... 標頭都接受,畀嗰啲設定唔到 Authorization 標頭嘅平台用(部分 serverless runtime、Zapier 呢類 no-code 工具)。
換算一個金額
想直接換算就呼叫 /v1/convert/{from}/{to}/{amount}。一個來回就攞到匯率同換算結果:
javascript · convert 100 USD to EURcopy
// Node.js server only.
const KEY = process.env.EXCHANGERATE_API_KEY;
if (!KEY) throw new Error("Set EXCHANGERATE_API_KEY on your server");
const response = await fetch("https://api.exchangerate.dev/v1/convert/USD/EUR/100", {
headers: { Authorization: `Bearer ${KEY}` },
redirect: "error",
signal: AbortSignal.timeout(10_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}; Retry-After: ${response.headers.get("Retry-After")}`);
const data = await response.json();
console.log(data.rate, data.converted);convert 端點同 latest 一樣返回 source 同 market_session,所以你可以話畀用戶知匯率屬於邊一類,以及銀行同業交易週而家開唔開市。
理解 source 同 market_session
請用 sources[currency] 查看所顯示貨幣的資料來源類別,並用 effective_at[currency] 查看觀測時間。source 概括整個回應中更新頻率最低的資料。market_session 表示市場交易時段;timestamp 是回應產生時間,並非匯率觀測時間。
欄位值意思幾時郁
source: live綜合現貨共識值交易週日內(約 60 秒一次)
source: ecb_daily歐洲央行參考定盤價每個工作日一次(約 16:00 CET)
source: fred_daily聯儲局每日系列每個工作日一次
market_session: weekend星期六或者星期日(銀行同業休市)參考定盤價維持星期五數值;即時數據暫停更新
data_updated_at 欄位話你知底層匯率最後一次寫入嘅時間;timestamp 記錄嘅係回應生成嘅時間。兩個一齊睇,就可以決定點快取、點顯示。
只係指示性匯率
呢啲匯率係為參考、分析同顯示而發佈,唔係交易報價,唔可以用嚟結算交易或者轉賬。每個回應嘅 notice 欄位都有講明。
免費計劃限額
每月配額於每月1日00:00 UTC重設。收到429時,請按Retry-After指定的時間等候後再試。
- 每月 10,000 次呼叫
- 每分鐘 12 次請求
- 唔使信用卡
- 涵蓋
/v1/latest、/v1/convert、/v1/range 同 /v1/{date}/{base}