Tutorial/Python 快速入門

用 Python 攞匯率嘅方法

幾行代碼就喺 Python 讀到即時同歷史外匯匯率。起步唔使 key,註冊後每月 10,000 次呼叫,而且每個回應都話你知匯率有幾新。

ERexchangerate.dev·Jun 19, 2026·5 分鐘閱讀

喺 Python 攞匯率最短嘅路徑係向 /v1/latest/USD 發一個 GET 請求。返嚟嘅 JSON 有 31 種貨幣嘅匯率,加兩個新鮮度欄位:sourcemarket_session第一次呼叫唔使 API key。

Key points
一次 GET /v1/latest/{base} 就以 JSON 返回 31 種貨幣嘅匯率。
每個回應都帶住 sourcemarket_session,每個匯率有幾新一目了然。
免費計劃每月 10,000 次呼叫、每分鐘 12 次請求,唔使信用卡。
匯率係指示性,為參考同分析而發佈 — 唔係交易報價。

第一次呼叫,零依賴

標準庫以外咩都唔使。一次呼叫用 urllib.request 就搞掂:

python · standard librarycopy
import json
from decimal import Decimal
import urllib.request

url = "https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP"
with urllib.request.urlopen(url, timeout=10) as response:
    data = json.load(response, parse_float=Decimal)

print(data["rates"]["EUR"])
print(data["sources"]["EUR"], data["effective_at"]["EUR"])
print(data["market_session"])

呢段代碼唔使 key 都行到。匿名呼叫按 IP 地址設上限,所以超過簡單測試就應該攞個免費 key。

用 requests 加 API key

大部分項目本身已經用緊 requests。將 key 以 bearer token 傳送:

python · requestscopy
# Install first: python -m pip install requests
import os
from decimal import Decimal
import requests

response = requests.get(
    "https://api.exchangerate.dev/v1/latest/USD",
    headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
    timeout=10,
    allow_redirects=False,
)
if response.status_code == 429:
    raise RuntimeError(f"Rate limited; Retry-After: {response.headers.get('Retry-After')}")
if 300 <= response.status_code < 400:
    raise RuntimeError("Unexpected redirect")
response.raise_for_status()
data = response.json(parse_float=Decimal)
print(data["rates"]["GBP"], data["effective_at"]["GBP"])

免費 key 將上限提升到每月 10,000 次呼叫、每分鐘 12 次請求。設定唔到 Authorization 嘅平台可以用 X-API-Key 標頭。

換算一個金額

如果要嘅係換算而唔係成個匯率表,就呼叫 /v1/convert。匯率同換算結果一齊返回:

python · convert 100 USD to EURcopy
import os
from decimal import Decimal
import requests

response = requests.get(
    "https://api.exchangerate.dev/v1/convert/USD/EUR/100",
    headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
    timeout=10,
    allow_redirects=False,
)
if not 200 <= response.status_code < 300:
    raise RuntimeError(f"HTTP {response.status_code}; Retry-After: {response.headers.get('Retry-After')}")
data = response.json(parse_float=Decimal)
print(data["rate"], data["converted"])

知道匯率有幾新

請用 sources[currency] 查看所顯示貨幣的資料來源類別,並用 effective_at[currency] 查看觀測時間。source 概括整個回應中更新頻率最低的資料。market_session 表示市場交易時段;timestamp 是回應產生時間,並非匯率觀測時間。

欄位值意思幾時郁
source: live綜合現貨共識值交易週日內(約 60 秒一次)
source: ecb_daily官方參考定盤價每個工作日一次
market_session: weekend星期六或者星期日(銀行同業休市)參考定盤價維持星期五數值;即時數據暫停更新
指示性,唔可以用嚟結算
匯率係為參考、分析同顯示而發佈,唔係交易報價,唔應該用嚟結算交易。每個回應嘅 notice 欄位都帶住呢句話。

讀過去某一日

將日期放入路徑,就可以查詢遠至 1999 年嘅任何一日。回應會多一個 is_forward_filled 欄位,如果嗰日冇發佈匯率(例如週末或者假期)就係 true

python · rate on a past datecopy
import os
from decimal import Decimal
import requests

response = requests.get(
    "https://api.exchangerate.dev/v1/2026-03-14/USD?symbols=JPY",
    headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
    timeout=10,
    allow_redirects=False,
)
if not 200 <= response.status_code < 300:
    raise RuntimeError(f"HTTP {response.status_code}; Retry-After: {response.headers.get('Retry-After')}")
data = response.json(parse_float=Decimal)
print(data["rates"]["JPY"], data["is_forward_filled"])

想一次呼叫攞成個日期範圍嘅序列,就用 /v1/rangestart_dateend_date。另有一篇指南詳細講。

ER
exchangerate.dev
為開發者提供嘅整合指南。

延伸閱讀

Tutorial用 JavaScript 同 Node.js 做貨幣換算閱讀 Guide一次呼叫攞歷史匯率同時間序列閱讀 Reference點樣讀 source 同 market_session閱讀
更多比較Fixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
學習Reading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
即時匯率EUR/USDGBP/USDUSD/JPY