Masz pytania lub problemy? Napisz w GitHub Discussions.

Nie potrzebujesz żadnego SDK. Frankfurter korzysta ze standardowego protokołu HTTPS i zwraca płaski JSON. Wystarczy dowolna biblioteka HTTP, której już używasz. Bez klucza API i bez rejestracji konta.

Szybki start

Pobierz kurs i przelicz kwotę:

import requests

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

Odpowiedź to płaski słownik: {"date": "2026-07-17", "base": "USD", "quote": "EUR", "rate": 0.8739}. Nieprawidłowy kod waluty zwraca status HTTP 422 z komunikatem błędu.

Obliczenia finansowe bez błędów zaokrągleń

Liczby zmiennoprzecinkowe (float) nadają się do wyświetlania, ale nie do księgowości. Przetwarzaj kursy jako Decimal, przekazując parse_float do json.loads:

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

Wiele kursów naraz

Endpoint /v2/rates zwraca płaską listę z 1 wierszem na walutę docelową. Przekształć ją za pomocą wyrażenia słownikowego w strukturę wyszukiwania. Jeśli pominiesz quotes, otrzymasz wszystkie dostępne waluty.

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

Buforowanie danych niezmiennych

Kursy historyczne są niezmienne, więc możesz je buforować na stałe. Bieżące kursy zmieniają się tylko w momentach publikacji przez źródła, zazwyczaj kilka razy w ciągu dnia roboczego; krótki czas TTL w zupełności wystarczy. Za pomocą requests-cache zrobisz to jedną linijką:

import requests_cache

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

Wybór oficjalnego źródła

Domyślnie otrzymujesz kurs uśredniony ze wszystkich źródeł. Dodaj parametr providers, aby wybrać konkretną instytucję. Wiele jurysdykcji wymaga stosowania kursu własnego banku centralnego do rozliczeń podatkowych.

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

Zobacz wszystkie źródła. Wybrana instytucja działa według własnego harmonogramu publikacji, więc jej najnowszy kurs może być opóźniony o jeden dzień względem kursu rynkowego.