질문이나 문제가 있나요? GitHub Discussions에 남겨 주세요.

SDK는 필요하지 않습니다. Frankfurter는 평면 JSON을 반환하는 일반 HTTPS이므로, 이미 쓰는 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}. 잘못된 통화 코드는 JSON 메시지와 함께 422를 반환합니다.

금융 계산에 안전한 연산

부동소수점은 표시에는 괜찮지만 회계에는 맞지 않습니다. parse_float를 json.loads에 전달해 환율을 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는 대상 통화별로 한 행씩 담긴 평면 배열을 반환합니다. 컴프리헨션으로 조회용 딕셔너리로 바꾸세요. 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를 쓰면 캐싱은 한 줄입니다:

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()

비동기

비동기 웹 앱에서는 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를 추가해 특정 기관 하나를 고정하세요. EU 부가가치세용 ECB 기준 환율처럼 관할 지역이 자국 중앙은행의 공표 환율을 요구할 때 중요합니다.

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

모든 제공 기관을 살펴보세요. 고정한 제공 기관은 자체 공표 일정을 따르므로, 최신 환율이 종합 환율보다 하루 늦을 수 있습니다.

시계열을 분석하나요?

기간 지정, 월별 그룹화, 차트에는 CSV 엔드포인트를 DataFrame에 바로 로드하세요. pandas를 참고하세요.