ご質問や問題がありますか?GitHub Discussionsでお気軽にご相談ください。

SDKは不要です。Frankfurterは標準的なHTTPSを使用し、フラットなJSONを返します。普段お使いのHTTPライブラリで十分です。APIキーもアカウント登録も必要ありません。

クイックスタート

レートを取得して換算:

import requests

res = requests.get("https://api.frankfurter.dev/v2/rate/usd/eur")
data = res.json()
total = 100 * data["rate"]

レスポンスはフラットなオブジェクトです: {"date": "2026-07-17", "base": "USD", "quote": "EUR", "rate": 0.8739}。 無効な通貨コードの場合はHTTPステータス422とJSONエラーメッセージが返されます。

丸め誤差のない金銭計算

浮動小数点数(float)は表示には十分ですが、厳密な会計処理には適していません。json.loadsのparse_float引数にDecimalを指定して処理します:

from decimal import Decimal

import requests

res = requests.get("https://api.frankfurter.dev/v2/rate/usd/eur")
data = res.json(parse_float=Decimal)
total = Decimal("100") * data["rate"]

複数のレートを一度に取得

/v2/ratesは対象通貨ごとに1行のフラットな配列を返します。辞書内包表記でルックアップ用の辞書に変換できます。quotesを省略すると、利用可能なすべての通貨が返されます。

res = requests.get(
    "https://api.frankfurter.dev/v2/rates",
    params={"base": "usd", "quotes": "eur,gbp,jpy"},
)
rates = {row["quote"]: row["rate"] for row in res.json()}

不変データのキャッシュ

固定した提供元の過去レートは変わらないため、恒久的にキャッシュできます。合成レートは新しいデータの到着で変わることがあり、最新レートは提供元の公表時(平日に数回程度)に更新されるため、これらには短いTTLで十分です。requests-cacheを使えば1行で設定できます:

import requests_cache

session = requests_cache.CachedSession("frankfurter", expire_after=3600)
res = session.get("https://api.frankfurter.dev/v2/rate/usd/eur")
data = res.json()

非同期処理

非同期のWebアプリではhttpxを使用します:

import httpx

API = "https://api.frankfurter.dev"


async def rate(base, quote):
    async with httpx.AsyncClient(base_url=API) as client:
        res = await client.get(f"/v2/rate/{base}/{quote}")
        res.raise_for_status()
        return res.json()["rate"]

特定の公的機関を指定

デフォルトでは全提供元を組み合わせた合成レートが返されます。providersを追加すると特定の機関を1つ指定できます。EU付加価値税用のECB基準レートのように、管轄地域が自国の中央銀行の公表レートを求める場合に重要です。

res = requests.get(
    "https://api.frankfurter.dev/v2/rate/usd/eur",
    params={"providers": "ecb"},
)
data = res.json()

すべての提供元を確認できます。特定の提供元を指定した場合、その機関の公表スケジュールに従うため、最新レートが合成レートより1日遅れる場合があります。

時系列を分析しますか?

期間指定、月ごとのグループ化、グラフ作成には、CSVエンドポイントをDataFrameに直接読み込めます。pandasを参照してください。