Frankfurter śledzi dzienne kursy wymiany z 98 banków centralnych i oficjalnych instytucji dla 206 walut. Dane sięgają roku 1948.

Publiczne API jest dostępne pod adresem api.frankfurter.dev i nie wymaga żadnego klucza API. Projekt jest otwartoźródłowy. Aby zachować pełną kontrolę, możesz go także wdrożyć samodzielnie.

Pracujesz z agentem AI? Przekaż mu plik llms.txt lub skonfiguruj serwer MCP.

Kursy

Pobierz najnowsze kursy wymiany.

curl https://api.frankfurter.dev/v2/rates

Zmień walutę bazową za pomocą base.

curl https://api.frankfurter.dev/v2/rates?base=usd

Filtruj waluty docelowe za pomocą quotes.

curl https://api.frankfurter.dev/v2/rates?quotes=usd,gbp

Kursy historyczne

Sprawdź kursy dla wybranego dnia.

curl https://api.frankfurter.dev/v2/rates?date=1999-01-04

Szeregi czasowe

Pobierz kursy w przedziale czasowym za pomocą from i to.

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01&quotes=usd

Wskazówka: Odpytuj tylko o potrzebne waluty. W przypadku długich okresów format NDJSON pozwala na strumieniowanie wyników wiersz po wierszu.

Grupowanie

Agreguj szeregi czasowe za pomocą group. Dostępne wartości: week i month.

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01&group=month

Filtrowanie według źródła

Ogranicz dane do konkretnych instytucji za pomocą parametru providers.

curl https://api.frankfurter.dev/v2/rates?providers=ecb

Domyślnie API łączy kursy ze wszystkich źródeł. Aby sprawdzić dane jednej instytucji, użyj providers lub odpytaj jej własne endpointy.

Atrybucja źródeł

Parametr expand=providers wskazuje instytucje, które wpłynęły na każdy kurs rynkowy.

curl https://api.frankfurter.dev/v2/rates?expand=providers

Każdy wpis zawiera tablicę providers z kluczami źródeł. Pole to jest pomijane przy walutach powiązanych na stałe (pegged).

Format CSV

Kursy są dostępne w formacie CSV. Dodaj .csv do ścieżki lub ustaw nagłówek Accept na text/csv.

curl https://api.frankfurter.dev/v2/rates.csv

Format NDJSON

Dla dużych zbiorów użyj formatu NDJSON (Newline-Delimited JSON), ustawiając nagłówek Accept na application/x-ndjson. Każdy wiersz to osobny obiekt JSON.

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01

Pojedynczy kurs

Pobierz kurs dla wybranej pary walutowej.

curl https://api.frankfurter.dev/v2/rate/eur/usd

Waluty

Lista dostępnych walut i ich źródeł.

curl https://api.frankfurter.dev/v2/currencies

Uwzględnij waluty historyczne za pomocą parametru scope.

curl https://api.frankfurter.dev/v2/currencies?scope=all

Pojedyncza waluta

Szczegóły i źródła dotyczące konkretnej waluty.

curl https://api.frankfurter.dev/v2/currency/eur

Źródła

Lista instytucji dostarczających dane do API.

curl https://api.frankfurter.dev/v2/providers

Szczegółowe informacje o wybranej instytucji.

curl https://api.frankfurter.dev/v2/providers/ecb

Kursy według źródła

Pobieraj kursy bezpośrednio od wybranej instytucji. Obowiązują te same parametry co w /v2/rates.

curl https://api.frankfurter.dev/v2/providers/ecb/rates

Pojedyncza para walutowa z tego źródła:

curl https://api.frankfurter.dev/v2/providers/ecb/rate/eur/usd

Kursy wybranej pary w czasie. Działa z parametrem date, zakresami (from i to) oraz formatami .csv i ndjson.

curl https://api.frankfurter.dev/v2/providers/ecb/rates?date=2024-05-15

Przeliczanie walut

Nie ma osobnego endpointu do przeliczania. Pobierz kurs i wykonaj mnożenie w kodzie.

function convert(base, quote, amount) {
  const api = "https://api.frankfurter.dev";
  return fetch(`${api}/v2/rate/${base}/${quote}`)
    .then((r) => r.json())
    .then((d) => (amount * d.rate).toFixed(2));
}

convert("eur", "usd", 10).then((result) =>
  alert(`10 EUR = ${result} USD`)
);

Błędy

API zwraca standardowe kody błędów HTTP wraz z obiektem JSON.

{
  "message": "Could not find currency ABC"
}
400
Nieprawidłowy parametr lub błędne zapytanie.
404
Nie znaleziono waluty, kursu ani zasobu.
422
Zapytanie zrozumiałe, ale nie może zostać przetworzone.

Własny hosting

Możesz samodzielnie hostować Frankfurter za pomocą Dockera. Przewodnik wdrażania opisuje konfigurację produkcyjną oraz klucze API.

FAQ

Do czego nadaje się Frankfurter (a do czego nie)?
API sprawdza się w rozliczeniach SaaS, e-commerce, raportach podatkowych, systemach ERP i księgowych oraz badaniach na danych od 1948 roku. Nie jest przeznaczone do handlu w czasie rzeczywistym ani transakcji intraday.
Czy mogę używać Frankfurter komercyjnie?
Tak. Do danych źródłowych mają zastosowanie warunki poszczególnych instytucji.
Czy obowiązują limity zapytań?
Nie ma limitów kwotowych. Działa zabezpieczenie przed przeciążeniem, ale brak dziennych i miesięcznych limitów. Przy dużym wolumenie zalecamy buforowanie, własny hosting lub bezpośrednie pobieranie zbiorów danych.
Czy API obsługuje GraphQL?
Nie. REST API jest na tyle proste, że GraphQL wprowadziłby tylko zbędną złożoność i uniemożliwił buforowanie brzegowe. Parametry base, quotes oraz from/to zapewniają dokładny wybór danych.
Czy wersja v1 API zostanie wyłączona?
Nie. API v1 jest oznaczone jako deprecated na rzecz v2, ale pozostaje stale dostępne. Zobacz dokumentację v1. Dane EBC znajdziesz w /v2/providers/ecb/rates.
Jak chroniona jest prywatność?
Frankfurter nie przechowuje danych osobowych, adresów IP ani odpytywanych URL-i. Gromadzimy wyłącznie anonimowe statystyki zbiorcze na własnej instancji Plausible Analytics.
Czy muszę deklarować to API w informacjach o prywatności w App Store lub Google Play?
Nie. Zapytania są anonimowe i nie są rejestrowane. Zgodnie z wytycznymi Apple i Google stanowią dane niepodlegające zbieraniu.
Gdzie zgłaszać błędy lub zadawać pytania?
Otwórz zgłoszenie (issue), aby zgłosić błąd lub zaproponować nowe źródło. Pytania i projekty społeczności należy kierować do dyskusji (discussions).
Jak dokładne są prezentowane kursy?
Do celów sprawozdawczości filtruj według konkretnej instytucji, aby otrzymać jej oficjalne kursy referencyjne. W innych zastosowaniach sprawdza się domyślny kurs rynkowy.
Czy są to kursy średnie, kupna czy sprzedaży?
API zwraca kursy średnie (mid-market). Jeśli dane źródło publikuje kursy kupna i sprzedaży zamiast referencyjnego, Frankfurter zapisuje oba i oblicza średnią.
Czy wszystkie kursy są publikowane codziennie?
Prawie wszystkie. Jedynie 2 źródła publikują rzadziej: brytyjski urząd skarbowy HMRC (miesięcznie) oraz Departament Skarbu USA UST (kwartalnie). Ich kursy nie wchodzą do feedu łączonego i są dostępne przy bezpośrednim odpytaniu źródła.
Dlaczego okresy niektórych starych i nowych walut się pokrywają?
Część instytucji datuje nowe waluty wstecznie w okres obowiązywania poprzedniej waluty (np. TRL kończy się w 2010 roku, a TRY zaczyna już w 1996). Przejmujemy dane źródłowe bez zmian i filtrujemy nakładanie dopiero przy łączeniu.
Dlaczego Frankfurter?
Ponieważ Europejski Bank Centralny, od którego danych wszystko się zaczęło, ma swoją siedzibę we Frankfurcie.
European Central Bank and Main riverfront, Frankfurt