Era-API
Endpunkte, Authentifizierung, Paginierung und Limits der Era-API, mit Anfragen zum Kopieren.
Zuletzt aktualisiert: 8. Oktober 2026
Diese Endpunkte funktionieren schon heute, aber die API entwickelt sich noch weiter, deshalb können sich einzelne Details noch ändern. Das Datum der letzten Aktualisierung oben zeigt dir, wann diese Seite zuletzt überarbeitet wurde.
Schnellstart
Bevor du loslegst, brauchst du ein Era-Konto mit mindestens einer verbundenen Bank — ohne Verbindung haben diese Endpunkte nichts zurückzugeben.
- 1
Melde dich bei Era an und verbinde eine Bank, falls noch nicht geschehen.
- 2
Öffne deine API-Schlüssel im Dashboard und erstell einen. Die meisten Scopes sind vorab angehakt; die, mit denen sich Geld bewegen, Wertpapiere handeln, deine Abrechnung ändern, deine Dokumente löschen oder weitere Schlüssel erstellen lassen, sind es nicht. Hak die ab, die du nicht brauchst. Zum Lesen brauchst du banking:read, zum Ändern banking:write. Du wählst außerdem eine Gültigkeitsdauer; eine Option „läuft nie ab“ gibt es nicht.
- 3
Kopier den Schlüssel und bewahr ihn an einem sicheren Ort auf, zum Beispiel in einem Secrets-Manager. Er wird nur einmal angezeigt. Verlierst du ihn, leg einen neuen an.
- 4
Schick ihn mit deinem Request im Header mit.
curl "https://forge.era.app/api/banking/transactions?page=1&pageSize=20" \
-H "X-API-Key: fmk_your_key_here"{
"transactions": [ … ],
"pagination": {
"currentPage": 1,
"pageSize": 20,
"totalItems": 412,
"totalPages": 21
},
"historyWindowApplied": true,
"historyWindowFloorDate": "2026-06-28",
"historyWindowHiddenCount": 137,
"historyWindowEarliestDate": "2024-03-02",
"historyWindowDegraded": false
}Schreibst du deinen eigenen Client? Generiere ihn aus dem OpenAPI-Dokument unter https://forge.era.app/api/openapi/public.json. Es beschreibt jeden Endpunkt auf dieser Seite — jedes Feld, jeden Status und jede Art von Regelfilter und Regelaktion —, und die API liefert es selbst aus, sodass es nicht veraltet.
Endpunkte
Zwanzig Endpunkte: zehn zum Lesen und zehn zum Schreiben.
- GET
- GET/banking
/accounts /{accountId} /balance - GET/banking
/accounts /summary - GET/banking
/transactions - PUT/banking
/transactions /{id} - PUT/banking
/transactions /bulk - GET/banking
/categories - POST/banking
/categories - GET/banking
/tags - POST/banking
/tags - PUT/banking
/transactions /tags - GET
- GET/banking
/analytics /cash-flow-summary - GET
- POST/banking
/rules - POST/banking
/rules /preview - PUT/banking
/rules /{ruleId} - POST/banking
/rules /{ruleId} /enable - POST/banking
/rules /{ruleId} /disable - DELETE/banking
/rules /{ruleId}
Authentifizierung
Sende deinen Schlüssel auf eine von zwei Arten:
- Header
- X-API-Key: fmk_your_key_here
- Bearer-Token
- Authorization: Bearer fmk_your_key_here
Jeder Request ist TLS-verschlüsselt.
Schlüssel laufen ab, und du wählst beim Erstellen, wie bald. Das Maximum sind 90 Tage im kostenlosen Tarif und 365 in einem bezahlten — eine Option „läuft nie ab“ existiert nicht, also braucht alles, was du darauf baust, einen Plan zum Rotieren des Schlüssels, bevor er verfällt.
Antwort-Header
Die X-RateLimit-*-Header melden dein Tagesbudget, deshalb siehst du sie nur in einem Tarif mit veröffentlichtem Tagesbudget. Vorerst ist das nur der kostenlose Tarif. Selbst dort solltest du sie als optional behandeln: Eine Antwort ohne sie heißt, dass der Stand unbekannt ist, nicht, dass etwas schiefgelaufen ist. Jeder 429 trägt Retry-After.
- X-RateLimit-Limit
- Das Tagesbudget deines Tarifs. Wird nur in Tarifen mit veröffentlichtem Tagesbudget gesendet und nie bei einem 429 von einer anderen Grenze.
- X-RateLimit-Remaining
- Was von deinem Tagesbudget übrig ist. Nie unter null. Wird nur in Tarifen mit veröffentlichtem Tagesbudget gesendet und nie bei einem 429 von einer anderen Grenze.
- X-RateLimit-Reset
- Wann dein Tagesbudget als Nächstes eine Anfrage freigibt, als Unix-Zeitstempel in Sekunden. Das ist nicht der Zeitpunkt, an dem das ganze Budget wieder voll ist: Das Budget rollt, Anfragen kommen also einzeln zurück. Wird nur in Tarifen mit veröffentlichtem Tagesbudget gesendet und nie bei einem 429 von einer anderen Grenze. Die Minuten-Burst-Grenze hat keinen eigenen Header. Siehe Limits
- Retry-Afternur bei 429
- Jeder 429 trägt Retry-After: Warte so viele Sekunden und versuche es dann erneut. Trägt ein 429 zusätzlich die X-RateLimit-*-Header, hat ihn das Tagesbudget des kostenlosen Tarifs abgelehnt. Ein 429 ohne sie wurde von einer anderen Grenze abgelehnt, etwa der Minuten-Burst-Grenze. Retry-After kann zwischen einer Sekunde und 24 Stunden liegen. Siehe Limits
Fehler
Die API liefert diese Fehler-Statuscodes:
- 400
Fehlerhafte Eingabe: ein falscher Parameter, ein leeres oder über 100 Einträge großes Bulk-Update oder eine solche Tag-Zuweisung, ein Schreibzugriff, der dasselbe Feld im selben Aufruf setzt und löscht, oder eine Regel, die nicht in sich stimmig ist. Löschen, Einschalten und Ausschalten einer Regel lehnen außerdem jeden Query-Schlüssel ab, den sie nicht kennen, und die 400 nennt ihn. Einen Tag mit einem Namen anzulegen, den du schon hast, oder eine Kategorie mit einem slug, den schon eine sichtbare, von dir angelegte Kategorie nutzt, ist ebenfalls ein 400, kein 409.
- 401
Kein Schlüssel, oder einer, der sich nicht parsen lässt. Sende ihn als X-API-Key-Header oder als Bearer-Token.
- 402
Ein Tarifkontingent steht im Weg. Heute betrifft das nur das Anlegen einer Kategorie oder einer Musterregel. Warten löst es nicht, ein größerer Tarif schon. Zu schnelles Aufrufen ist dagegen ein 429.
- 403
Der Schlüssel trägt nicht den Scope, den dieser Aufruf braucht — oder, bei einem Transaktions-Schreibzugriff oder einer Tag-Zuweisung, eine ID gehört jemand anderem oder existiert gar nicht. Die API unterscheidet die beiden Fälle nicht. Eine Regel aus Eras Bibliothek antwortet mit 403, wenn du sie löschen oder ihren Namen, ihre Beschreibung, Priorität, Daten oder applicationScope ändern willst. Änderst du ihre Filter, Aktionen oder Gruppe, kommt stattdessen eine 400.
- 404
Etwas, das es nicht gibt. Der Kontostand-Endpunkt gibt es ohne Body zurück, für einen accountGroupKey, der kein Konto benennt, oder einen, der gar nicht wie ein Schlüssel aussieht. Die Regel-Endpunkte geben es für einen Regelschlüssel zurück, der nicht zu deinen gehört, und eine Tag-Zuweisung für einen tagKey, der keiner deiner Tags ist oder den du gelöscht hast. Transaktionen liefern nie 404 — siehe 403.
- 409
Etwas anderes hat die Zeile geändert, während du geschrieben hast — bei einer Regel heißt das: eine version, die nicht mehr die aktuelle ist; lies sie erneut und schreibe erneut. Zwei 409 lassen sich mit einem neuen Versuch nicht beheben: Bei einer Regel würden ihre Aktionen Regeln in einer Schleife auslösen, also ändere die Aktionen; und bei einer Tag-Zuweisung steht eine Transaktion noch aus, also lässt sie sich erst taggen, wenn sie gebucht ist. Beim Anlegen einer Kategorie kommt 409 nur, wenn eine andere Anfrage im selben Moment denselben slug belegt — vielleicht dein eigener erneuter Versuch. So oder so ist der slug jetzt vergeben: Nutze die Kategorie, die ihn hat, oder schick einen anderen slug.
- 429
Zu viele Anfragen. Du hast im kostenlosen Tarif dein Tagesbudget aufgebraucht oder eine andere Grenze erreicht, etwa die Minuten-Burst-Grenze. Retry-After sagt, wie lange du warten musst, zwischen einer Sekunde und 24 Stunden, und anders als bei einem 402 macht Warten deine nächste Anfrage frei. Unter Limits stehen die veröffentlichten Zahlen und was ein 429 dir sagt.
Fehlerformen
Die meisten Fehler kommen in derselben Form zurück — statusCode, message und ein errors-Objekt, das benennt, was falsch war. Nicht alle: Ein 401 und der 404 des Kontostand-Endpunkts kommen ganz ohne Body zurück, lies also den Status, bevor du den Body liest.
{
"statusCode": 403,
"message": "One or more errors occurred!",
"errors": {
"generalErrors": ["Transaction does not belong to the authenticated user"]
}
}Häufige Fehler
Ein Feld im selben Schreibzugriff setzen und löschen — 400.
Mehr als 100 IDs in einem Bulk-Update oder einer Tag-Zuweisung — 400, und nichts wird geändert. Weniger als eine ID ist genauso.
Eine Transaktion, die nicht dir gehört oder gar nicht existiert — 403, niemals 404. Die Antwort verrät also nie, ob eine ID überhaupt existiert, nur dass sie nicht dir gehört.
Etwas anderes hat die Zeile zuerst geändert — 409.
Limits
Drei der dokumentierten Endpunkte begrenzen, wie viel du in einem Aufruf anfordern kannst. Die übrigen nicht.
Keine Obergrenze pro Aufruf heißt nicht unbegrenzt. Schlüssel laufen weiterhin ab, Schreibvorgänge haben weiterhin Feldlängenbegrenzungen, das Anlegen einer Kategorie oder einer Musterregel kann an ein Tarifkontingent stoßen, dein Tarif kann weiterhin älteren Verlauf ausblenden, und jeder Aufruf zählt gegen die Rate-Limits deines Tarifs, die unten beschrieben sind.
Konten, Kontostand, Übersicht, die Kategorie- und Tag-Listen, das Anlegen einer Kategorie, das Anlegen eines Tags, das Schreiben einzelner Transaktionen, die Liste der wiederkehrenden Zahlungen, die Cashflow-Übersicht und jeder Regel-Endpunkt haben kein Volumenlimit pro Aufruf. Du bekommst entweder die gesamte Menge zurück oder genau die eine Zeile, die du benannt hast — außer bei der Regelvorschau, die die Treffer zählt, aber höchstens 50 ihrer Schlüssel und 10 Stichproben zurückgibt, und bei der Cashflow-Übersicht, die je Seite nur so viele Kategorien auflistet, wie topN verlangt.
pageSize wird gekappt, nicht abgelehnt: Fordere mehr als 100 an, und du bekommst 100 Zeilen mit einem 200 zurück; fordere weniger als eins an, und du bekommst eine. Lies pagination.pageSize aus der Antwort, statt dem zu vertrauen, was du gesendet hast.
Der Bulk-Schreibzugriff für Transaktionen und die Tag-Zuweisung sind jeweils auf 100 IDs gedeckelt, und anders als pageSize werden sie abgelehnt statt gekappt: Sende 101, und du bekommst einen 400, und nichts ändert sich.
Schlüssel laufen nach einem Zeitplan ab, den du bei der Erstellung wählst — bis zu 90 Tage im kostenlosen Tarif, 365 in einem bezahlten. Es gibt keine Option, die nie abläuft.
Dein Tarif kann eine Verlaufsfenster-Untergrenze setzen, die ältere Transaktionen verbirgt. Die Transaktions-Antwort trägt die historyWindow-Felder, die dir sagen, ob eine galt und wo sie lag.
Rate-Limits
Era veröffentlicht zwei Rate-Limits. Jeder Tarif hat eine Burst-Grenze: eine Obergrenze für Anfragen innerhalb jeder gleitenden Minute. Der kostenlose Tarif hat zusätzlich ein Tagesbudget: eine Obergrenze für Anfragen innerhalb von jeweils 24 gleitenden Stunden. Eine Anfrage zählt eine Minute, nachdem du sie gestellt hast, nicht mehr gegen die Burst-Grenze und einen Tag danach nicht mehr gegen das Tagesbudget. Bezahlte Tarife haben vorerst kein veröffentlichtes Tagesbudget. Überschreitest du eine der beiden oder eine andere Grenze, die die API durchsetzt, kommt der Aufruf mit 429 zurück.
Grenzen gehören zu deinem Konto, nicht zu einem Schlüssel. Jeder REST-Schlüssel, den du anlegst, zählt gegen dieselbe Burst-Grenze und, im kostenlosen Tarif, gegen dasselbe Tagesbudget. Ein zweiter Schlüssel bringt dir also keine zusätzlichen Aufrufe. MCP-Tool-Aufrufe werden getrennt gezählt, REST- und MCP-Aufrufe verbrauchen also nie die Grenzen des jeweils anderen.
| Tarif | Tagesbudget | Burst-Grenze |
|---|---|---|
| Basic | 100 pro Tag | 10 pro Minute |
| Organize | Keins | 30 pro Minute |
| Automate | Keins | 60 pro Minute |
| Optimize | Keins | 60 pro Minute |
| Operate | Keins | 120 pro Minute |
Vorerst haben bezahlte Tarife kein veröffentlichtes Tagesbudget.
Bezahlte Tarife gelten außerdem im Rahmen der fairen Nutzung: Die API ist für Skripte, Dashboards und Integrationen mit deinen eigenen Finanzdaten gedacht, in einem Umfang, der zu einer Person passt.
Kein Header meldet die Burst-Grenze, in keinem Tarif. Richte dein Tempo also nach der Tabelle. Im kostenlosen Tarif kann X-RateLimit-Remaining deutlich über null stehen, kurz bevor ein Burst mit 429 zurückkommt.
Was ein 429 dir sagt
Welche Grenze dich abgewiesen hat. Ein 429 mit den X-RateLimit-*-Headern kam vom Tagesbudget des kostenlosen Tarifs, einer ohne sie von einer anderen Grenze, etwa der Burst-Grenze. Der Body ist im Problem-Details-Format, und sein detail-Feld sagt, wann deine nächste Anfrage frei wird. Hat dich das Tagesbudget oder die Burst-Grenze abgewiesen, nennt es außerdem diese Grenze, was sie erlaubt und den Tarif, der sie anhebt oder aufhebt, oder dass du schon im höchsten bist. Es ist für Menschen geschrieben, lies also die Header, statt es zu parsen.
{
"type": "https://httpstatuses.com/429",
"title": "Too Many Requests",
"status": 429,
"detail": "You've used up your daily budget of 100 requests. Your next request frees up at 2026-09-16T09:00:00Z. The Organize plan removes it."
}Jeder 429 enthält außerdem Retry-After: eine ganze Zahl von Sekunden, von einer Sekunde bis zu 24 Stunden. Bei der Burst-Grenze beträgt die Wartezeit höchstens eine Minute; das Tagesbudget des kostenlosen Tarifs kann die vollen 24 Stunden verlangen. Ein abgewiesener Aufruf zählt gegen keine Grenze, aber versuche es nicht zu früh erneut: Warte bei jedem 429 Retry-After ab. Beim Tagesbudget und bei der Burst-Grenze wird ein zu früher Versuch wieder abgewiesen, und wenn die Wartezeit endet, wird eine Anfrage frei, nicht die ganze Grenze. Sende sie und lies, was zurückkommt: ein weiteres Retry-After, wenn sie abgewiesen wird, oder im kostenlosen Tarif die Header, sobald sie bedient ist.
Rate-Limits schützen keinen Schlüssel, den du aus den Augen verloren hast. Ein geleakter Schlüssel zieht von denselben Limits ab wie jeder andere Schlüssel in deinem Konto, und er kann alles, was seine Scopes erlauben. Ihn zu widerrufen erstattet keine Aufrufe, die er schon gemacht hat. Wenn du dir bei einem Schlüssel unsicher bist, widerrufe ihn. Siehe Sicherheit und Schlüsselverwaltung weiter unten.
Konventionen
Antwortfelder sind camelCase. Bei den Namen von Query-Parametern spielt die Groß- und Kleinschreibung keine Rolle, ansonsten müssen sie aber genau so geschrieben sein wie auf dieser Seite – pageSize und PageSize funktionieren also beide. Die veröffentlichte Spezifikation schreibt die meisten davon in PascalCase. Die meisten Endpunkte ignorieren einen Query-Schlüssel, den sie nicht kennen – ein falsch geschriebener Filter filtert dann einfach nicht, also prüf, was zurückkommt. Die Ausnahme sind Löschen, Einschalten und Ausschalten einer Regel: Sie lehnen jeden anderen Schlüssel mit einer 400 ab, die ihn nennt. Schick revert_retroactively mit dem Unterstrich – revertRetroactively wird abgelehnt – und nur beim Löschen und Ausschalten, denn Einschalten nimmt nur version.
Ein Feld, das einen Kalendertag nennt, ist YYYY-MM-DD. Ein Feld, das einen Zeitpunkt nennt, ist ISO 8601 mit Zeitzonenversatz.
pageSize wird gekappt, nicht abgelehnt. Frag 500 an, und du bekommst 100 Zeilen und ein 200, keinen Fehler; frag weniger als eins an, und du bekommst eine. page hat eine Untergrenze, aber keine Obergrenze: Unter eins wird zur ersten Seite, und hinter der letzten Seite bekommst du mit einem 200 eine leere, nicht die letzte. Lies also pagination.currentPage, pagination.pageSize und pagination.totalPages aus der Antwort zurück, statt dich auf das zu verlassen, was du geschickt hast.
Eine Antwort kann Felder tragen, die diese Seite nicht aufführt. Ignorier die, die du nicht kennst, statt daran zu scheitern — das hält deinen Client am Laufen, während die API wächst.
REST ist schlichtes HTTP, für den Aufruf braucht es also kein SDK — jede Sprache mit einem HTTP-Client reicht aus. Es gibt nichts zu installieren.
Versionierung und Änderungen
Die API ist in der Beta, deshalb kann sich das hier Dokumentierte noch ändern: ein Endpunkt, ein Feld oder wie sich ein Aufruf verhält.
Es gibt keine Versionsnummer im Pfad und keinen Versions-Header. Jeder Endpunkt hat eine aktive Version, und das ist die hier dokumentierte.
Changelog
Was sich an der Era Developer Platform geändert hat, einschließlich der Era API, neueste Änderungen zuerst. Es gibt keine E-Mail und keinen Feed, schau also ins Changelog, wenn du Arbeit an der API planst.
Sicherheit und Schlüsselverwaltung
Einen Agenten freizugeben erzeugt einen Schlüssel
Wenn du einen Agenten per OAuth freigibst, erstellt Era ihm einen API-Schlüssel. Er landet in derselben Dashboard-Liste wie die, die du selbst anlegst, unter einem Namen, den Era aus dem Namen des Clients bildet.
Wie er heißt
Auto -- ClaudeEr trägt genau die Scopes, die du auf diesem Bildschirm freigegeben hast, und sonst nichts. Widerrufe ihn im Dashboard, und der Agent bekommt keinen neuen Zugriff, bis du ihn erneut freigibst. Ein Token, das er schon hat, funktioniert weiter, bis es abläuft — höchstens eine Stunde.
Schreibzugriffe stehen in deinem Aktivitätsprotokoll, Lesezugriffe nicht
Das Erstellen und das Widerrufen eines Schlüssels stehen beide in deinem Aktivitätsprotokoll, ebenso jeder Tool-Aufruf, den ein Agent über MCP macht. Ein REST-Schreibzugriff steht ebenfalls darin — als die Änderung, die er gemacht hat, etwa ein angelegter Tag oder eine bearbeitete Transaktion. Ein REST-Lesezugriff erzeugt überhaupt keinen Eintrag. Era schreibt diese Einträge in jedem Tarif mit, aber um das vollständige Protokoll zu lesen, brauchst du Organize oder höher — darunter siehst du nur die neuesten Einträge. Einträge zu einem Schreibzugriff nennen dein Konto, nicht den Schlüssel, der die Änderung gemacht hat.
Wenn du dir bei einem Schlüssel je unsicher bist, widerrufe ihn. Ein selbst erstellter Schlüssel funktioniert ab seiner nächsten Anfrage nicht mehr, auf REST wie auf MCP. Der Schlüssel eines Agenten bekommt sofort keinen neuen Zugriff mehr, und ein Token, das er schon hat, läuft innerhalb einer Stunde ab. Ein Ersatz ist in einer Minute erstellt.
- Scopes sind grob
- banking:read deckt weit mehr ab als die Lesezugriffe auf dieser Seite — derselbe Scope deckt auch alle übrigen Lesezugriffe deines Kontos ab: Salden, Positionen, Verbindungen, Ausgaben. Ein Scope, enger geht es nicht. Schreib-Scopes stehen ebenfalls zur Auswahl — behandle also jeden Schlüssel wie ein Passwort. Er handelt als dein Era-Konto, nicht nur als ein Ausschnitt davon.
- banking:write ändert Era, nicht deine Bank
- banking:write ändert nur, was Era speichert, nicht das, was deine Bank führt. Er kann kein Geld bewegen und keine Zahlung leisten. Wie banking:read ist auch banking:write ein einziger, breiter Scope. Er umfasst die Änderungen, die du in Era auch selbst vornehmen kannst, etwa Kategorie, Händlername, Notiz und Prüfstatus einer Transaktion; Kategorien, Tags und Automatisierungsregeln; die Namen, die Era für deine Konten anzeigt, und welche Konten du siehst; sowie manuelle Konten mit ihren Salden und Transaktionen. Er kann eine neue Verbindung starten, aber bei deiner Bank meldest du dich weiterhin selbst an, in der Strecke des Anbieters und nicht über den Schlüssel. Er kann eine neue Synchronisierung anstoßen, die nur liest, oder ein Institut trennen. Das Trennen beendet Eras Verbindung, und dein Konto bei der Bank bleibt offen und unverändert.
- Scopes aktualisieren sich nicht
- Die Scopes eines Schlüssels stehen beim Erstellen fest und ändern sich danach nie. Das ist für alles wichtig, was ein Scope abdeckt und noch nicht aktiviert ist: gib social:write heute frei, und der Schlüssel hat ihn auch dann noch, wenn es geteilte Ansichten gibt. Gib frei, was du jetzt nutzt, nicht was du vielleicht nutzen wirst.
- Keine Freigabe nötig
- Für einen neuen Schlüssel gibt es keine Prüfung und keine Warteliste: Niemand bei Era gibt die Anfrage frei. Er wird sofort in dein Aktivitätsprotokoll geschrieben, sodass ein unbekannter Schlüssel leicht auffällt.
- Bank-Login bleibt unerreichbar
- Ein Schlüssel erreicht dein Bank-Login nicht, weil Era es nie hat. Du gibst es in der Verbindungsstrecke des Datenanbieters ein, nicht auf einem Era-Bildschirm — was Era danach behält, ist ein mit AES-256 verschlüsseltes Zugriffstoken pro Verbindung, das du durch Trennen der Bank wegwerfen kannst.
- Era speichert nur einen Hash deines Schlüssels
- Dein Schlüssel besteht aus 256 Bit Zufallsdaten. Era hasht ihn mit SHA-256 und behält nur den Hash. Verlierst du ihn also, widerrufst du ihn und erstellst einen neuen.
Kernressourcen
Konten
Jedes Konto, das du sehen kannst, über alle verbundenen Banken hinweg, und daneben die Zahl der ausgelassenen: excludedAccountCount, aufgeteilt in tierExcludedAccountCount für die Konten, die das Live-Datenquellen-Limit deines Tarifs auslässt, und userExcludedAccountCount für die, die du ausgeblendet hast. accountLimit ist, wie viele Konten aus Live-Datenquellen dein Tarif gleichzeitig zeigt, über alle deine Verbindungen hinweg. Manuelle Konten zählen dabei nicht mit. accountLimitLift nennt den günstigsten Tarif, der Platz für jedes Konto aus Live-Datenquellen hat, das du nicht ausgeblendet hast, und ist null, wenn dein Tarif nichts auslässt. Jedes Konto trägt seinen accountGroupKey — den Wert, den der Salden-Endpunkt in seinem Pfad nimmt — und die connectionId, zu der es gehört, deshalb ist das der erste Aufruf. Nimmt connectionId, um auf eine einzelne Verbindung einzugrenzen (die Zahlen grenzen sich mit ein, accountLimit und accountLimitLift nicht), includeExcluded, um die Konten hereinzuholen, die dein Tarif auslässt, und die, die du ausgeblendet hast, und includeSevered, um die Konten von Verbindungen hereinzuholen, die du getrennt hast. Das Feld archive jedes Kontos sagt, ob es archiviert ist und warum; Archivieren ändert, wie ein Konto aufgeführt wird, nie einen Saldo oder eine Zahl.
- connectionIdoptional
- Grenzt die Liste auf die Konten einer Verbindung ein.
- includeExcludedoptional
- Bezieht auch die Konten mit ein, die dein Tarif auslässt, und die, die du ausgeblendet hast, mit zurückgehaltenen Salden. Das Feld visibility jeder Zeile sagt, welcher Fall es ist: tierExcluded oder userExcluded, und visible bei denen, die du sehen kannst; Zeilen mit connectionSevered kommen nur mit includeSevered. Der Salden-Endpunkt schreibt diese Werte anders, also nutze nicht einen Parser für beide. excludedAccountCount kommt auch dann zurück, wenn das hier true ist, und diese Konten stehen schon in der Liste, also zähl die beiden nicht zusammen. Standardmäßig false.
- includeSeveredoptional
- Bezieht auch die Konten von Verbindungen mit ein, die du getrennt hast, jeweils mit visibility connectionSevered. Ein solches Konto einzublenden holt es nicht zurück, erneutes Verbinden schon. Sein Feld archive steht auf effective true, außer du hast entschieden, das Konto zu behalten. Es behält seinen letzten Saldo mit dessen Stand nur, wenn es vor dem Trennen sichtbar war; sonst werden seine Salden zurückgehalten. Diese Konten zählen nie zu excludedAccountCount oder zu den Zahlen deines Tarifs. Konten einer Verbindung, die deine Bank beendet hat, sind nicht dabei. Standardmäßig false.
{
"accounts": [
{
"accountGroupKey": "uagr_7f3c9a21",
"connectionId": "ucon_4b19e02c",
"name": "Everyday Checking",
"currentBalance": 4820.16,
"supportsTransactions": true,
…
}
],
"excludedAccountCount": 1
}Ein Saldo, der als null zurückkommt, ist nie eine Null, und visibility sagt dir, was er bedeutet. Bei einem Konto, das du ausgeblendet hast (userExcluded) oder das dein Tarif ausschließt (tierExcluded), kommen die Saldenfelder als null zurück, weil der Saldo zurückgehalten wird, nicht weil er leer ist. Bei einem sichtbaren Konto heißt ein null bei currentBalance, dass der Anbieter nie einen Saldo gemeldet hat, und supportsBalances sagt, ob diese Art von Konto überhaupt einen Saldo meldet. Ein Saldo, den der Anbieter als Null gemeldet hat, kommt weiterhin als 0 zurück. supportsTransactions ist null im selben Sinn: Era kann es nicht sagen, und nie heißt es, die Antwort sei nein. Genauso bei den Tariffeldern: Wenn Era deinen Tarif bei dieser Anfrage nicht lesen konnte, kommen tierExcludedAccountCount, userExcludedAccountCount, accountLimit und accountLimitLift alle als null zurück. accountLimit ist außerdem null bei einem Tarif ohne Live-Datenquellen-Limit, und accountLimitLift, wenn kein Tarif mehr Platz hat oder dein Tarif nichts auslässt.
Kontosaldo
One account's balance, with the credit fields filled in when the account is a liability. The path takes that account's accountGroupKey — the same value /banking/accounts returns for it. The key is not checked for shape before the lookup, so a malformed key and an unknown one answer the same way.
{
"accountGroupKey": "uagr_7f3c9a21",
"currentBalance": 4820.16,
"availableBalance": 4712.03,
"creditLimit": null,
"currencyCode": "USD",
"availableCredit": null,
"asOf": "2026-08-11T09:32:00Z",
"visibility": null
}Ein ausgeblendetes Konto, oder eines, dessen Verbindung gekappt wurde, antwortet trotzdem mit 200 — mit den Saldenfeldern auf null. Ein 404 heißt, dass es das Konto wirklich nicht gibt oder der Schlüssel nicht die Form eines Schlüssels hatte. Achte hier auf das Feld visibility: Es ist null, wenn das Konto sichtbar ist, tier_excluded, wenn das Limit deines Tarifs es auslässt, user_excluded, wenn du es ausgeblendet hast, und connection_severed, wenn seine Verbindung gekappt wurde. Bei einem tier_excluded-Konto aus einer Live-Datenquelle ist accountLimit das Live-Datenquellen-Limit deines Tarifs, und accountLimitLift nennt den günstigsten Tarif, der Platz für jedes solche Konto hat, das du nicht ausgeblendet hast, dieses eingeschlossen. Bei einem manuellen Konto und bei jedem anderen Zustand ist accountLimitLift null, und bei connection_severed ist auch accountLimit null. Bei einem sichtbaren Konto (visibility ist null) heißt ein null bei currentBalance, dass kein Saldo gemeldet wurde, nie eine Null. supportsBalances in der Zeile des Kontos in der Kontenliste sagt, ob diese Art von Konto überhaupt einen Saldo meldet.
Kontoübersicht
Summen über die Konten, die du sehen kannst, standardmäßig die Live-Konten: totalAssets, totalLiabilities und netWorthHint, also das erste minus dem zweiten. Mit simulationModes legst du fest, welche Modi zählen: Die Kontenliste und die Summen decken nur die ab, die du nennst. includedSimulationModes nennt in jeder Antwort, welche Modi sie abdecken. simulationExcludedAccountCount zählt die Konten, die du sehen kannst und die wegen ihres Modus ausgelassen wurden. totalHiddenCount ist eine eigene Zahl: die Konten, die dein Tarif oder deine eigene Sichtbarkeitseinstellung ausblendet, in jedem Modus, und nie die, die simulationModes ausgelassen hat.
- simulationModesoptional
- Welche Arten von Konten summiert werden: live für echtes Geld, paper für das Übungskonto eines Brokers, scenario für ein hypothetisches Konto. Wiederhole den Parameter, um mehrere anzufragen, etwa simulationModes=live&simulationModes=paper. Lässt du ihn weg, zählen nur Live-Konten. Ein leerer oder unbekannter Wert wird mit einem 400 abgelehnt, das die erlaubten Werte nennt.
{
"userId": "7d1c0b93a8e24f60",
"accounts": [ … ],
"totalVisibleCount": 6,
"totalHiddenCount": 2,
"totalAssets": 48210.75,
"totalLiabilities": 9327.40,
"netWorthHint": 38883.35,
"includedSimulationModes": [ "live" ],
"simulationExcludedAccountCount": 0,
"computedAt": "2026-08-11T09:32:00Z"
}netWorthHint zählt nur die Konten in dieser Antwort, und zwei Zahlen sagen dir, was er auslässt. simulationExcludedAccountCount sind die Konten außerhalb der Modi, die du angefragt hast. totalHiddenCount sind die Konten, die dir in jedem Modus ausgeblendet sind. Die Zahl teilt sich in zwei: tierExcludedAccountCount für die, die das Live-Datenquellen-Limit deines Tarifs auslässt, und userExcludedAccountCount für die, die du selbst ausgeblendet hast. Beide sind null, wenn Era deinen Tarif bei diesem Aufruf nicht lesen konnte. accountLimitLift nennt den günstigsten Tarif, der die erste Sorte zurückholt, und ist null, wenn es keine gibt. Ein Konto, dessen Saldo nicht gemeldet wurde, steht trotzdem in der Liste, trägt aber nichts zu den Summen bei. Nimm netWorthHint als Ausgangszahl und nicht als verbindliches Nettovermögen.
Transaktionen
Deine Transaktionen, seitenweise, eingepackt zusammen mit den Seitenzahlen. Nimmt page und pageSize (100 ist die Obergrenze), dazu optionale Filter nach Konto, Zeitraum, angewendeten Regeln und vergebenen Tags.
- accountIdoptional
- Grenzt auf die Transaktionen eines Kontos ein, über dessen accountGroupKey.
- fromDateoptional
- Nur Transaktionen an oder nach diesem Datum.
- toDateoptional
- Nur Transaktionen an oder vor diesem Datum.
- pageoptional
- Seitenzahl, ab 1 gezählt. Standardmäßig 1; alles unter 1 wird als 1 gelesen, und eine Seite hinter der letzten kommt leer zurück.
- pageSizeoptional
- Zeilen pro Seite. Standardmäßig 50, auf 1 bis 100 begrenzt.
- sortByoptional
- Feld für die Sortierung: transactionDate, amount, description, category oder merchantName.
- sortDirectionoptional
- asc oder desc. Standardmäßig absteigend.
- categoryKeysoptional
- Only transactions in these categories, by their fcat_ keys. Takes a list, not a single key, and a transaction matches if its effective category is any one of them. Send the literal "uncategorized" to select the transactions that have no category at all.
- searchoptional
- Volltextsuche über Händler, Beschreibung, Kategorie, Kontoname und Betrag.
- ruleIdsoptional
- Nur Transaktionen, die eine Automatisierungsregel berührt hat, über den Schlüssel der Regel.
- tagKeysoptional
- Nur Transaktionen mit einem dieser Tags.
- reviewStatusesoptional
- needs_review, reviewed oder flagged. Nimmt eine Liste; eine Transaktion passt, wenn ihr Prüfstatus einer davon ist.
- includeChildrenoptional
- With a category filter set, also include transactions in the subcategories of every key you passed. Defaults to false.
- includePendingoptional
- Gibt zusätzlich ausstehende Buchungen der letzten 7 Tage zurück, gekennzeichnet mit isPending. Standardmäßig false. Ausstehende Zeilen sind schreibgeschützt.
{
"transactions": [ … ],
"pagination": {
"currentPage": 1,
"pageSize": 20,
"totalItems": 412,
"totalPages": 21
},
"historyWindowApplied": true,
"historyWindowFloorDate": "2026-06-28",
"historyWindowHiddenCount": 137,
"historyWindowEarliestDate": "2024-03-02",
"historyWindowDegraded": false
}Es gibt keinen Aufruf, der eine einzelne Transaktion über ihre id liest. GET /banking/transactions/{id} antwortet mit 405 und Allow: PUT, weil dieser Pfad eine Transaktion nur ändert. Um eine zu lesen, ruf die Liste mit Filtern auf, die sie eingrenzen — accountId auf ihren accountGroupKey, fromDate und toDate beide auf ihr transactionDate und search auf ihren Händlernamen oder Betrag — und such sie dann anhand ihrer id aus dem heraus, was zurückkommt. Ist es eine aktuelle vorgemerkte Belastung, gib zusätzlich includePending mit.
Dein Tarif kann eine Verlaufsfenster-Grenze anwenden, die ältere Transaktionen verbirgt. Deshalb trägt die Antwort die historyWindow-Felder: historyWindowApplied sagt dir, dass eine Grenze tatsächlich etwas verborgen hat, historyWindowFloorDate, wo sie liegt, historyWindowHiddenCount, wie viele Zeilen dahinter stehen, und historyWindowEarliestDate, wie weit dein Verlauf wirklich zurückreicht. Ohne sie ist ein kurzes Ergebnis nicht von einem Konto ohne ältere Transaktionen zu unterscheiden. Zwei davon ändern, was du schreibst: historyWindowHiddenCount kann null sein, auch wenn eine Grenze gegriffen hat — lies null also als unbekannt und nicht als die Zahl 0; und wenn historyWindowDegraded true ist, konnte Era deinen Tarif bei dieser Anfrage nicht bestätigen, das Grenzdatum ist dann eine Schätzung und keine Tatsache. Bei einer bestätigten bezahlten Anfrage greift keine Grenze, und historyWindowApplied kommt als false zurück. Auch das Live-Datenquellen-Limit deines Tarifs lässt Transaktionen aus: tierExcludedAccountCount sagt, wie viele deiner Konten es aus dieser Anfrage heraushält, und userExcludedAccountCount, wie viele du ausgeblendet hast — beide auf das Konto eingegrenzt, nach dem du gefiltert hast, falls du das getan hast. Beide sind null, wenn Era deinen Tarif bei dieser Anfrage nicht lesen konnte.
Durch eine lange Historie zu blättern verbraucht Anfragen. Dein Tarif begrenzt, wie schnell du aufrufen kannst, und im kostenlosen Tarif, wie viele Aufrufe du pro Tag bekommst; bezahlte Tarife laufen unter fairer Nutzung. Unter Limits stehen die Zahlen pro Tarif, die Rate-Limit-Header und was ein 429 dir sagt.
Eine Transaktion ändern
Vier Dinge an einer Transaktion kannst du überschreiben: ihre Kategorie, den Händlernamen, eine eigene Notiz und ihren Prüfstatus. Schick nur die, die du änderst — was du weglässt, bleibt unverändert. Die id im Pfad ist der utgr_-Schlüssel der Transaktion. Dafür ist banking:write statt banking:read nötig, aber es ändert nur Eras Kopie der Transaktion: Die bei deiner Bank bleibt, wie sie war.
- categoryKeyoptional
- Der fcat_-Schlüssel der zuzuweisenden Kategorie. Lässt du ihn weg, behält die Transaktion ihre bisherige Kategorie.
- merchantNameoptional
- Ein eigener Händlername, bis zu 1000 Zeichen. Lässt du ihn weg, bleibt der aktuelle Name bestehen.
- descriptionoptional
- Eine eigene Notiz zu dieser Transaktion, bis zu 5000 Zeichen. Lässt du sie weg, bleibt die aktuelle Notiz bestehen.
- clearCategoryoptional
- Verwirft deine Kategorie-Überschreibung, sodass Eras eigene Kategorisierung wieder greift. Standardmäßig false.
- clearMerchantNameoptional
- Verwirft deine Überschreibung des Händlernamens, sodass der von deiner Bank gesendete Name zurückkehrt. Standardmäßig false.
- clearDescriptionoptional
- Verwirft deine Beschreibungs-Überschreibung, sodass die von deiner Bank gesendete Beschreibung zurückkehrt. Standardmäßig false.
- reviewStatusoptional
- Markiert sie als needs_review, reviewed oder flagged.
- clearReviewStatusoptional
- Verwirft deine Überschreibung des Prüfstatus. Standardmäßig false.
{
"transaction": { … }
}Du bekommst die gesamte aktualisierte Transaktion zurück, in derselben Form, die die Liste oben liefert — hier nicht erneut abgedruckt, weil es groß ist und sich ändert, solange die API in der Beta ist. Setzt du ein Feld und leerst es im selben Aufruf, kommt 400 zurück. Eine Transaktion, die dir nicht gehört, oder die es gar nicht gibt, kommt als 403 zurück — die API unterscheidet die beiden Fälle nicht. Und hat etwas anderes dieselbe Zeile geändert, während du geschrieben hast, bekommst du 409: lies sie erneut und schick sie erneut. Um sie später erneut zu lesen, nutze die Liste oben: Dieser Pfad nimmt nur PUT an, und ein GET darauf antwortet mit 405.
Bis zu 100 auf einmal ändern
Dieselben vier Überschreibungen, angewendet auf eine Liste von Transaktionen in einem Aufruf. Jede id in der Liste bekommt dieselben Änderungen — es gibt keine Variation pro Transaktion. Dafür ist banking:write statt banking:read nötig, aber es ändert nur Eras Kopien dieser Transaktionen: Die bei deiner Bank bleiben, wie sie waren.
- transactionIds
- Die utgr_-Schlüssel der zu ändernden Transaktionen. Mindestens einer, höchstens 100. Über 100 wird abgelehnt statt gekappt — anders als pageSize oben bekommst du ein 400, und es ändert sich gar nichts.
- categoryKeyoptional
- Der fcat_-Schlüssel der zuzuweisenden Kategorie. Lässt du ihn weg, behält die Transaktion ihre bisherige Kategorie.
- merchantNameoptional
- Ein eigener Händlername, bis zu 1000 Zeichen. Lässt du ihn weg, bleibt der aktuelle Name bestehen.
- descriptionoptional
- Eine eigene Notiz zu dieser Transaktion, bis zu 5000 Zeichen. Lässt du sie weg, bleibt die aktuelle Notiz bestehen.
- clearCategoryoptional
- Verwirft deine Kategorie-Überschreibung, sodass Eras eigene Kategorisierung wieder greift. Standardmäßig false.
- clearMerchantNameoptional
- Verwirft deine Überschreibung des Händlernamens, sodass der von deiner Bank gesendete Name zurückkehrt. Standardmäßig false.
- clearDescriptionoptional
- Verwirft deine Beschreibungs-Überschreibung, sodass die von deiner Bank gesendete Beschreibung zurückkehrt. Standardmäßig false.
- reviewStatusoptional
- Markiert sie als needs_review, reviewed oder flagged.
- clearReviewStatusoptional
- Verwirft deine Überschreibung des Prüfstatus. Standardmäßig false.
{
"transactions": [ … ]
}Du bekommst die aktualisierten Transaktionen zurück, in derselben Form, die die Liste oben liefert. Setzt du ein Feld und leerst es im selben Aufruf, kommt 400 zurück, ebenso bei einer leeren Liste. Eine Liste, die eine Transaktion enthält, die dir nicht gehört oder die es gar nicht gibt, kommt für den gesamten Aufruf als 403 zurück — nichts wird geändert. Hat etwas anderes eine dieser Zeilen geändert, während du geschrieben hast, bekommst du 409: lies sie erneut und schick sie erneut.
Kategorien
Die gesamte Kategorien-Taxonomie: jede Kategoriengruppe, mit ihren Unterkategorien darin verschachtelt. Die Taxonomie ist gemeinsam, nicht pro Konto.
{
"packs": [
{
"packSlug": "default",
"packName": "Era default categories",
"isDefault": true,
"categories": [
{
"projectionKey": "fcat_food_dining",
"categoryName": "Food & dining",
"isTopLevel": true,
"children": [ … ]
}
]
}
],
"meterLimit": 25,
"canCreateCustomCategories": true
}Eine Kategorie anlegen
Eine benutzerdefinierte Kategorie unter einem bestehenden Elternteil. Dafür ist banking:write statt banking:read nötig, aber es ändert nur deine Kategorien in Era: Bei deiner Bank ändert sich nichts.
- slug
- URL-sicherer Bezeichner — Kleinbuchstaben, Ziffern und Bindestriche, 2 bis 50 Zeichen, und eindeutig über alle sichtbaren Kategorien, die du angelegt hast, nicht nur unter einer übergeordneten Kategorie. Der slug einer Kategorie, die du ausgeblendet oder gelöscht hast, ist nicht vergeben: Legst du damit an, kommt diese Kategorie mit ihrem alten Schlüssel zurück.
- parentCategoryKey
- Der fcat_-Schlüssel der Kategorie, unter der diese eingehängt wird.
- name
- Anzeigename.
- descriptionoptional
- Optionale Beschreibung.
- iconNameoptional
- Optionaler Icon-Name.
- spendingTypeoptional
- Optionale Ausgabenklassifizierung.
- displayOrderoptional
- Optionale Sortierposition unter den Geschwisterkategorien.
- assignmentEligibilityoptional
- Optionale Regel dafür, welchen Transaktionen diese Kategorie zugewiesen werden darf.
- sourceSystemKeysoptional
- Optionale Liste bestehender Kategorie-Schlüssel, deren Transaktionen künftig hierher geleitet werden sollen.
- applyRetroactivelyoptional
- Bei true werden auch vergangene Transaktionen gegen das neue Routing neu bewertet. Standardmäßig false.
{
"categoryKey": "fcat_side_hustle_9f2a",
"overlayProjectionKey": "fcov_9f2a1c",
"action": "created",
"isQuotaExceeded": false,
"createdMappingRuleKeys": [ … ],
…
}Die Antwort trägt außerdem retroactiveAffectedCount, retroactiveStatus, mergeSourcesHiddenCount und mergeSourcesTotalCount, die diese Seite nicht behandelt, sowie isQuotaExceeded, quotaExceededMessage und meterGate, die bei einer angelegten Kategorie immer false, null und null sind. Lehnt das Kontingent deines Tarifs die Neuanlage ab, kommt stattdessen ein 402 ohne diese Felder: Sein Body besteht aus statusCode, message und errors.generalErrors, dessen einziger Eintrag sagt, an welches Limit du gestoßen bist. Legst du eine Kategorie mit einem slug an, den schon eine sichtbare Kategorie nutzt, die du angelegt hast, kommt 400 zurück, nicht 409. Das 409, das dieser Aufruf deklariert, bleibt einem seltenen Wettlauf vorbehalten: zwei Anfragen, die im selben Moment denselben slug anlegen. So oder so ist der slug vergeben, also schick einen anderen oder nutze die Kategorie, die ihn hat.
Tags
Alle Tags deines Kontos, als eine Liste. Keine Seitenaufteilung — eine Antwort gibt dir alle zurück.
- tagTypeoptional
- Filtert nach Tag-Herkunft: user, system oder auto.
- includeDeletedoptional
- Bezieht gelöschte Tags mit ein. Standardmäßig false.
{
"tags": [
{
"tagKey": "ftag_3fG7kL9p",
"name": "business-expense",
"displayName": "Business expense",
"tagType": "user",
"color": "#6DC6BA",
"transactionCount": 42
}
]
}Einen Tag anlegen
Ein neuer Tag, normalisiert: ohne Leerraum am Anfang und Ende, in Kleinbuchstaben und mit jeder Folge von Leerraum durch einen einzelnen Bindestrich ersetzt. Dafür ist banking:write statt banking:read nötig, aber es ändert nur deine Tags in Era: Bei deiner Bank ändert sich nichts. System-Tags lassen sich über die API nicht anlegen, user- und auto-Tags schon.
- name
- Der kanonische Name des Tags.
- displayNameoptional
- Optionaler Anzeigename. Standardmäßig der kanonische Name.
- tagTypeoptional
- user or auto. Defaults to user. system is refused — it is reserved for tags Era creates itself.
- coloroptional
- Optionale Hex-Farbe für die Anzeige.
- iconoptional
- Optionaler Icon-Name.
{
"tag": {
"tagKey": "ftag_3fG7kL9p",
"name": "business-expense",
"displayName": "Business expense",
"tagType": "user",
"version": 1,
"createdAt": "2026-08-26T09:15:00Z"
}
}Legst du einen Tag an, den du schon hast, kommt 400 zurück, nicht 409, mit einem Fehler, der ihn nennt. Namen werden nach der Normalisierung verglichen, also sind Coffee Shop und coffee-shop derselbe Tag. Um ihn zu nutzen, such ihn in der Liste oben, statt ihn noch einmal anzulegen.
Wiederkehrende Zahlungen
Die Zahlungen, Rechnungen und Einnahmen, die sich in deinen Transaktionen wiederholen, nach estimatedAmount absteigend sortiert. Die Liste kommt aus einer von zwei Quellen. Sobald Era in deinen Transaktionen wiederkehrende Muster erkannt hat, listet sie diese auf, jeweils mit confidence system. Bis dahin gruppiert sie die jüngeren Transaktionen, die die Daten deiner Bank als wiederkehrend, als Abo, als Rechnungszahlung oder als Einnahme kennzeichnen, nach Händler und Währung, jede Gruppe mit confidence provider. Jeder Eintrag hat den merchant; estimatedAmount, den typischen Betrag pro Mal, nie negativ, egal in welche Richtung das Geld fließt; frequency, Eras Schätzung, wie oft er sich wiederholt; category, die null ist, wenn es keine gibt, und bei einem von Era erkannten Muster immer null; lastSeen, das Datum der letzten Transaktion oder, bei einem von Era erkannten Muster, das Datum, an dem Era es erkannt hat; type; und confidence. type ist subscription, bill oder income, wo die Daten deiner Bank das angeben, und recurring, wo nicht — das gilt für jedes von Era erkannte Muster. Bei einem Eintrag mit type recurring sagt also nichts, ob das Geld hereinkommt oder hinausgeht. Ausstehende Buchungen sind nicht enthalten. Nimmt keine Parameter und ignoriert alle, die du sendest.
{
"items": [
{
"merchant": "Netflix",
"estimatedAmount": { "amount": 15.49, "currency": "usd", … },
"frequency": "monthly",
"category": "Entertainment",
"lastSeen": "2026-09-28",
"type": "subscription",
"confidence": "provider"
},
…
]
}Cashflow
Einnahmen und Ausgaben in einem Zeitraum: income, expense und net, also das Erste minus das Zweite, mit den Kategorien hinter jeder Seite — incomeCategories und expenseCategories, die größte zuerst, jede mit ihrem Betrag, ihrem Anteil an der Summe dieser Seite und der Zahl der Transaktionen darin. Überweisungen zwischen deinen Konten, ausstehende Buchungen und Transaktionen, die du ausgeblendet hast oder die auf Konten liegen, die du ausgeblendet hast oder die das Live-Datenquellen-Limit deines Tarifs auslässt, sind nicht enthalten; excludedAccountCount zählt diese Konten. income und expense zählen jede Kategorie ihrer Seite, auch die, die topN von der Liste lässt, deshalb können die zurückgegebenen Kategorien zusammen weniger ergeben als die Summe ihrer Seite; jeder percentOfTotal ist ein Anteil an dieser vollen Summe. Der angefragte Zeitraum kommt mit Anfang, Ende und einer lesbaren Bezeichnung zurück. Ist incomePercentOfTotalUnavailable oder expensePercentOfTotalUnavailable true, sind die percentOfTotal-Werte dieser Seite 0, weil sich der Anteil nicht berechnen ließ, nicht weil die Kategorie 0 % davon ausmacht — lies sie als fehlend. Standardmäßig der aktuelle Monat.
- periodoptional
- Der Zeitraum für die Übersicht: this_week, this_month, last_month, last_7_days, last_30_days, last_90_days, this_year, last_year, all_time oder custom mit periodStart und periodEnd. Standardmäßig this_month. Einen Namen, den er nicht kennt, liest er als this_month, auch wenn die Antwort den Namen zurückgibt, den du gesendet hast.
- periodStartoptional
- Der erste Tag eines eigenen Zeitraums, im Format yyyy-MM-dd. Sendest du ihn, wird der Zeitraum custom, egal was period sagt. Lässt du periodEnd weg, reicht der Zeitraum bis heute — außer period ist custom: Das braucht beide Daten und antwortet ohne sie mit 400.
- periodEndoptional
- Der letzte Tag eines eigenen Zeitraums, im Format yyyy-MM-dd und nicht vor periodStart. Braucht periodStart.
- accountGroupKeyoptional
- Grenzt die Übersicht auf ein Konto ein, über dessen accountGroupKey. Ein Schlüssel, der keines deiner Konten ist, trifft nichts, also kommt jede Summe als 0 zurück.
- topNoptional
- Wie viele Kategorien je Seite zurückkommen, von 1 bis 50. Standardmäßig 10.
- includeSubcategoriesoptional
- Gibt jeder Kategorie eine children-Liste, die sie nach Unterkategorien aufschlüsselt. Standardmäßig false.
{
"period": { "period": "last_month", "start": "2026-09-01", "end": "2026-09-30", "label": "September 2026" },
"income": { "amount": 5200.00, "currency": "usd", … },
"expense": { "amount": 4000.00, "currency": "usd", … },
"net": { "amount": 1200.00, "currency": "usd", … },
"incomeCategories": [ … ],
"expenseCategories": [
{
"label": "Groceries",
"categoryKey": "fcat_groceries",
"amount": { "amount": 600.00, "currency": "usd", … },
"percentOfTotal": 15,
"transactionCount": 14,
"children": null
},
…
],
"excludedAccountCount": 0,
"excludedAccountNote": null,
"incomePercentOfTotalUnavailable": false,
"expensePercentOfTotalUnavailable": false
}Regeln
Alle Automatisierungsregeln deines Kontos — die, die du selbst angelegt hast, und die, die Era dir aus seiner Regelbibliothek eingerichtet hat — jeweils mit ihren Bedingungen (filters), dem, was sie tun (actions), ob sie eingeschaltet sind, und ihrer Version. Keine Seitenaufteilung: Eine Antwort gibt dir alle zurück. Ausgeschaltete Regeln fehlen, außer du fragst nach ihnen.
- includeInactiveoptional
- Gibt auch die ausgeschalteten Regeln zurück. Standardmäßig false.
{
"rules": [
{
"id": "rule_4c1e7a90",
"ruleName": "Coffee shops",
"isActive": true,
"version": 3,
"priority": 10,
"filters": [{ "type": "merchant_match", "pattern": "Blue Bottle", "mode": "contains" }],
"actions": [{ "type": "set_category", "categoryKey": "fcat_coffee_shops", "categoryDisplayName": "Coffee shops" }],
"source": "user",
"matchedTransactionCount": 42,
…
}
]
}filters und actions sind Listen typisierter Objekte. Jedes nennt seine Art in einem type-Feld — merchant_match oder category bei den Filtern, set_category oder add_tag bei den Aktionen —, und das im Schnellstart verlinkte OpenAPI-Dokument listet jede Art mit den Feldern, die sie nimmt.
Eine Regel anlegen
Eine neue Automatisierungsregel: Bedingungen, die Transaktionen auswählen, und was mit jeder passiert, auf die sie zutreffen. Sie läuft ab dann bei jeder neuen Transaktion und, wenn du es willst, auch bei denen, die du schon hast. Dafür ist banking:write statt banking:read nötig, aber es ändert nur deine Regeln und Transaktionen in Era: Bei deiner Bank ändert sich nichts.
- ruleName
- Ein Name für die Regel.
- descriptionoptional
- Eine optionale Notiz, wofür die Regel da ist.
- priorityoptional
- Wo die Regel unter deinen anderen läuft: Höhere laufen zuerst, und wenn zwei Regeln bei einer Transaktion dasselbe setzen würden, gewinnt die höhere. Standardmäßig 0.
- filters
- Die Bedingungen, als Liste typisierter Filterobjekte — jedes nennt seine Art in einem type-Feld. Eine Transaktion muss alle erfüllen; verschachtle and-, or- und not-Filter, um sie anders zu verknüpfen. Mindestens eine. Ein account_type-Filter, der Kontotypen nennt, funktioniert nur bei einer Musterregel; bei einer Transaktionsregel wird er mit einer 400 abgelehnt.
- actions
- Was mit jeder Transaktion passiert, auf die die Regel zutrifft, als Liste typisierter Aktionsobjekte: eine Kategorie setzen, einen Tag hinzufügen oder entfernen, den Händler umbenennen, die Beschreibung umschreiben, einen Prüfstatus setzen, sie ausblenden oder als Überweisung markieren. Mindestens eine, und von jeder Art höchstens eine, außer bei den Tag-Aktionen. Jeder Tag muss schon existieren und darf nur einmal vorkommen.
- isActiveoptional
- Ob die Regel eingeschaltet startet. Standardmäßig true.
- applyRetroactivelyoptional
- Lässt die Regel auch über die Transaktionen laufen, die du schon hast, nicht nur über neue. Greift nur, wenn die Regel eingeschaltet startet. Standardmäßig false.
- appliesFromoptional
- Nur Transaktionen an oder nach diesem Datum.
- appliesTooptional
- Nur Transaktionen an oder vor diesem Datum.
- applicationScopeoptional
- Wann die Regel läuft: prospective nur bei neuen Transaktionen, retroactive, wenn sie über bestehende läuft, oder both. Standardmäßig both.
- ruleScopeoptional
- transaction, der Standard, prüft Transaktionen einzeln. pattern erkennt ein Muster über mehrere hinweg — eine wiederkehrende Abbuchung, ein Paar von Überweisungen —, beschrieben durch patternSpec.
- triggerModeoptional
- Bei einer Musterregel, wann nach dem Muster gesucht wird: onEachTransaction, onBatchComplete, onSchedule oder onDemand. Standardmäßig onEachTransaction.
- patternSpecoptional
- Bei einer Musterregel das Muster, nach dem gesucht wird, als typisiertes Objekt. Pflicht, wenn ruleScope pattern ist.
- windowDaysoptional
- Bei einer Musterregel, wie viele Tage zurück nach dem Rest des Musters gesucht wird, zwischen 1 und 365. Pflicht, wenn ruleScope pattern ist.
- windowLookaheadDaysoptional
- Bei einer Musterregel, wie viele Tage voraus nach dem Rest des Musters gesucht wird.
- windowExcludeTriggerAccountoptional
- Bei einer Musterregel bleibt das Konto der Transaktion, die die Prüfung ausgelöst hat, bei der Suche außen vor. Standardmäßig false.
- groupoptional
- Die Gruppe, unter der die Regel abgelegt wird: spendingHabits, problemsAndAnomalies, incomeAndTransfers, subscriptionsAndRecurring oder taxAndRecordKeeping. Lass sie weg, um die Regel unter keiner abzulegen. categoryMapping ist für Regeln reserviert, die Era selbst anlegt, und wird mit einem 400 abgelehnt.
{
"rule": { … },
"retroactiveStatus": "in_progress",
"affectedTransactionCount": 0
}retroactiveStatus ist null, außer du hast den Aufruf gebeten, die Regel auf Transaktionen anzuwenden, die du schon hast, oder rückgängig zu machen, was sie bewirkt hat. in_progress heißt, diese Arbeit ist zusammen mit der Änderung festgehalten und läuft im Hintergrund, affectedTransactionCount ist also noch nicht endgültig; das Aktivitätsprotokoll hält fest, wie sie ausgeht.
Eine Regel vorab prüfen
Probiert die Bedingungen einer Regel an deinen letzten Transaktionen aus und meldet, worauf sie zutreffen würden, ohne etwas zu speichern: wie viele von den geprüften getroffen haben, bis zu 50 der Schlüssel der Treffer und bis zu 10 Stichproben. Eine Transaktionsregel prüft die letzten 90 Tage, höchstens 5.000 Transaktionen, und ihre Stichproben tragen Händler, Betrag und Datum. Die Stichproben einer Musterregel tragen detectionReason, warum das Muster erkannt wurde (das kann leer sein), und keinen Händler, Betrag oder Datum. Es wird nichts geschrieben, deshalb reicht banking:read.
- filters
- Die Bedingungen, als Liste typisierter Filterobjekte — jedes nennt seine Art in einem type-Feld. Eine Transaktion muss alle erfüllen; verschachtle and-, or- und not-Filter, um sie anders zu verknüpfen. Mindestens eine. Ein account_type-Filter, der Kontotypen nennt, funktioniert nur bei einer Musterregel; bei einer Transaktionsregel wird er mit einer 400 abgelehnt.
- ruleScopeoptional
- transaction, der Standard, prüft Transaktionen einzeln. pattern erkennt ein Muster über mehrere hinweg — eine wiederkehrende Abbuchung, ein Paar von Überweisungen —, beschrieben durch patternSpec.
- patternSpecoptional
- Bei einer Musterregel das Muster, nach dem gesucht wird, als typisiertes Objekt. Pflicht, wenn ruleScope pattern ist.
- windowDaysoptional
- Bei einer Musterregel, wie viele Tage zurück nach dem Rest des Musters gesucht wird, zwischen 1 und 365. Pflicht, wenn ruleScope pattern ist.
{
"matchCount": 12,
"totalEvaluated": 418,
"matchingGroupKeys": ["utgr_5d0e2b77", … ],
"sampleMatches": [
{
"groupKey": "utgr_5d0e2b77",
"merchantName": "Blue Bottle Coffee",
"amount": -6.25,
"currency": "USD",
"transactionDate": "2026-09-12"
},
…
]
}Eine Regel ändern
Ersetzt die Definition einer Regel durch die, die du schickst — schick also jedes Feld, das bleiben soll, nicht nur die, die du änderst. Die ruleId im Pfad ist die ID, die die Regelliste liefert, und version muss die sein, die du zuletzt gelesen hast. Bei einer Regel aus Eras Bibliothek kann sich nur userOverrides ändern: Schick alles andere so zurück, wie die Liste es geliefert hat. Dafür ist banking:write statt banking:read nötig, aber es ändert nur deine Regeln und Transaktionen in Era: Bei deiner Bank ändert sich nichts.
- versionoptional
- Die Version der Regel, wie du sie zuletzt gelesen hast. Sie muss der aktuellen Version entsprechen, sonst wird der Aufruf mit einem 409 abgelehnt — wenn du sie weglässt, überspringst du die Prüfung also nicht, sondern fällst durch.
- ruleName
- Ein Name für die Regel.
- descriptionoptional
- Eine optionale Notiz, wofür die Regel da ist.
- priorityoptional
- Wo die Regel unter deinen anderen läuft: Höhere laufen zuerst, und wenn zwei Regeln bei einer Transaktion dasselbe setzen würden, gewinnt die höhere. Standardmäßig 0.
- filters
- Die Bedingungen, als Liste typisierter Filterobjekte — jedes nennt seine Art in einem type-Feld. Eine Transaktion muss alle erfüllen; verschachtle and-, or- und not-Filter, um sie anders zu verknüpfen. Mindestens eine. Ein account_type-Filter, der Kontotypen nennt, funktioniert nur bei einer Musterregel; bei einer Transaktionsregel wird er mit einer 400 abgelehnt.
- actions
- Was mit jeder Transaktion passiert, auf die die Regel zutrifft, als Liste typisierter Aktionsobjekte: eine Kategorie setzen, einen Tag hinzufügen oder entfernen, den Händler umbenennen, die Beschreibung umschreiben, einen Prüfstatus setzen, sie ausblenden oder als Überweisung markieren. Mindestens eine, und von jeder Art höchstens eine, außer bei den Tag-Aktionen. Jeder Tag muss schon existieren und darf nur einmal vorkommen.
- applyRetroactivelyoptional
- Lässt die geänderte Regel erneut über die Transaktionen laufen, die du schon hast, und macht vorher rückgängig, was die alte Version an ihnen getan hat. Standardmäßig false.
- appliesFromoptional
- Nur Transaktionen an oder nach diesem Datum.
- appliesTooptional
- Nur Transaktionen an oder vor diesem Datum.
- applicationScopeoptional
- Wann die Regel läuft: prospective nur bei neuen Transaktionen, retroactive, wenn sie über bestehende läuft, oder both. Standardmäßig both.
- userOverridesoptional
- Bei einer Regel aus Eras Bibliothek deine eigenen Werte für die Einstellungen, die sie anpassen lässt, als typisiertes Objekt derselben Art wie das Muster der Regel. Bei deinen eigenen Regeln wird es ignoriert.
- groupoptional
- Die Gruppe, unter der die Regel abgelegt wird, aus derselben Liste, die das Anlegen nimmt. Die Änderung ersetzt die ganze Definition — wenn du die Gruppe weglässt, wird sie also entfernt; schick die aktuelle Gruppe mit, um sie zu behalten. Bei einer Regel aus Eras Bibliothek lass sie weg oder schick die Gruppe, die sie schon hat.
{
"rule": { … },
"retroactiveStatus": null,
"affectedTransactionCount": 0
}retroactiveStatus ist null, außer du hast den Aufruf gebeten, die Regel auf Transaktionen anzuwenden, die du schon hast, oder rückgängig zu machen, was sie bewirkt hat. in_progress heißt, diese Arbeit ist zusammen mit der Änderung festgehalten und läuft im Hintergrund, affectedTransactionCount ist also noch nicht endgültig; das Aktivitätsprotokoll hält fest, wie sie ausgeht.
Eine Regel einschalten
Schaltet eine Regel wieder ein, sodass sie wieder bei neuen Transaktionen läuft. Eine Regel einzuschalten, die schon eingeschaltet ist, ändert nichts. Regeln aus Eras Bibliothek lassen sich wie deine eigenen ein- und ausschalten. Dafür ist banking:write statt banking:read nötig, aber es ändert nur deine Regeln und Transaktionen in Era: Bei deiner Bank ändert sich nichts.
- versionoptional
- Die Version der Regel, wie du sie zuletzt gelesen hast. Lass sie weg, um die Prüfung zu überspringen; schickst du sie, wird der Aufruf mit einem 409 abgelehnt, wenn sich die Regel seitdem geändert hat.
{
"rule": { … },
"retroactiveStatus": null,
"affectedTransactionCount": 0
}Eine Regel ausschalten
Schaltet eine Regel aus, sodass sie bei neuen Transaktionen nicht mehr läuft. Sie behält ihre Definition, und was sie schon getan hat, bleibt, außer du forderst es mit revert_retroactively zurück. Eine Regel auszuschalten, die schon aus ist, lässt sie aus. Dafür ist banking:write statt banking:read nötig, aber es ändert nur deine Regeln und Transaktionen in Era: Bei deiner Bank ändert sich nichts.
- versionoptional
- Die Version der Regel, wie du sie zuletzt gelesen hast. Lass sie weg, um die Prüfung zu überspringen; schickst du sie, wird der Aufruf mit einem 409 abgelehnt, wenn sich die Regel seitdem geändert hat.
- revert_retroactivelyoptional
- Macht außerdem rückgängig, was die Regel an deinen Transaktionen schon geändert hat — die Kategorien, Tags und anderen Änderungen, die sie gesetzt hat. Standardmäßig false, dann bleiben diese Änderungen bestehen.
{
"rule": { … },
"retroactiveStatus": null,
"affectedTransactionCount": 0
}retroactiveStatus ist null, außer du hast den Aufruf gebeten, die Regel auf Transaktionen anzuwenden, die du schon hast, oder rückgängig zu machen, was sie bewirkt hat. in_progress heißt, diese Arbeit ist zusammen mit der Änderung festgehalten und läuft im Hintergrund, affectedTransactionCount ist also noch nicht endgültig; das Aktivitätsprotokoll hält fest, wie sie ausgeht.
Eine Regel löschen
Löscht eine Regel endgültig. Um eine Regel anzuhalten, ohne sie zu verlieren, schalte sie stattdessen aus. Die ruleId im Pfad ist die ID, die die Regelliste liefert, und version muss die sein, die du zuletzt gelesen hast. Regeln aus Eras Bibliothek lassen sich nicht löschen, nur ausschalten. Dafür ist banking:write statt banking:read nötig, aber es ändert nur deine Regeln und Transaktionen in Era: Bei deiner Bank ändert sich nichts. Mit revert_retroactively werden das Löschen und das Rückgängigmachen dessen, was die Regel an deinen bestehenden Transaktionen geändert hat, zusammen festgehalten, sodass das Rückgängigmachen nicht verloren gehen kann, sobald das Löschen gelingt: Die Antwort lautet in_progress, das Rückgängigmachen läuft im Hintergrund, und das Aktivitätsprotokoll hält fest, wie es ausgeht.
- versionoptional
- Die Version der Regel, wie du sie zuletzt gelesen hast. Sie muss der aktuellen Version entsprechen, sonst wird der Aufruf mit einem 409 abgelehnt — wenn du sie weglässt, überspringst du die Prüfung also nicht, sondern fällst durch.
- revert_retroactivelyoptional
- Macht außerdem rückgängig, was die Regel an deinen Transaktionen schon geändert hat — die Kategorien, Tags und anderen Änderungen, die sie gesetzt hat. Standardmäßig false, dann bleiben diese Änderungen bestehen.
{
"success": true,
"retroactiveStatus": null,
"affectedTransactionCount": 0
}retroactiveStatus ist null, außer du hast den Aufruf gebeten, die Regel auf Transaktionen anzuwenden, die du schon hast, oder rückgängig zu machen, was sie bewirkt hat. in_progress heißt, diese Arbeit ist zusammen mit der Änderung festgehalten und läuft im Hintergrund, affectedTransactionCount ist also noch nicht endgültig; das Aktivitätsprotokoll hält fest, wie sie ausgeht.