Masz pytania lub problemy? Napisz w GitHub Discussions.

Nie potrzebujesz żadnego SDK. Funkcja fetch jest wbudowana w każdą przeglądarkę, Node, Deno, Bun oraz środowiska brzegowe edge. CORS jest otwarty i nie ma żadnego klucza, który mógłby przypadkowo wyciec. Możesz wywoływać API bezpośrednio z kodu klienta.

Szybki start

Pobierz kurs i przelicz kwotę:

const res = await fetch("https://api.frankfurter.dev/v2/rate/usd/eur");
const data = await res.json();
const total = 100 * data.rate;

Odpowiedź to płaski obiekt: {"date": "2026-07-17", "base": "USD", "quote": "EUR", "rate": 0.8739}. Funkcja fetch rozwiązuje się również przy błędach HTTP, dlatego weryfikuj res.ok. Nieprawidłowy kod waluty zwraca status 422 z komunikatem w JSON.

Formatowanie z Intl

Nie dołączaj symboli walut ręcznie. Intl.NumberFormat zna symbol waluty, jego pozycję i liczbę miejsc po przecinku dla każdej waluty w dowolnym ustawieniu regionalnym:

const res = await fetch("https://api.frankfurter.dev/v2/rate/usd/eur");
const { rate } = await res.json();

const eur = new Intl.NumberFormat("pl-PL", {
  style: "currency",
  currency: "EUR",
});
eur.format(100 * rate); // "87,39 €"

Symbole i miejsca po przecinku

Nie musisz dołączać własnej tabeli metadanych dla jednostek podrzędnych ani symboli. Wystarczy zapytać formater:

const yen = new Intl.NumberFormat("pl-PL", {
  style: "currency",
  currency: "JPY",
});

yen.resolvedOptions().maximumFractionDigits; // 0, jen nie ma jednostek podrzędnych
yen.formatToParts(1).find((part) => part.type === "currency").value; // "JPY"

Zobacz wszystkie waluty obsługiwane przez Frankfurter wraz z kodami i symbolami.

Wiele kursów naraz

Endpoint /v2/rates zwraca płaską tablicę z 1 wierszem na walutę docelową. Przekształć ją za pomocą Object.fromEntries w obiekt wyszukiwania. Jeśli pominiesz quotes, otrzymasz wszystkie waluty.

const res = await fetch("https://api.frankfurter.dev/v2/rates?base=usd&quotes=eur,gbp,jpy");
const rows = await res.json();
const rates = Object.fromEntries(rows.map((row) => [row.quote, row.rate]));

Wybór oficjalnego źródła

Domyślnie otrzymujesz kurs łączony ze wszystkich źródeł. Dodaj parametr providers, aby wybrać konkretną instytucję, co jest niezbędne w rozliczeniach podatkowych.

const res = await fetch("https://api.frankfurter.dev/v2/rate/usd/eur?providers=ecb");
const { rate } = await res.json();

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.