Tutorial/Pythonクイックスタート

Pythonで為替レートを取得する方法

数行のコードでライブ・過去の為替レートをPythonで読む。キーなしで始められ、登録後は月10,000コール。すべてのレスポンスがレートの鮮度を教えてくれる。

ERexchangerate.dev·Jun 19, 2026·5分で読了

Pythonで為替レートを取得する最短ルートは/v1/latest/USDへのGETリクエストだ。31通貨のレートと2つの鮮度フィールド(sourcemarket_session)を含むJSONが返る。最初のコールにAPIキーは不要。

Key points
/v1/latest/{base}への1回のGETで31通貨のレートがJSONで返る。
すべてのレスポンスがsourcemarket_sessionを持ち、各レートの鮮度がわかる。
無料枠は月10,000コール・毎分12リクエストで、カード不要。
レートはインディケーティブ値で、参照・分析向け — ディーリングクォートではない。

最初のコール — 依存パッケージなし

標準ライブラリ以外は何も要らない。1回のコールなら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"])

これはキーなしで動く。匿名コールはIPアドレスごとに上限があるため、簡単な試験を超えるなら無料キーを取得する。

requestsとAPIキーで

ほとんどのプロジェクトはすでにrequestsを使っている。キーはベアラートークンとして渡す:

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"])

無料キーで上限は月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公式な参照フィックス営業日に1回
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"])

日付範囲全体の系列を1コールで取るには、start_dateend_dateを付けて/v1/rangeを使う。詳細は別のガイドで扱っている。

ER
exchangerate.dev
FXデータを扱う開発者向けの統合ガイド。

関連記事

TutorialJavaScriptとNode.jsによる通貨換算読む Guide過去の為替レートと時系列を1コールで読む Referencesourceと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参照レートの解説
ライブレートEUR/USDGBP/USDUSD/JPY