Learn/Szybki start z Pythonem

Jak pobierać kursy walut w Pythonie

Zacznij od biblioteki standardowej, użyj requests dla większej kontroli, a forex-python potraktuj jako etap migracji.

ERexchangerate.dev·Zaktualizowano 1 października 2026·6 min czytania

/v1/latest/USD zwraca JSON z kursem, źródłem i czasem obserwacji. Do kwot używaj Decimal.

Najważniejsze punkty
urllib nie wymaga dodatkowych zależności.
requests upraszcza autoryzację, timeout i błędy.
forex-python może być przejściowym interfejsem.
Zapisuj source, effective_at i data_updated_at razem z kursem.
Historię pobieraj przez datę lub /v1/range.

Pierwsze żądanie

Biblioteka standardowa wystarczy do pierwszego wywołania. Przy kwotach wczytaj liczby JSON jako Decimal.

requests z kluczem

W usłudze ustaw timeout, pobierz klucz ze zmiennej środowiskowej i sprawdź status przed zapisem.

Migracja z forex-python

forex-python korzysta z własnego dostawcy i nie łączy się automatycznie z exchangerate.dev. Podczas migracji zachowaj znany interfejs, ale nie zgub źródła ani czasu obserwacji z exchangerate.dev.

Poprawna obsługa historii

Endpoint daty może zwrócić wartość przeniesioną z poprzedniego dnia. /v1/range zwraca zapisane obserwacje i dzieli JSON na strony po 366 wierszy.

Najczęstsze pytania

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"])
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"])
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"])
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"])
ER
exchangerate.dev
Poradniki integracji dla programistów.

Czytaj dalej

TutorialKonwersja walut w JavaScriptCzytaj TutorialHistoryczne kursy i szeregi czasoweCzytaj
PorównanieFixer vs exchangerate.devPorównanieOpen Exchange Rates vs exchangerate.devPorównanieCurrencylayer vs exchangerate.devPoradnikKonwersja walut w JavaScript i Node.jsPoradnikKursy walut w Next.js i TypeScriptPoradnikAlert kursów walut w Pythonie: USD/IDRKurs na żywoEUR/USDKurs na żywoGBP/USDKurs na żywoUSD/JPY