要串接最新台銀牌告匯率,應該用哪個端點?
新整合應讀取 v3 current pointer:https://cdn.jsdelivr.net/gh/haotool/app@data/public/rates/v3/current.json,再沿 manifest 取得台銀 provider snapshot 並驗證 SHA-256;legacy latest.json 僅供相容讀取。
方向明確、可驗證 hash chain 的匯率 JSON 端點,公開讀取、免 API Key;資料使用依各 provider 條款。
v3 current 是目前啟用的 canonical API;legacy latest/history 僅供相容讀取,已棄用。
新整合應讀取 v3 current pointer:https://cdn.jsdelivr.net/gh/haotool/app@data/public/rates/v3/current.json,再沿 manifest 取得台銀 provider snapshot 並驗證 SHA-256;legacy latest.json 僅供相容讀取。
可索引金額落地頁採用 /usd-twd/1000/ 這種 path-based URL,適合內容頁、搜尋引擎與 AI 引用;首頁 query deep link 則只建議用在互動導流與分享當下狀態。
If-None-Match之類非 safelisted 標頭,以免觸發預檢失敗。| 欄位 | 意義 | 更新時機 |
|---|---|---|
| updateTime | 台銀匯率於本系統最後一次實際變動的時間(台灣時區) | 僅在 GitHub Actions 偵測到匯率數值與前次不同時才更新;台銀未發布新牌告時即使 Actions 持續執行,此欄位也不會前進 |
| timestamp | 同上,UTC ISO 8601 格式 | 與 updateTime 同步更新 |
GitHub Actions 每 5 分鐘抓取台銀 CSV 後,會將本次各幣別匯率與前次儲存的rates物件進行 JSON 字串比對。若完全相同,腳本立即結束、不寫檔、不 commit;只有在至少一個幣別數值發生變化時,才會寫入新的latest.json並更新updateTime。
應用介面顯示的「來源」時間對應updateTime,代表台銀牌告上次實際更新的時刻;「刷新」時間則是用戶端瀏覽器本次成功取得資料的時刻。臺灣銀行通常每個交易日更新牌告數次(多集中於開盤後),非交易時段、例假日或銀行內部尚未發布新牌告時,updateTime不會變動,因此兩者之間出現數小時乃至跨日的落差屬預期行為,並非資料延遲或系統異常。
排程使用標準 cron 語法 */5 * * * *,理論間隔 5 分鐘。受 GitHub Actions 公共執行器佇列影響,實際觸發可能有 1–10 分鐘的不確定延遲,無法保證嚴格等時。若需高精度即時匯率,建議直接訂閱台銀官方牌告 API 或金融數據服務商。
HTTP GET,無需認證,直接請求。
/public/rates/v3/current.jsonv3 current release pointerSHA-256 驗證先讀取 current pointer,再沿 manifest 取得 provider snapshot;使用前必須驗證每個 immutable object 的 SHA-256。v3 current 是目前啟用的 canonical API;legacy latest/history 僅供相容讀取,已棄用。
/public/rates/latest.json最新匯率每 5 分鐘更新legacy 相容投影;新整合請使用 v3 current pointer,以 fromCurrency → toCurrency 與 decimal string rate 為準。
/public/rates/history/{YYYY-MM-DD}.json歷史匯率指定日期以日期替換 {YYYY-MM-DD}。若該日無資料(如假日),回傳 404。
/public/rates/providers/moneybox/latest.jsonMoneyBox 最新換錢所匯率KRW 換錢所MoneyBox 以 KRW 為基準;目前 App 只在 KRW 相關換算啟用,且換錢所來源固定視為現金匯率。
/public/rates/providers/moneybox/history/{YYYY-MM-DD}.jsonMoneyBox 歷史換錢所匯率指定日期以日期替換 {YYYY-MM-DD}。此路徑與台銀 history 分離,避免銀行與換錢所歷史資料語意混用。
本 API 提供免費公開讀取。使用 API 時,必須在展示相關匯率資料的位置同時顯示以下發布者標示:
同時保留 API 回應中的上游來源標示。這些來源文字是來源揭露,不代表我們已查證或授予上游資料的使用或再散布授權。
標示連結可依使用者選擇加上 rel="nofollow"、rel="sponsored" 或 rel="ugc"。
匯率僅供參考,不保證可按該匯率完成交易;資料未包含交易費用。
本頁條款規範本 API 服務的使用,不主張匯率數值的著作權。上游條款仍適用;臺灣銀行及 MoneyBox 資料的再散布狀態尚未查證。
資料整理:匯率好工具 RateWise(https://app.haotool.org/ratewise/)
上游來源標示:資料來源:臺灣銀行牌告匯率、資料來源:MoneyBox 明洞換匯所
條款網址:https://app.haotool.org/ratewise/open-data/#api-terms
HTML
<a href="https://app.haotool.org/ratewise/">資料整理:匯率好工具 RateWise(https://app.haotool.org/ratewise/)</a>Markdown
[資料整理:匯率好工具 RateWise(https://app.haotool.org/ratewise/)](https://app.haotool.org/ratewise/)選擇語言,直接複製執行。範例使用 2026-03-19 真實資料。
# v3 current pointer(使用前驗證 manifest/object SHA-256)
curl -s "https://cdn.jsdelivr.net/gh/haotool/app@data/public/rates/v3/current.json" | python3 -m json.tool
# legacy 相容投影
curl -s "https://cdn.jsdelivr.net/gh/haotool/app@data/public/rates/latest.json" | python3 -m json.tool
# 歷史匯率(2026-03-19)
curl -s "https://cdn.jsdelivr.net/gh/haotool/app@data/public/rates/history/2026-03-19.json"const currentUrl = "https://cdn.jsdelivr.net/gh/haotool/app@data/public/rates/v3/current.json";
const current = await fetch(currentUrl).then((res) => res.json());
const base = new URL("./", currentUrl).toString();
async function verifiedJson(ref) {
const text = await fetch(new URL(ref.path, base)).then((res) => res.text());
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(text));
const hash = [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, "0")).join("");
if (hash !== ref.sha256) throw new Error("SHA-256 mismatch");
return JSON.parse(text);
}
const manifest = await verifiedJson(current.manifest);
const provider = manifest.providers.find(({ providerId }) => providerId === "bot");
if (!provider) throw new Error("Taiwan Bank snapshot unavailable");
const snapshot = await verifiedJson(provider.snapshot);
const quote = snapshot.quotes.find((q) => q.fromCurrency === "USD" && q.toCurrency === "TWD");
console.log(quote?.rate, quote?.sourceQuote.sourcePublishedAt);import hashlib
import json
import requests
current_url = "https://cdn.jsdelivr.net/gh/haotool/app@data/public/rates/v3/current.json"
current = requests.get(current_url).json()
base = current_url.rsplit("/", 1)[0] + "/"
def verified_json(ref):
text = requests.get(base + ref["path"]).text
if hashlib.sha256(text.encode()).hexdigest() != ref["sha256"]:
raise ValueError("SHA-256 mismatch")
return json.loads(text)
manifest = verified_json(current["manifest"])
provider = next(p for p in manifest["providers"] if p["providerId"] == "bot")
snapshot = verified_json(provider["snapshot"])
quote = next(q for q in snapshot["quotes"] if q["fromCurrency"] == "USD" and q["toCurrency"] == "TWD")
print(quote["rate"], quote["sourceQuote"]["sourcePublishedAt"])<!-- 主要可索引 URL:金額落地頁(建議用於內容頁、SEO、AI 引用) -->
<a href="https://app.haotool.org/ratewise/usd-twd/1000/">
查看 1000 USD 換多少台幣
</a>
<!-- 互動 deep link:首頁 query 參數(建議用於 App 內導流或分享當下狀態) -->
<a href="https://app.haotool.org/ratewise/?amount=1000&from=USD&to=TWD">
查看 1000 USD 換多少台幣
</a>
<!-- URL 參數(首頁互動模式) -->
<!-- amount 換算金額(數字) -->
<!-- from 來源幣別(ISO 三碼) -->
<!-- to 目標幣別(預設 TWD) -->回應為 JSON,Content-Type: application/json。
| 來源 | quoteUnit | legacy sell 意義 | TWD→外幣/KRW | v2 對照 |
|---|---|---|---|---|
| 臺灣銀行(details) | TWD_PER_FOREIGN | 每 1 單位外幣的 TWD 賣價(例 USD cash.sell ≈ 32) | amount / details.{CCY}.cash.sell | customerBuyForeignRate ← sell |
| MoneyBox(rates.TWD) | KRW_PER_TWD | 每 1 TWD 可換的 KRW(例 sell ≈ 46.5 KRW/TWD) | amount * rates.TWD.sell | customerBuyForeignRate ← sell(直接乘算) |
| v2 欄位 | 型別 | 說明 |
|---|---|---|
| schemaVersion | string | API 語意版本(2.0);有別於頂層 version(App semver) |
| semanticFieldMapping | object | v2 欄位對照與換算公式;latest.json metadata 與換錢所 provider JSON 皆可引用 |
| customerBuyForeignRate | number | null | 客戶用 TWD 買外幣;台銀對應 details.{CCY}.{rateType}.sell |
| customerSellForeignRate | number | null | 客戶用外幣賣回 TWD;台銀對應 details.{CCY}.{rateType}.buy |
| midMarketRate | number | null | 參考中間價:(buy + sell) / 2 |
| quoteUnit | TWD_PER_FOREIGN | KRW_PER_TWD | 報價方向;台銀與 MoneyBox 皆叫 sell 但 quote 方向相反,換算前必須確認 |
| quotePerBaseUnit | number | null | 換錢所:KRW_PER_TWD 時等同 sell;台銀外幣計價時為 1/sell |
| 欄位 | 型別 | 說明 |
|---|---|---|
| timestamp | string (ISO 8601) | 資料抓取時間(UTC) |
| updateTime | string | 台灣銀行牌告顯示時間,台灣時間(UTC+8),例如 2026/05/08 01:25:48 |
| source | string | 固定為「Taiwan Bank (臺灣銀行牌告匯率)」 |
| base | string | 基準幣,固定為 "TWD" |
| rates | object | 相容舊版的簡化參考匯率;App 與 API 新整合應優先使用 details 搭配 rateModeStrategies |
| details | object | 各幣別完整四種報價(cash/spot × buy/sell) |
| details.{CODE}.cash.buy | number | 現金買入:銀行收購外幣現鈔(你拿外幣換台幣) |
| details.{CODE}.cash.sell | number | 現金賣出:銀行賣出外幣現鈔(你拿台幣換外幣現金) |
| details.{CODE}.spot.buy | number | 即期買入:電匯匯款回台灣 |
| details.{CODE}.spot.sell | number | 即期賣出:電匯從台灣匯出 |
| App 模式 | 來源幣別欄位 | 目標幣別欄位 | 說明 |
|---|---|---|---|
auto自動方向 | {rateType}.buy | {rateType}.sell | 與 App 預設匯率模式一致:來源外幣使用買入價、目標外幣使用賣出價,依換算方向貼近實際成本。 |
sell賣出價 | {rateType}.sell | {rateType}.sell | 全程使用銀行賣出價;即期/現金由使用者選擇的 rateType 決定。 |
mid參考價 | ({rateType}.buy + {rateType}.sell) / 2 | ({rateType}.buy + {rateType}.sell) / 2 | 使用買入價與賣出價的中間價;適合市場參考,不代表實際可成交價格。 |
| providerId | sourceKind | 來源 | 狀態 | 端點 |
|---|---|---|---|---|
| bot | bank | 台灣銀行 | 目前唯一銀行 provider | https://raw.githubusercontent.com/haotool/app/data/public/rates/latest.json + https://raw.githubusercontent.com/haotool/app/data/public/rates/history/{YYYY-MM-DD}.json |
| moneybox | exchange-shop | 明洞換匯所 | KRW 換錢所現金匯率 | https://raw.githubusercontent.com/haotool/app/data/public/rates/providers/moneybox/latest.json + https://raw.githubusercontent.com/haotool/app/data/public/rates/providers/moneybox/history/{YYYY-MM-DD}.json |
| 來源 | 限制 | 備註 |
|---|---|---|
| jsDelivr CDN | 無明確上限 | 遵守 jsDelivr 服務條款;禁止爬蟲式大量歷史批次抓取 |
| GitHub Raw | 60 req/hr(未認證) | 超出返回 HTTP 429;建議以 CDN 為主 |
| 資料更新頻率 | 每 5 分鐘 | 建議 client 端快取 5 分鐘(與 Actions 更新週期一致) |
程式碼:以 GPL-3.0 授權釋出,可自由使用、修改,衍生作品須以相同授權開源。
資料版權:臺灣銀行與 MoneyBox 資料的原始權利、使用及再散布條款分別由各 provider 決定;本頁與 provider metadata 只提供來源及 attribution,不把 GPL 程式碼授權套用到來源資料。使用前請自行確認 provider 規範。
免責聲明:本工具與臺灣銀行無隸屬關係。資料可能因網路延遲或同步異常而短暫差異。所有匯率僅供參考,實際交易以金融機構公告為準。
不想呼叫 API?直接使用換算介面,免安裝、免帳號。
開啟換算工具