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/rates

Basiswährung mit base ändern.

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

Zielwährungen mit quotes filtern.

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

Historische Kurse

Kurse für ein bestimmtes Datum abfragen.

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

Zeitreihen

Kurse über einen Zeitraum mit from und to abrufen.

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

Tipp: 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=month

Nach 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.csv

NDJSON-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-01

Einzelkurs

Kurs für ein einzelnes Währungspaar abrufen.

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

Währungen

Verfügbare Währungen und ihre Quellen abrufen.

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

Ehemalige Währungen mit scope einbeziehen.

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

Einzelne Währung

Details und Quellen einer einzelnen Währung abrufen.

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

Quellen

Datenquellen hinter der API auflisten.

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

Details zu einer einzelnen Quelle abrufen.

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

Kurse 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/rates

Ein 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-15

Umrechnung

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, quotes und from/to holst 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 TRL 2010, TRY beginnt 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.
European Central Bank and Main riverfront, Frankfurt