Frankfurter
Frankfurter erfasst tägliche Wechselkurse von 98 Zentralbanken und offiziellen Quellen für 206 Währungen. Die Daten reichen bis 1948 zurück.
Die öffentliche API ist unter api.frankfurter.dev erreichbar und erfordert keinen API-Schlüssel. Das Projekt ist Open Source. Für volle Kontrolle kannst du es auch selbst hosten.
Arbeitest du mit einem KI-Agenten? Gib ihm die llms.txt oder binde den MCP-Server ein.
Kurse
Aktuelle Wechselkurse abrufen.
curl https://api.frankfurter.dev/v2/ratesBasiswährung mit base ändern.
curl https://api.frankfurter.dev/v2/rates?base=usdZielwährungen mit quotes filtern.
curl https://api.frankfurter.dev/v2/rates?quotes=usd,gbpHistorische Kurse
Kurse für ein bestimmtes Datum abfragen.
curl https://api.frankfurter.dev/v2/rates?date=1999-01-04Zeitreihen
Kurse über einen Zeitraum mit from und to abrufen.
curl https://api.frankfurter.dev/v2/rates?from=2026-01-01"es=usdTipp: Frag nur die Währungen ab, die du brauchst. Das hält Antworten klein. Bei langen Zeiträumen hilft NDJSON: Die Ergebnisse kommen zeilenweise als Stream.
Gruppierung
Zeitreihen mit group verdichten. Mögliche Werte: week und month.
curl https://api.frankfurter.dev/v2/rates?from=2026-01-01&group=monthNach Quelle filtern
Mit providers nur bestimmte Quellen abfragen.
curl https://api.frankfurter.dev/v2/rates?providers=ecb Standardmäßig kombiniert die API die Kurse aller Quellen. Für die Kurse einer einzelnen Quelle nutze providers oder frag die Quelle direkt über ihre eigenen Endpunkte ab.
Quellenangabe
expand=providers zeigt, welche Quellen in jeden kombinierten Kurs eingeflossen sind.
curl https://api.frankfurter.dev/v2/rates?expand=providers Jeder Eintrag erhält ein providers-Array mit den Kennungen der beteiligten Quellen. Bei Währungen mit fester Bindung fehlt das Feld. Ihre Kurse ergeben sich aus der Bindung, nicht aus Quellendaten.
CSV-Ausgabe
Kurse sind auch als CSV verfügbar. .csv an den Pfad anhängen oder den Accept-Header auf text/csv setzen.
curl https://api.frankfurter.dev/v2/rates.csvNDJSON-Ausgabe
Für große Antworten NDJSON (Newline-Delimited JSON) anfordern: den Accept-Header auf application/x-ndjson setzen. Jede Zeile ist ein eigenständiges JSON-Objekt. So lassen sich lange Zeitreihen streamen, ohne die ganze Antwort zu puffern.
curl https://api.frankfurter.dev/v2/rates?from=2026-01-01Einzelkurs
Kurs für ein einzelnes Währungspaar abrufen.
curl https://api.frankfurter.dev/v2/rate/eur/usdWährungen
Verfügbare Währungen und ihre Quellen abrufen.
curl https://api.frankfurter.dev/v2/currenciesEhemalige Währungen mit scope einbeziehen.
curl https://api.frankfurter.dev/v2/currencies?scope=allEinzelne Währung
Details und Quellen einer einzelnen Währung abrufen.
curl https://api.frankfurter.dev/v2/currency/eurQuellen
Datenquellen hinter der API auflisten.
curl https://api.frankfurter.dev/v2/providersDetails zu einer einzelnen Quelle abrufen.
curl https://api.frankfurter.dev/v2/providers/ecbKurse nach Quelle
Kurse direkt von einer bestimmten Quelle abfragen. Es gelten dieselben Parameter wie bei /v2/rates und /v2/rate.
curl https://api.frankfurter.dev/v2/providers/ecb/ratesEin einzelnes Währungspaar dieser Quelle abrufen.
curl https://api.frankfurter.dev/v2/providers/ecb/rate/eur/usd Kurse für ein Währungspaar über einen Zeitraum abrufen. Kombinierbar mit date, Datumsbereichen (from und to) oder Gruppierung. Formate wie .csv und ndjson funktionieren hier ebenfalls.
curl https://api.frankfurter.dev/v2/providers/ecb/rates?date=2024-05-15Umrechnung
Es gibt keinen separaten Umrechnungs-Endpunkt. Den Kurs abrufen und mit wenigen Zeilen Code umrechnen.
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`)
);Fehler
Die API antwortet mit Standard-HTTP-Statuscodes und einem JSON-Body.
{
"message": "Could not find currency ABC"
}400- Ungültiger Parameter oder fehlerhafte Anfrage.
404- Währung, Kurs oder Ressource nicht gefunden.
422- Anfrage verstanden, kann aber nicht verarbeitet werden.
Self-Hosting
Du kannst Frankfurter mit Docker selbst hosten. Die Deployment-Anleitung erklärt den Produktivbetrieb und die Einrichtung von API-Schlüsseln.
FAQ
- Wofür eignet sich Frankfurter (und wofür nicht)?
- Die API eignet sich für SaaS-Abrechnung, E-Commerce, Steuerreporting, ERP- und Buchhaltungssysteme sowie Forschung mit historischen Zeitreihen ab 1948. Nicht gedacht ist sie für Echtzeithandel oder für Geschäfte mit exotischen Währungen, die im Tagesverlauf stark schwanken.
- Darf ich Frankfurter kommerziell nutzen?
- Ja, natürlich. Für die zugrunde liegenden Daten gelten die Bedingungen der jeweiligen Quelle.
- Gibt es Abfragekontingente oder Limits?
- Es gibt keine Kontingente. Gegen Missbrauch gilt ein Rate Limit, aber keine monatliche oder tägliche Obergrenze. Bei hohem Volumen lohnt es sich, Antworten zu cachen, selbst zu hosten oder die Datensätze direkt abzufragen.
- Unterstützt die API GraphQL?
- Nein. Die REST-API ist so einfach, dass GraphQL nur Komplexität hinzufügen würde, ohne viel zu bringen. Außerdem würde es das Edge-Caching aushebeln, das die API schnell macht. Mit Query-Parametern wie
base,quotesundfrom/toholst du genau die Daten, die du brauchst. - Wird die v1-API eingestellt?
- Nein. Die v1-API ist zugunsten von v2 als veraltet markiert, bleibt aber dauerhaft verfügbar. Mehr dazu in der v1-Dokumentation. EZB-Daten liefert /v2/providers/ecb/rates.
- Wie hält es die API mit dem Datenschutz?
- Frankfurter speichert weder personenbezogene Daten noch IP-Adressen noch aufgerufene URLs. Wir erfassen nur anonyme Gesamtzahlen zur Nutzung (über eine selbst gehostete Instanz von Plausible Analytics).
- Muss ich die API in den Datenschutzangaben im App Store oder bei Google Play aufführen?
- Nein. Anfragen sind anonym und werden nicht protokolliert. Nach den Richtlinien von Apple und Google Play gelten sie damit als nicht erfasste Daten.
- Wo kann ich Fehler melden oder Fragen stellen?
- Öffne ein Issue, um Fehler zu melden, Funktionen vorzuschlagen oder neue Datenquellen anzuregen. Fragen und eigene Bibliotheken oder Tools rund um Frankfurter gehören in die Discussions.
- Wie genau sind die Kurse?
- Für Compliance filterst du nach einer einzelnen Quelle und bekommst deren offizielle Referenzkurse. Für alles andere passen die kombinierten Standardkurse, auch wenn sich die letzten Nachkommastellen mit neuen Daten noch verschieben können.
- Sind die Kurse Mittel-, Geld- oder Briefkurse?
- Die API gibt Mittelkurse (Mid-Market) zurück. Veröffentlicht eine Quelle Geld- und Briefkurse statt eines Referenzkurses, speichert Frankfurter beide und berechnet den Mittelwert.
- Werden alle Kurse täglich veröffentlicht?
- Fast alle. Nur 2 Quellen veröffentlichen seltener: die britische Steuerbehörde HMRC (monatlich) und das US-Finanzministerium UST (vierteljährlich). Ihre Kurse gelten jeweils Wochen oder Monate, deshalb fließen sie nicht in den kombinierten Feed ein. Du bekommst sie nur, wenn du diese Quellen direkt abfragst.
- Warum überschneiden sich bei manchen alten und neuen Währungen die Zeiträume?
- Einige Quellen datieren Nachfolgewährungen in die Zeit der Vorgängerwährung zurück (z. B. endet
TRL2010,TRYbeginnt aber schon 1996). Wir übernehmen die Quellendaten unverändert und filtern Überschneidungen erst beim Kombinieren heraus. - Warum Frankfurter?
- Weil die Europäische Zentralbank, mit deren Daten alles anfing, in Frankfurt sitzt.