Era-API
Endpoints, authenticatie, paginering en limieten voor de Era-API, met kopieerbare verzoeken.
Laatst bijgewerkt 8 oktober 2026
Deze endpoints werken vandaag, maar de API is nog in ontwikkeling, dus sommige details kunnen veranderen. Kijk bovenaan naar de datum van de laatste update om te zien wanneer deze pagina het laatst is herzien.
Snelstart
Voordat je begint heb je een Era-account nodig met minstens één gekoppelde instelling. Zonder koppeling hebben deze endpoints niets om terug te geven.
- 1
Log in bij Era en koppel een instelling, als je dat nog niet hebt gedaan.
- 2
Open je API-sleutels in het dashboard en maak een sleutel. De meeste bereiken staan al aangevinkt; de bereiken waarmee je geld kunt verplaatsen, kunt handelen, je facturering kunt wijzigen, je documenten kunt verwijderen of meer sleutels kunt maken, staan dat niet. Vink uit wat je niet nodig hebt. Lezen vraagt om banking:read en alles wijzigen om banking:write. Je kiest ook een verloopdatum; er is geen optie die nooit verloopt.
- 3
Kopieer de sleutel en bewaar hem op een veilige plek, zoals een wachtwoordkluis. Hij wordt maar één keer getoond, dus als je hem kwijtraakt, maak je een nieuwe.
- 4
Stuur hem mee in een header bij je verzoek.
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
}Schrijf je je eigen client? Genereer hem uit het OpenAPI-document op https://forge.era.app/api/openapi/public.json. Het beschrijft elk endpoint op deze pagina, met elk veld, elke status en elke soort regelfilter en actie, en de API serveert het zelf, dus het loopt niet achter.
Endpoints
Twintig endpoints: tien om te lezen en tien om te schrijven.
- GET/banking
/accounts - 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/banking
/rules - 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}
Authenticatie
Stuur je sleutel op een van twee manieren mee:
- Header
- X-API-Key: fmk_your_key_here
- Bearer-token
- Authorization: Bearer fmk_your_key_here
Elk verzoek is versleuteld met TLS.
Sleutels verlopen, en je kiest hoe snel wanneer je er een maakt. De langste termijn is 90 dagen bij het gratis abonnement en 365 bij een betaald abonnement. Er is geen optie die nooit verloopt, dus voor alles wat je hiertegen bouwt heb je een plan nodig om de sleutel te vervangen voordat hij verloopt.
Responseheaders
De X-RateLimit-*-headers melden je daglimiet, dus je ziet ze alleen bij een abonnement dat er een publiceert. Op dit moment is dat alleen het gratis abonnement. Behandel ze ook daar als optioneel: een antwoord zonder deze headers betekent dat het aantal onbekend is, niet dat er iets misging. Elke 429 bevat Retry-After.
- X-RateLimit-Limit
- De daglimiet van je abonnement. Wordt alleen verstuurd bij abonnementen die er een publiceren, en nooit bij een 429 van een andere limiet.
- X-RateLimit-Remaining
- Wat er van je daglimiet over is. Nooit onder nul. Wordt alleen verstuurd bij abonnementen die er een publiceren, en nooit bij een 429 van een andere limiet.
- X-RateLimit-Reset
- Wanneer je daglimiet het volgende verzoek vrijgeeft, als Unix-tijdstempel in seconden. Dat is niet het moment waarop de hele limiet weer vol is: de limiet is voortschrijdend, dus verzoeken komen één voor één terug. Wordt alleen verstuurd bij abonnementen die er een publiceren, en nooit bij een 429 van een andere limiet. De burst-limiet per minuut heeft geen eigen header. Zie Limieten
- Retry-Afterbij een 429
- Elke 429 bevat Retry-After: wacht zoveel seconden en probeer het dan opnieuw. Een 429 die ook de X-RateLimit-*-headers bevat, is geweigerd door de daglimiet van het gratis abonnement. Een 429 zonder die headers is geweigerd door een andere limiet, zoals de burst-limiet per minuut. Retry-After kan alles zijn van één seconde tot 24 uur. Zie Limieten
Fouten
De API geeft deze foutstatuscodes terug:
- 400
Ongeldige invoer: een slechte parameter, een lege bulkwijziging of tagtoewijzing of een met meer dan 100, een schrijfactie die hetzelfde veld in één aanroep instelt en wist, of een regel die niet klopt. Een regel verwijderen, aanzetten of uitzetten weigert ook elke querysleutel die hij niet neemt, en de 400 noemt hem. Een tag maken met een naam die je al hebt, of een categorie met een slug die al wordt gebruikt door een zichtbare categorie die je maakte, is ook een 400, geen 409.
- 401
Geen sleutel, of een sleutel die niet te lezen is. Stuur hem mee als X-API-Key of als bearer-token.
- 402
Er staat een abonnementslimiet in de weg. Vandaag gebeurt dat alleen wanneer je een categorie of een patroonregel maakt. Wachten haalt het niet weg, maar een groter abonnement wel. Te snel aanroepen is in plaats daarvan een 429.
- 403
De sleutel heeft niet het bereik dat deze aanroep nodig heeft, of bij een transactieschrijfactie of een tagtoewijzing hoort een id bij iemand anders of bestaat hij helemaal niet. De API maakt geen onderscheid tussen die twee. Een regel uit de bibliotheek van Era antwoordt 403 wanneer je hem probeert te verwijderen of zijn naam, beschrijving, prioriteit, data of applicationScope te wijzigen. Zijn filters, acties of groep wijzigen is in plaats daarvan een 400.
- 404
Iets wat er niet is. Het saldo-endpoint geeft het zonder body terug, voor een accountGroupKey die geen rekening noemt of die helemaal niet als sleutel is gevormd. De regelendpoints geven het terug voor een regelsleutel die niet van jou is, en een tagtoewijzing voor een tagKey die niet een van je tags is of die je hebt verwijderd. Transacties geven nooit een 404: zie 403.
- 409
Iets anders wijzigde de rij terwijl je ernaar schreef. Bij een regel is dat een versie die niet de huidige is; lees hem opnieuw en stuur je schrijfactie opnieuw. Twee 409's gaan niet weg bij opnieuw proberen: bij een regel zouden zijn acties regels in een lus laten afgaan, dus wijzig de acties; en bij een tagtoewijzing is een transactie nog in behandeling, dus hij kan niet worden getagd totdat hij is geboekt. Een categorie maken antwoordt alleen 409 wanneer een ander verzoek op hetzelfde moment dezelfde slug pakt, mogelijk je eigen nieuwe poging. In beide gevallen is de slug nu bezet: gebruik de categorie die hem heeft, of stuur een andere slug.
- 429
Te veel verzoeken. Je hebt je daglimiet bij het gratis abonnement opgebruikt of een andere limiet geraakt, zoals de burst-limiet per minuut. Retry-After zegt hoe lang je moet wachten, van één seconde tot 24 uur, en anders dan bij een 402 geeft wachten je volgende verzoek vrij. Zie Limieten voor de gepubliceerde cijfers en wat een 429 je vertelt.
Foutvormen
De meeste fouten komen in dezelfde vorm terug: statusCode, message en een errors-object dat noemt wat er mis was. Niet alle: een 401, en de 404 van het saldo-endpoint, komen helemaal zonder body terug, dus lees de status voordat je de body leest.
{
"statusCode": 403,
"message": "One or more errors occurred!",
"errors": {
"generalErrors": ["Transaction does not belong to the authenticated user"]
}
}Veelvoorkomende fouten
Een veld instellen en wissen in dezelfde schrijfactie: 400.
Meer dan 100 id's in een bulkwijziging of een tagtoewijzing: 400, en er wordt niets gewijzigd. Minder dan één is hetzelfde.
Een transactie die niet van jou is, of er helemaal niet is: 403, nooit 404. Het antwoord vertelt je dus nooit of een id bestaat, alleen dat hij niet aan jou is om te zien.
Iemand of iets anders wijzigde de rij eerst: 409.
Limieten
Drie van de gedocumenteerde endpoints begrenzen hoeveel je in één aanroep kunt vragen. De rest niet.
Onbegrensd per aanroep betekent niet onbeperkt. Sleutels verlopen nog steeds, schrijfacties hebben nog steeds veldlengtelimieten, een categorie of patroonregel maken kan een abonnementslimiet raken, je abonnement kan oudere geschiedenis nog steeds verbergen, en elke aanroep telt mee voor de rate limits van je abonnement, hieronder behandeld.
Rekeningen, saldo, overzicht, de lijsten met categorieën en tags, een categorie maken, een tag maken, de schrijfactie voor één transactie, de lijst met terugkerende afschrijvingen, het kasstroomoverzicht en elk regelendpoint hebben geen volumelimiet per aanroep. Je krijgt de hele set terug, of de ene rij die je noemde. Uitzonderingen zijn een regelvoorbeeld, dat de overeenkomsten telt maar hoogstens 50 van hun sleutels en 10 voorbeelden teruggeeft, en het kasstroomoverzicht, dat per kant alleen zoveel categorieën noemt als topN vraagt.
pageSize wordt begrensd, niet geweigerd: vraag meer dan 100 en je krijgt 100 rijen terug met een 200, en vraag minder dan één en je krijgt er één. Lees pagination.pageSize in het antwoord in plaats van te vertrouwen op wat je stuurde.
De bulkschrijfactie voor transacties en de tagtoewijzing zijn elk begrensd op 100 id's, en anders dan pageSize worden ze geweigerd in plaats van begrensd: stuur 101 en je krijgt een 400 en er verandert niets.
Sleutels verlopen volgens een schema dat je bij het maken kiest: tot 90 dagen bij het gratis abonnement, 365 bij een betaald abonnement. Er is geen optie die nooit verloopt.
Je abonnement kan een ondergrens voor het geschiedenisvenster toepassen die oudere transacties verbergt. Het transactieantwoord bevat de historyWindow-velden die je vertellen of er een gold en waar die lag.
Rate limits
Era publiceert twee rate limits. Elk abonnement heeft een burst-limiet: een limiet op verzoeken in elke voortschrijdende minuut. Het gratis abonnement heeft ook een daglimiet: een limiet op verzoeken in elke voortschrijdende 24 uur. Een verzoek telt een minuut nadat je het deed niet meer mee voor de burst-limiet, en een dag erna voor de daglimiet. Betaalde abonnementen hebben voorlopig geen gepubliceerde daglimiet. Ga je over een van beide, of over een andere limiet die de API afdwingt, dan komt de aanroep als 429 terug.
Limieten horen bij je account, niet bij een sleutel. Elke REST-sleutel die je maakt, put uit dezelfde burst-limiet en, bij het gratis abonnement, dezelfde daglimiet, dus een tweede sleutel koopt niet meer aanroepen. MCP-toolaanroepen worden apart geteld, dus REST-aanroepen en MCP-aanroepen gebruiken elkaars limieten nooit op.
| Abonnement | Daglimiet | Burst-limiet |
|---|---|---|
| Basic | 100 per dag | 10 per minuut |
| Organize | Geen | 30 per minuut |
| Automate | Geen | 60 per minuut |
| Optimize | Geen | 60 per minuut |
| Operate | Geen | 120 per minuut |
Betaalde abonnementen hebben voorlopig geen gepubliceerde daglimiet.
Betaalde abonnementen draaien ook op redelijk gebruik: de API is voor scripts, dashboards en integraties op je eigen financiële gegevens, in een volume dat bij één persoon past.
Geen enkele header meldt de burst-limiet bij welk abonnement dan ook, dus houd je tempo aan de hand van de tabel. Bij het gratis abonnement kan X-RateLimit-Remaining ruim boven nul staan vlak voordat een burst als 429 terugkomt.
Wat een 429 je vertelt
Welke limiet je weigerde. Een 429 met de X-RateLimit-*-headers kwam van de daglimiet van het gratis abonnement; een zonder die headers kwam van een andere limiet, zoals de burst-limiet. De body is probleemdetails, en het detail-veld zegt wanneer je volgende verzoek vrijkomt. Als de daglimiet of de burst-limiet je weigerde, noemt het ook die limiet, wat hij toestaat, en het abonnement dat hem verhoogt of opheft, of dat je al op het hoogste zit. Het is voor mensen geschreven, dus lees de headers in plaats van het te 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."
}Elke 429 bevat ook Retry-After: een geheel aantal seconden, van één seconde tot 24 uur. De wachttijd van de burst-limiet is hoogstens een minuut; de daglimiet van het gratis abonnement kan om de volle 24 uur vragen. Een geweigerde aanroep telt niet mee voor een limiet, maar probeer niet te vroeg opnieuw: wacht Retry-After uit bij elke 429. Bij de daglimiet en de burst-limiet wordt een te vroege nieuwe poging opnieuw geweigerd, en als de wachttijd voorbij is, komt één verzoek vrij, niet de hele limiet. Stuur het en lees wat terugkomt: een nieuwe Retry-After als het wordt geweigerd of, bij het gratis abonnement, de headers zodra het wordt bediend.
Rate limits beschermen geen sleutel waarvan je het spoor kwijt bent. Een gelekte sleutel put uit dezelfde limieten als elke andere sleutel op je account, en kan alles doen wat zijn bereiken toestaan. Intrekken geeft aanroepen die hij al deed niet terug. Als je twijfelt over een sleutel, trek hem in. Zie Beveiliging en omgaan met sleutels hieronder.
Conventies
Responsevelden zijn camelCase. Namen van queryparameters negeren hoofdletters maar moeten verder precies zo worden gespeld als op deze pagina, dus pageSize en PageSize werken allebei. De gepubliceerde specificatie schrijft de meeste in PascalCase. De meeste endpoints negeren een querysleutel die ze niet kennen, dus een verkeerd gespeld filter filtert gewoon niet: controleer wat er terugkomt. De aanroepen om regels te verwijderen, aan te zetten en uit te zetten zijn de uitzondering: ze weigeren elke andere sleutel met een 400 die hem noemt. Stuur revert_retroactively met het liggende streepje; revertRetroactively wordt geweigerd. Stuur hem alleen bij verwijderen en uitzetten, want aanzetten neemt alleen version.
Een veld dat een kalenderdag noemt, is YYYY-MM-DD. Een veld dat een tijdstip noemt, is ISO 8601 met een offset.
pageSize wordt begrensd, niet geweigerd. Vraag 500 en je krijgt 100 rijen en een 200, geen fout; vraag minder dan één en je krijgt er één. page heeft een ondergrens maar geen bovengrens: onder één wordt de eerste pagina, en voorbij de laatste pagina krijg je een lege met een 200, niet de laatste pagina. Lees dus pagination.currentPage, pagination.pageSize en pagination.totalPages terug in plaats van te vertrouwen op wat je stuurde.
Een antwoord kan velden bevatten die deze pagina niet vermeldt. Negeer degene die je niet herkent in plaats van erop te falen: zo blijft je client werken naarmate de API groeit.
REST is gewone HTTP; er is geen SDK om te installeren. Elke taal met een HTTP-client werkt.
Versiebeheer en wijzigingen
De API is in bèta, dus wat hier is gedocumenteerd kan veranderen: een endpoint, een veld of hoe een aanroep zich gedraagt.
Er is geen versienummer in het pad en geen versieheader. Elk endpoint heeft één live versie, en dat is degene die hier is gedocumenteerd.
Wijzigingslogboek
Wat er is veranderd op het Era Developer Platform, inclusief de Era-API, nieuwste eerst. Er is geen e-mail of feed, dus kijk in het wijzigingslogboek als je werk tegen de API plant.
Beveiliging en omgaan met sleutels
Een agent goedkeuren maakt een sleutel
Wanneer je een agent via OAuth goedkeurt, maakt Era een API-sleutel voor die agent. Die komt in dezelfde lijst in het dashboard als de sleutels die je zelf maakt, onder een naam die Era afleidt van de naam van de client zelf.
Hoe hij heet
Auto -- ClaudeHij heeft precies de bereiken die je op dat scherm hebt goedgekeurd, en niets anders. Trek hem in vanuit het dashboard en de agent kan geen nieuwe toegang meer krijgen totdat je opnieuw goedkeurt. Een token die hij al heeft, blijft werken totdat hij verloopt, maximaal een uur.
Schrijfacties verschijnen in je activiteitenlogboek, leesacties niet
Het maken en intrekken van een sleutel verschijnen allebei in je activiteitenlogboek, net als elke toolaanroep die een agent via MCP doet. Ook een REST-schrijfactie wordt vastgelegd, als de wijziging die hij deed, zoals een aangemaakte tag of een bewerkte transactie. Een REST-leesactie maakt geen vermelding aan. Era legt deze vermeldingen vast bij elk abonnement, maar het lezen van het volledige logboek vereist Organize of hoger: daaronder zie je alleen de meest recente. De vermelding van een schrijfactie noemt je account, niet de sleutel waarmee de wijziging is gedaan.
Als je ooit twijfelt over een sleutel, trek hem dan in. Een sleutel die je zelf hebt gemaakt, werkt vanaf zijn volgende verzoek niet meer op REST en MCP. De sleutel van een agent krijgt meteen geen nieuwe toegang meer, en een token die hij al heeft, verloopt binnen een uur. Een vervanger maken kost een minuut.
- Bereiken zijn grof
- banking:read leest meer dan de endpoints op deze pagina: hetzelfde bereik dekt ook de rest van de leesacties van je account: saldo's, posities, koppelingen, uitgaven. Eén bereik, geen smallere optie. Schrijfbereiken staan ook op het menu, net als leesbereiken, dus behandel elke sleutel als een wachtwoord. Hij handelt als je Era-account, niet als een deel ervan.
- banking:write wijzigt Era, niet je bank
- banking:write wijzigt alleen wat Era bewaart, niets wat je bank bewaart. Het kan geen geld verplaatsen of een betaling doen. Net als banking:read is banking:write één breed bereik. Het dekt de wijzigingen die je zelf in Era kunt maken, zoals de categorie, handelaarsnaam, notitie en beoordelingsstatus van een transactie; categorieën, tags en automatiseringsregels; de namen die Era voor je rekeningen toont en welke je ziet; en handmatige rekeningen met hun saldo's en transacties. Het kan een nieuwe koppeling starten, maar je logt zelf in bij je bank, in de flow van de provider en niet via de sleutel. Het kan om een nieuwe synchronisatie vragen, die alleen leest, of een instelling ontkoppelen. Ontkoppelen beëindigt de verbinding van Era; je rekening bij de bank blijft open en ongewijzigd.
- Bereiken worden niet bijgewerkt
- De bereiken van een sleutel liggen vast wanneer je hem maakt en veranderen daarna nooit. Een sleutel die je vandaag met social:write maakt, dekt straks ook deelopties die nog onderweg zijn. Geef wat je nu gebruikt, niet wat je misschien later gebruikt.
- Geen goedkeuring nodig
- Een sleutel maken vraagt geen beoordeling en geen wachtlijst: niemand bij Era keurt het verzoek goed. Het wordt direct in je activiteitenlogboek vastgelegd, zodat een onbekende sleutel makkelijk te herkennen is.
- Je bankinlog blijft buiten bereik
- Een sleutel kan je bankinlog niet bereiken, omdat Era die nooit heeft. Je voert hem in via de koppelflow van de gegevensprovider, niet op een Era-scherm. Wat Era daarna bewaart, is een toegangstoken per koppeling, in rust versleuteld met AES-256, dat je kunt weggooien door de instelling te ontkoppelen.
- Era bewaart alleen een hash van je sleutel
- Je sleutel bestaat uit 256 bits willekeurige gegevens. Era hasht hem met SHA-256 en bewaart alleen de hash, dus als je hem kwijtraakt, trek je hem in en maak je een nieuwe.
Kernbronnen
Rekeningen
Elke rekening die je kunt zien, over elke gekoppelde instelling, met het aantal rekeningen dat ontbreekt ernaast: excludedAccountCount, uitgesplitst in tierExcludedAccountCount voor de rekeningen die de limiet voor live gegevenskoppelingen van je abonnement buiten houdt, holdingsTierExcludedAccountCount voor de beleggingsrekeningen die de limiet voor beleggingsrekeningen van je abonnement buiten houdt, en userExcludedAccountCount voor die je op elk abonnement opnieuw kunt tonen: die je hebt verborgen, en elke handmatige rekening die nog verborgen is van voordat handmatige rekeningen niet meer meetelden voor de limiet. accountLimit is hoeveel rekeningen die door een live gegevenskoppeling worden gevoed je abonnement tegelijk toont, over al je koppelingen. Handmatige rekeningen en beleggingsrekeningen tellen daar niet voor mee. holdingsLimit is hoeveel beleggingsrekeningen je abonnement tegelijk toont, en 0 betekent dat je abonnement er geen bevat. accountLimitLift noemt het goedkoopste abonnement met ruimte voor elke rekening die meetelt voor accountLimit en die je niet hebt verborgen, en is null wanneer die limiet niets buiten houdt. Elke rekening heeft zijn accountGroupKey, de waarde die het saldo-endpoint in zijn pad neemt, en de connectionId waar hij bij hoort, dus dit is de aanroep om eerst te doen. Neemt connectionId om te beperken tot één koppeling (de aantallen worden meebeperkt; accountLimit, holdingsLimit en accountLimitLift niet), includeExcluded om de rekeningen mee te nemen die je abonnement buiten houdt en die je hebt verborgen, en includeSevered om de rekeningen mee te nemen van koppelingen die je hebt ontkoppeld. De archive van elke rekening zegt of hij is gearchiveerd en waarom; archiveren verandert hoe een rekening wordt weergegeven, nooit een saldo of een aantal.
- connectionIdoptioneel
- Beperk de lijst tot de rekeningen van één koppeling.
- includeExcludedoptioneel
- Neem de rekeningen mee die je abonnement buiten houdt en die je hebt verborgen, met hun saldo's achtergehouden. De visibility van elke rij zegt welke: tierExcluded of userExcluded, en visible voor die je kunt zien; connectionSevered-rijen komen alleen met includeSevered. Het saldo-endpoint schrijft deze anders, dus deel geen parser tussen beide. excludedAccountCount komt nog steeds terug wanneer dit true is, en die rekeningen staan al in de lijst, dus tel de twee niet op. Standaard false.
- includeSeveredoptioneel
- Neem ook de rekeningen mee van koppelingen die je hebt ontkoppeld, elk met visibility connectionSevered. Zo'n rekening tonen brengt hem niet terug; opnieuw koppelen doet dat. Zijn archive leest effective true, tenzij je de rekening koos te behouden. Hij behoudt zijn laatste saldo, met zijn as-of-tijd, alleen als hij zichtbaar was voordat je ontkoppelde; anders worden zijn saldo's achtergehouden. Deze rekeningen zitten nooit in excludedAccountCount of de abonnementsaantallen. Rekeningen van een koppeling die je instelling beëindigde, worden niet meegenomen. Standaard false.
{
"accounts": [
{
"accountGroupKey": "uagr_7f3c9a21",
"connectionId": "ucon_4b19e02c",
"name": "Everyday Checking",
"currentBalance": 4820.16,
"supportsTransactions": true,
…
}
],
"excludedAccountCount": 1
}Een null-saldo is nooit nul, en visibility zegt wat het betekent. Bij een rekening die je hebt verborgen (userExcluded) of die je abonnement buiten houdt (tierExcluded), komen de saldovelden als null terug omdat het saldo wordt achtergehouden, niet leeg is. Bij een zichtbare rekening betekent een null-currentBalance dat de provider nooit een saldo meldde, en supportsBalances zegt of dit soort rekening überhaupt een saldo meldt. Een saldo dat de provider als nul opgaf, komt nog steeds als 0 terug. supportsTransactions is null in dezelfde geest: het betekent dat Era het niet kan zeggen, en nooit dat het antwoord nee is. Hetzelfde geldt voor de abonnementsvelden: als Era je abonnement bij die aanroep niet kon lezen, komen tierExcludedAccountCount, holdingsTierExcludedAccountCount, userExcludedAccountCount, accountLimit, holdingsLimit en accountLimitLift allemaal als null terug. accountLimit is ook null bij een abonnement zonder limiet voor live gegevenskoppelingen, holdingsLimit bij een abonnement zonder limiet voor beleggingsrekeningen of wanneer Era die ruimte niet kon vaststellen, en accountLimitLift wanneer geen abonnement meer ruimte heeft of wanneer de limiet voor live gegevenskoppelingen van je abonnement niets buiten houdt.
Rekeningsaldo
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
}Een verborgen rekening, of een waarvan de koppeling is verbroken, antwoordt nog steeds 200, met de saldovelden als null. Een 404 betekent dat de rekening er echt niet is, of dat de sleutel niet zo gevormd was. Let hier op het veld visibility: het is null wanneer de rekening zichtbaar is, tier_excluded wanneer een van de limieten van je abonnement hem buiten houdt, user_excluded wanneer je hem hebt verborgen, en connection_severed wanneer zijn koppeling is verbroken. Bij een tier_excluded-rekening die meetelt voor de limiet voor live gegevenskoppelingen van je abonnement, is accountLimit die limiet en noemt accountLimitLift het goedkoopste abonnement met ruimte voor elke zulke rekening die je niet hebt verborgen, deze meegerekend. accountLimitLift is null bij een handmatige rekening, een beleggingsrekening en elke andere toestand, en bij connection_severed is accountLimit ook null. Bij een zichtbare rekening (visibility null) betekent een null-currentBalance dat er geen saldo is gemeld, nooit nul. supportsBalances, op de rij van de rekening in de lijst met rekeningen, zegt of dit soort rekening überhaupt een saldo meldt.
Rekeningoverzicht
Totalen over de rekeningen die je kunt zien, standaard live: totalAssets, totalLiabilities en netWorthHint, het eerste min het tweede. Geef simulationModes mee om te kiezen welke modi meetellen: de lijst met rekeningen en de totalen dekken alleen de modi die je noemt. includedSimulationModes zegt welke modi ze dekken, bij elk antwoord. simulationExcludedAccountCount telt de rekeningen die je kunt zien en die vanwege hun modus zijn weggelaten. totalHiddenCount is een apart aantal: de rekeningen die je abonnement of je eigen zichtbaarheidsinstelling verbergt, in elke modus, en nooit die simulationModes wegliet.
- simulationModesoptioneel
- Welke soorten rekening worden opgeteld: live voor echt geld, paper voor een oefenrekening bij een broker, scenario voor een hypothetische. Herhaal de parameter om meer dan één te vragen, zoals in simulationModes=live&simulationModes=paper. Laat hem weg voor alleen live rekeningen. Een lege of onbekende waarde wordt geweigerd met een 400 die de toegestane opsomt.
{
"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 telt alleen de rekeningen in dit antwoord, en twee aantallen vertellen wat het weglaat. simulationExcludedAccountCount zijn de rekeningen buiten de modi waar je om vroeg. totalHiddenCount zijn de rekeningen die voor jou verborgen zijn in elke modus. Het splitst in drie: tierExcludedAccountCount voor die de limiet voor live gegevenskoppelingen van je abonnement buiten houdt, holdingsTierExcludedAccountCount voor de beleggingsrekeningen die de limiet voor beleggingsrekeningen van je abonnement buiten houdt, en userExcludedAccountCount voor die je op elk abonnement opnieuw kunt tonen. Alle drie zijn null als Era je abonnement bij die aanroep niet kon lezen. accountLimitLift noemt het goedkoopste abonnement dat het eerste soort terugbrengt, en is null als er geen zijn. Een rekening waarvan het saldo niet is gemeld, staat nog steeds in de lijst, maar voegt niets toe aan de totalen. Behandel netWorthHint als een beginwaarde en niet als een gezaghebbend vermogen.
Transacties
Je transacties, een pagina tegelijk, verpakt in een envelop met de pagineringsaantallen ernaast. Neemt page en pageSize (100 is het maximum), plus optionele filters voor rekening, periode, toegepaste regels en toegewezen tags.
- accountIdoptioneel
- Beperk tot de transacties van één rekening, op basis van zijn accountGroupKey. Als het samenvoegen van rekeningen voor jou aanstaat en je die rekening met andere hebt samengevoegd, krijg je de transacties van elke rekening in de samenvoeging, elk met zijn eigen rekening. Als de samenvoeging meer dan 100 rekeningen heeft, krijg je alleen de transacties van deze rekening.
- fromDateoptioneel
- Alleen transacties op of na deze datum.
- toDateoptioneel
- Alleen transacties op of vóór deze datum.
- pageoptioneel
- Paginanummer, vanaf 1. Standaard 1; onder 1 wordt gelezen als 1, en een pagina voorbij de laatste komt leeg terug.
- pageSizeoptioneel
- Rijen per pagina. Standaard 50, begrensd tussen 1 en 100.
- sortByoptioneel
- Veld om op te sorteren: transactionDate, amount, description, category of merchantName.
- sortDirectionoptioneel
- asc of desc. Standaard aflopend.
- categoryKeysoptioneel
- 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.
- searchoptioneel
- Zoeken in volledige tekst over handelaar, omschrijving, categorie, rekeningnaam en bedrag.
- ruleIdsoptioneel
- Alleen transacties waar een automatiseringsregel aan heeft gezeten, op basis van de sleutel van de regel.
- tagKeysoptioneel
- Alleen transacties met een van deze tags.
- reviewStatusesoptioneel
- needs_review, reviewed of flagged. Neemt een lijst; een transactie komt overeen als zijn beoordelingsstatus een van deze is.
- includeChildrenoptioneel
- With a category filter set, also include transactions in the subcategories of every key you passed. Defaults to false.
- includePendingoptioneel
- Geef ook afschrijvingen in behandeling van de afgelopen 7 dagen terug, gemarkeerd met isPending. Standaard false. Rijen in behandeling zijn alleen-lezen.
{
"transactions": [ … ],
"pagination": {
"currentPage": 1,
"pageSize": 20,
"totalItems": 412,
"totalPages": 21
},
"historyWindowApplied": true,
"historyWindowFloorDate": "2026-06-28",
"historyWindowHiddenCount": 137,
"historyWindowEarliestDate": "2024-03-02",
"historyWindowDegraded": false
}Er is geen aanroep die één transactie leest op basis van zijn id. GET /banking/transactions/{id} antwoordt 405 met Allow: PUT, omdat dat pad een transactie alleen wijzigt. Om er een te lezen, lijst je met filters die tot die ene beperken: accountId ingesteld op de accountGroupKey, fromDate en toDate allebei op de transactionDate, en search op de handelaarsnaam of het bedrag. Zoek hem daarna op zijn id in wat terugkomt. Voeg includePending toe als het een recente afschrijving in behandeling is.
Je abonnement kan een ondergrens voor het geschiedenisvenster toepassen, die transacties verbergt die ouder zijn. Daarom bevat het antwoord de historyWindow-velden: historyWindowApplied zegt dat een ondergrens echt iets verborg, historyWindowFloorDate is waar die lag, historyWindowHiddenCount is hoeveel rijen erachter zitten en historyWindowEarliestDate is hoe ver je geschiedenis echt teruggaat. Zonder deze velden is een korte resultatenset niet te onderscheiden van een rekening zonder oudere transacties. Twee ervan veranderen wat je schrijft: historyWindowHiddenCount kan null zijn, ook als een ondergrens gold, dus lees null als onbekend en niet als nul; en als historyWindowDegraded true is, kon Era je abonnement bij die leesactie niet bevestigen, dus de datum van de ondergrens is een gok en geen feit. Bij een bevestigde betaalde leesactie geldt er geen ondergrens en komt historyWindowApplied als false terug. De limieten van je abonnement laten ook transacties weg: tierExcludedAccountCount is hoeveel van je rekeningen de limiet op live gegevenskoppelingen buiten deze leesactie houdt, holdingsTierExcludedAccountCount hoeveel van je beleggingsrekeningen de limiet voor beleggingsrekeningen buiten houdt, en userExcludedAccountCount hoeveel je op elk abonnement opnieuw kunt tonen. Alle drie zijn beperkt tot de rekening waarop je filterde, als dat zo is. Alle drie zijn null wanneer Era je abonnement bij die aanroep niet kon lezen.
Door een lange geschiedenis heen pagineren kost verzoeken. Je abonnement bepaalt hoe snel je kunt aanroepen en, bij het gratis abonnement, hoeveel aanroepen je per dag krijgt; betaalde abonnementen draaien op redelijk gebruik. Limieten bevat de cijfers per abonnement, de rate-limit-headers en wat een 429 je vertelt.
Eén transactie wijzigen
Vier dingen van een transactie kun je zelf overschrijven: de categorie, de handelaarsnaam, een eigen notitie en de beoordelingsstatus. Stuur alleen mee wat je wijzigt; alles wat je weglaat blijft zoals het is. De id in het pad is de utgr_-sleutel van de transactie. Je hebt banking:write nodig in plaats van banking:read, maar het wijzigt alleen de kopie van de transactie bij Era: die bij je bank blijft zoals ze was.
- categoryKeyoptioneel
- De fcat_-sleutel van de categorie die je wilt toewijzen. Laat hem weg en de transactie houdt de categorie die hij heeft.
- merchantNameoptioneel
- Een eigen handelaarsnaam, tot 1000 tekens. Laat hem weg en de huidige naam blijft.
- descriptionoptioneel
- Een eigen notitie bij deze transactie, tot 5000 tekens. Laat hem weg en de huidige notitie blijft.
- clearCategoryoptioneel
- Haalt je categorie-overschrijving weg, zodat de eigen categorisering van Era het weer overneemt. Standaard false.
- clearMerchantNameoptioneel
- Haalt je overschrijving van de handelaarsnaam weg, zodat de naam die je bank stuurde terugkomt. Standaard false.
- clearDescriptionoptioneel
- Haalt je overschrijving van de omschrijving weg, zodat de omschrijving die je bank stuurde terugkomt. Standaard false.
- reviewStatusoptioneel
- Markeer hem als needs_review, reviewed of flagged.
- clearReviewStatusoptioneel
- Haalt je overschrijving van de beoordelingsstatus weg. Standaard false.
{
"transaction": { … }
}Je krijgt de hele bijgewerkte transactie terug, in dezelfde vorm als de lijst hierboven teruggeeft. Hier niet herhaald, omdat hij groot is en nog verandert zolang de API in bèta is. Een veld instellen en wissen in dezelfde aanroep komt als 400 terug. Een transactie die niet van jou is, of er helemaal niet is, komt als 403 terug: de API maakt geen onderscheid tussen die twee. En als iets anders dezelfde rij wijzigde terwijl jij schreef, krijg je 409: lees hem opnieuw en stuur hem opnieuw. Om hem later opnieuw te lezen gebruik je de lijst hierboven: dit pad neemt alleen PUT, en een GET erop antwoordt 405.
Tot 100 tegelijk wijzigen
Dezelfde vier overschrijvingen, toegepast op een lijst transacties in één aanroep. Elke id in de lijst krijgt dezelfde wijzigingen; er is geen variatie per transactie. Je hebt banking:write nodig in plaats van banking:read, maar het wijzigt alleen de kopieën van die transacties bij Era: die bij je bank blijven zoals ze waren.
- transactionIds
- De utgr_-sleutels van de te wijzigen transacties. Minstens één en niet meer dan 100. Meer dan 100 wordt geweigerd in plaats van ingekort: anders dan bij pageSize hierboven krijg je een 400 en verandert er niets.
- categoryKeyoptioneel
- De fcat_-sleutel van de categorie die je wilt toewijzen. Laat hem weg en de transactie houdt de categorie die hij heeft.
- merchantNameoptioneel
- Een eigen handelaarsnaam, tot 1000 tekens. Laat hem weg en de huidige naam blijft.
- descriptionoptioneel
- Een eigen notitie bij deze transactie, tot 5000 tekens. Laat hem weg en de huidige notitie blijft.
- clearCategoryoptioneel
- Haalt je categorie-overschrijving weg, zodat de eigen categorisering van Era het weer overneemt. Standaard false.
- clearMerchantNameoptioneel
- Haalt je overschrijving van de handelaarsnaam weg, zodat de naam die je bank stuurde terugkomt. Standaard false.
- clearDescriptionoptioneel
- Haalt je overschrijving van de omschrijving weg, zodat de omschrijving die je bank stuurde terugkomt. Standaard false.
- reviewStatusoptioneel
- Markeer hem als needs_review, reviewed of flagged.
- clearReviewStatusoptioneel
- Haalt je overschrijving van de beoordelingsstatus weg. Standaard false.
{
"transactions": [ … ]
}Je krijgt de bijgewerkte transacties terug, in dezelfde vorm als de lijst hierboven teruggeeft. Een veld instellen en wissen in dezelfde aanroep komt als 400 terug, en een lege lijst ook. Een lijst met een transactie die niet van jou is, of er helemaal niet is, komt voor de hele aanroep als 403 terug: er wordt niets gewijzigd. Als iets anders een van die rijen wijzigde terwijl jij schreef, krijg je 409: lees ze opnieuw en stuur ze opnieuw.
Categorieën
De hele categorietaxonomie: elke set categorieën, met de subcategorieën erin genest. De taxonomie wordt gedeeld, niet per rekening.
{
"packs": [
{
"packSlug": "default",
"packName": "Era default categories",
"isDefault": true,
"categories": [
{
"projectionKey": "fcat_food_dining",
"categoryName": "Food & dining",
"isTopLevel": true,
"children": [ … ]
}
]
}
],
"meterLimit": 25,
"canCreateCustomCategories": true
}Een categorie toevoegen
Een door de gebruiker gedefinieerde categorie onder een bestaande bovenliggende categorie. Je hebt banking:write nodig in plaats van banking:read, maar het wijzigt alleen je categorieën in Era: bij je bank verandert niets.
- slug
- URL-veilige identificatie: kleine letters, cijfers en koppeltekens, 2 tot 50 tekens, en uniek over de zichtbare categorieën die je hebt gemaakt, niet alleen onder één bovenliggende categorie. Een slug van een categorie die je hebt verborgen of verwijderd is niet bezet: maak je er een mee aan, dan komt die categorie terug onder zijn oude sleutel.
- parentCategoryKey
- De fcat_-sleutel van de categorie waaronder deze valt.
- name
- Weergavenaam.
- descriptionoptioneel
- Optionele beschrijving.
- iconNameoptioneel
- Optionele pictogramnaam.
- spendingTypeoptioneel
- Optionele indeling van uitgaven.
- displayOrderoptioneel
- Optionele sorteerpositie onder zijn broers en zussen.
- assignmentEligibilityoptioneel
- Optionele regel voor aan welke transacties deze categorie kan worden toegewezen.
- sourceSystemKeysoptioneel
- Optionele lijst met bestaande categoriesleutels waarvan de transacties voortaan hierheen moeten worden gestuurd.
- applyRetroactivelyoptioneel
- Als true, worden ook eerdere transacties opnieuw beoordeeld tegen de nieuwe routering. Standaard false.
{
"categoryKey": "fcat_side_hustle_9f2a",
"overlayProjectionKey": "fcov_9f2a1c",
"action": "created",
"isQuotaExceeded": false,
"createdMappingRuleKeys": [ … ],
…
}Het antwoord bevat ook retroactiveAffectedCount, retroactiveStatus, mergeSourcesHiddenCount en mergeSourcesTotalCount, die deze pagina niet behandelt, plus isQuotaExceeded, quotaExceededMessage en meterGate, die bij een gemaakte categorie altijd false, null en null zijn. Een aanmaak die de limiet van je abonnement weigert, krijgt in plaats daarvan een 402, zonder die velden: de inhoud is statusCode, message en errors.generalErrors, waarvan de enige vermelding zegt welke limiet je raakte. Een categorie maken met een slug die een van de zichtbare categorieën die je maakte al gebruikt, komt terug als 400, niet als 409. De 409 die deze aanroep declareert is bewaard voor een zeldzame race: twee verzoeken die op hetzelfde moment dezelfde slug maken. In beide gevallen is die slug bezet, dus stuur een andere of gebruik de categorie die hem heeft.
Tags
Elke tag op je account, als één lijst. Geen paginering: één antwoord geeft ze allemaal terug.
- tagTypeoptioneel
- Filter op herkomst van de tag: user, system of auto.
- includeDeletedoptioneel
- Verwijderde tags meenemen. Standaard false.
{
"tags": [
{
"tagKey": "ftag_3fG7kL9p",
"name": "business-expense",
"displayName": "Business expense",
"tagType": "user",
"color": "#6DC6BA",
"transactionCount": 42
}
]
}Een tag maken
Een nieuwe tag, genormaliseerd: bijgesneden, in kleine letters, en met elke reeks witruimte omgezet in één koppelteken. Je hebt banking:write nodig in plaats van banking:read, maar het wijzigt alleen je tags in Era: bij je bank verandert niets. Systeemtags kunnen niet via de API worden gemaakt; user- en auto-tags wel.
- name
- De canonieke naam van de tag.
- displayNameoptioneel
- Optionele weergavenaam. Standaard de canonieke naam.
- tagTypeoptioneel
- user or auto. Defaults to user. system is refused — it is reserved for tags Era creates itself.
- coloroptioneel
- Optionele hexkleur voor weergave.
- iconoptioneel
- Optionele pictogramnaam.
{
"tag": {
"tagKey": "ftag_3fG7kL9p",
"name": "business-expense",
"displayName": "Business expense",
"tagType": "user",
"version": 1,
"createdAt": "2026-08-26T09:15:00Z"
}
}Een tag maken die je al hebt, komt terug als 400, niet als 409, met een fout die hem noemt. Namen worden vergeleken na normalisatie, dus Coffee Shop en coffee-shop zijn dezelfde tag. Om hem te gebruiken, zoek je hem in de lijst hierboven in plaats van hem opnieuw te maken.
Transacties taggen of de tag verwijderen
Zet één tag op een lijst transacties, of haalt hem ervan af, in één aanroep: operation zegt welke. Beide zijn veilig te herhalen: een transactie taggen die de tag al heeft, of er een van afhalen die hem niet heeft, verandert niets. Het antwoord somt de transacties op die je noemde, elk met de tags die hij nu heeft; bij een abonnement dat alleen recente geschiedenis toont, wordt een oudere transactie nog wel gewijzigd maar blijft hij buiten de lijst. Je hebt banking:write nodig in plaats van banking:read, maar het wijzigt alleen de kopieën van die transacties bij Era: die bij je bank blijven zoals ze waren.
- operation
- assign om de tag erop te zetten, remove om hem eraf te halen.
- tagKey
- De tagKey van de tag, zoals de lijst met tags hem teruggeeft. Het moet een van je tags zijn, en niet een die je hebt verwijderd.
- transactionIds
- De utgr_-sleutels van de te taggen of te ontdoen transacties. Minstens één en niet meer dan 100. Meer dan 100 wordt geweigerd in plaats van ingekort: je krijgt een 400 en er verandert niets.
{
"transactions": [ … ]
}Je krijgt de transacties terug die je noemde, in dezelfde vorm als de transactielijst teruggeeft, en de appliedTags van elk somt de tags op die hij nu heeft. Er verandert niets wanneer de aanroep wordt geweigerd: een 403 als een transactie niet van jou is of niet bestaat (de API maakt geen onderscheid tussen die twee), een 404 als de tagKey niet een van je tags is of je hem hebt verwijderd, en een 409 als een transactie nog in behandeling is, omdat hij niet kan veranderen totdat hij is geboekt.
Terugkerende afschrijvingen
De afschrijvingen, facturen en inkomsten die in je transacties terugkeren, grootste estimatedAmount eerst. De lijst komt van een van twee plekken. Zodra Era terugkerende patronen in je transacties heeft gedetecteerd, somt hij die op, elk met confidence system. Tot dan groepeert hij de recente transacties die de gegevens van je bank als terugkerend markeren, een abonnement, een factuurbetaling of inkomsten, per handelaar en valuta, elke groep met confidence provider. Elk item heeft de handelaar; estimatedAmount, het gebruikelijke bedrag per keer, nooit negatief, welke kant het geld ook op gaat; frequency, de schatting van Era hoe vaak het terugkeert; category, dat null is als er geen is en altijd null voor een patroon dat Era detecteerde; lastSeen, de datum van de laatste transactie, of bij een patroon dat Era detecteerde, de datum waarop het werd gedetecteerd; type; en confidence. type is subscription, bill of income waar de gegevens van je bank zeggen welke, en recurring waar ze dat niet zeggen, wat elk patroon is dat Era detecteerde. Dus bij een item met type recurring zegt niets of het geld binnenkomt of uitgaat. Afschrijvingen in behandeling blijven buiten beschouwing. Neemt geen parameters en negeert alles wat je meestuurt.
{
"items": [
{
"merchant": "Netflix",
"estimatedAmount": { "amount": 15.49, "currency": "USD", … },
"frequency": "monthly",
"category": "Entertainment",
"lastSeen": "2026-09-28",
"type": "subscription",
"confidence": "provider"
},
…
]
}Kasstroom
Geld erin en geld eruit over één periode: inkomsten, uitgaven en netto, dat is het eerste min het tweede, met de categorieën achter elke kant: incomeCategories en expenseCategories, grootste eerst, elk met zijn bedrag, zijn aandeel in het totaal van die kant en hoeveel transacties erin zitten. Overboekingen tussen je rekeningen, afschrijvingen in behandeling, en transacties die je hebt verborgen of die op rekeningen staan die je hebt verborgen of die de limiet voor live gegevenskoppelingen van je abonnement buiten houdt, blijven buiten beschouwing; excludedAccountCount telt die rekeningen. income en expense tellen elke categorie aan hun kant, ook elke categorie die topN van de lijst laat, dus de categorieën die je terugkrijgt kunnen samen minder zijn dan het totaal van hun kant; elke percentOfTotal is een aandeel van dat volledige totaal. De periode waar je om vroeg komt terug met zijn begin, einde en een leesbaar label; een venster komt terug met zijn sleutel in period.window en de tijdzone die bepaalde wat vandaag is in period.timeZone. Wanneer incomePercentOfTotalUnavailable of expensePercentOfTotalUnavailable true is, zijn de percentOfTotal-waarden van die kant 0 omdat het aandeel niet kon worden berekend, niet omdat de categorie 0% ervan is: lees ze als ontbrekend. Elke categorie en subcategorie heeft ook displayOrder, zijn plaats in je eigen categorielijst vanaf 0, dus sorteren erop toont ze in de volgorde waarin je ze bewaart; het is null voor ongecategoriseerd geld, voor een categorie die je lijst niet toont, en voor elke categorie wanneer je categorielijst niet kon worden gelezen. Standaard deze maand.
- periodoptioneel
- De periode om samen te vatten: this_week, this_month, last_month, last_7_days, last_30_days, last_90_days, this_year, last_year, all_time, of custom met periodStart en periodEnd. Standaard this_month. Een naam die hij niet herkent wordt gelezen als this_month, al herhaalt het antwoord de naam die je stuurde.
- periodStartoptioneel
- De eerste dag van een eigen bereik, geschreven als yyyy-MM-dd. Meesturen maakt het bereik eigen, wat period ook zegt. Laat periodEnd weg en het bereik loopt tot vandaag, tenzij period custom is, wat beide data nodig heeft en zonder die 400 antwoordt.
- periodEndoptioneel
- De laatste dag van een eigen bereik, geschreven als yyyy-MM-dd en niet vóór periodStart. Het heeft periodStart nodig.
- accountGroupKeyoptioneel
- Beperk de samenvatting tot één rekening, op basis van zijn accountGroupKey. Als het samenvoegen van rekeningen voor jou aanstaat en je die rekening met andere hebt samengevoegd, dekken de totalen elke rekening in de samenvoeging. Als de samenvoeging meer dan 100 rekeningen heeft, dekken de totalen alleen deze. Een sleutel die niet een van je rekeningen is, komt met niets overeen, dus elk totaal komt als nul terug.
- topNoptioneel
- Hoeveel categorieën per kant worden teruggegeven, van 1 tot 50. Standaard 10.
- includeSubcategoriesoptioneel
- Geef elke categorie een children-lijst die hem uitsplitst per subcategorie. Standaard false.
- windowoptioneel
- Een reeks data geteld vanaf je eigen vandaag, in je tijdzone, meegestuurd in plaats van period: last_7_days, last_30_days, last_90_days, week_to_date, month_to_date, last_month, all_time, last_6_months, last_12_months, year_to_date, last_60_days, trailing_6_months, trailing_12_months. last_7_days zijn de 7 dagen die vandaag eindigen; last_30_days zijn de 30 dagen die vandaag eindigen; last_90_days zijn de 90 dagen die vandaag eindigen; week_to_date loopt van de maandag op of vóór vandaag tot en met vandaag; month_to_date loopt van de eerste van deze maand tot en met vandaag; last_month is de hele kalendermaand vóór deze; all_time heeft geen eerste dag en loopt tot en met vandaag; last_6_months loopt van de eerste van de maand 5 maanden vóór deze tot en met vandaag, dus deze maand tot nu toe is de laatste van de 6 maanden; last_12_months loopt van de eerste van de maand 11 maanden vóór deze tot en met vandaag, dus deze maand tot nu toe is de laatste van de 12 maanden; year_to_date loopt van 1 januari van dit jaar tot en met vandaag; last_60_days zijn de 60 dagen die vandaag eindigen; trailing_6_months loopt van de datum 6 maanden vóór morgen tot en met vandaag, of van de laatste datum van die maand als die zo'n dag niet heeft; trailing_12_months loopt van de datum 12 maanden vóór morgen tot en met vandaag, of van de laatste datum van die maand als die zo'n dag niet heeft. last_month laat deze maand buiten beschouwing, terwijl last_6_months en last_12_months deze maand tot nu toe als hun laatste maand tellen. trailing_6_months en trailing_12_months zijn geen kalendermaanden: elk begint op de datum zoveel maanden vóór morgen, dus zijn eerste maand is een deelmaand tenzij vandaag de laatste datum van deze maand is. year_to_date telt op de datum van vandaag in je tijdzone, dus het is niet de periode this_year, die telt op de UTC-datum: de twee dekken verschillende data wanneer jouw datum en de UTC-datum verschillen. Het kan niet worden meegestuurd met period, periodStart of periodEnd.
{
"period": { "period": "last_month", "start": "2026-09-01", "end": "2026-09-30", "label": "September 2026", "window": null, "timeZone": null },
"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,
"displayOrder": 3,
"children": null
},
…
],
"excludedAccountCount": 0,
"excludedAccountNote": null,
"incomePercentOfTotalUnavailable": false,
"expensePercentOfTotalUnavailable": false
}Regels
Elke automatiseringsregel op je account: die je zelf maakte en die Era voor je instelde uit zijn regelbibliotheek. Elk met zijn voorwaarden (filters), wat hij doet (acties), of hij aanstaat en zijn versie. Geen paginering: één antwoord geeft ze allemaal terug. Uitgeschakelde regels blijven weg, tenzij je erom vraagt.
- includeInactiveoptioneel
- Geef ook de regels terug die uitstaan. Standaard 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 en actions zijn lijsten van getypeerde objecten. Elk noemt zijn soort in een type-veld: merchant_match of category onder de filters, set_category of add_tag onder de acties. Het OpenAPI-document waarnaar de snelstart linkt, somt elke soort op en de velden die hij neemt.
Een regel maken
Een nieuwe automatiseringsregel: voorwaarden die transacties selecteren, en wat er gebeurt met elke transactie waarop ze passen. Hij draait vanaf dat moment op elke nieuwe transactie, en ook op de transacties die je al hebt als je erom vraagt. Je hebt banking:write nodig in plaats van banking:read, maar het wijzigt alleen je regels en transacties in Era: bij je bank verandert niets.
- ruleName
- Een naam voor de regel.
- descriptionoptioneel
- Een optionele notitie over waar de regel voor dient.
- priorityoptioneel
- Waar de regel draait onder je andere: hoger draait eerst, en als twee regels hetzelfde op één transactie zouden instellen, wint de hogere. Standaard nul.
- filters
- De voorwaarden, als lijst van getypeerde filterobjecten; elk noemt zijn soort in een type-veld. Een transactie moet aan elk voldoen; nest and-, or- en not-filters om ze anders te combineren. Minstens één. Een account_type-filter dat rekeningtypen opsomt, werkt alleen bij een patroonregel; bij een transactieregel wordt het geweigerd met een 400.
- actions
- Wat er gebeurt met elke transactie waarop de regel past, als lijst van getypeerde actieobjecten: een categorie instellen, een tag toevoegen of verwijderen, de handelaar hernoemen, de omschrijving herschrijven, een beoordelingsstatus instellen, hem verbergen of markeren als overboeking. Minstens één, en niet meer dan één van elke soort, behalve de tagacties. Elke tag moet al bestaan en mag één keer voorkomen.
- isActiveoptioneel
- Of de regel aan begint. Standaard true.
- applyRetroactivelyoptioneel
- Laat de regel ook draaien over de transacties die je al hebt, niet alleen nieuwe. Werkt alleen als de regel aan begint. Standaard false.
- appliesFromoptioneel
- Alleen transacties op of na deze datum.
- appliesTooptioneel
- Alleen transacties op of vóór deze datum.
- applicationScopeoptioneel
- Wanneer de regel draait: prospective alleen voor nieuwe transacties, retroactive wanneer hij over bestaande wordt uitgevoerd, of both. Standaard both.
- ruleScopeoptioneel
- transaction, de standaard, past transacties een voor een. pattern past een patroon over meerdere, een terugkerende afschrijving of een paar overboekingen, beschreven door patternSpec.
- triggerModeoptioneel
- Voor een patroonregel wanneer op het patroon wordt gecontroleerd: onEachTransaction, onBatchComplete, onSchedule of onDemand. Standaard onEachTransaction.
- patternSpecoptioneel
- Voor een patroonregel het patroon om naar te zoeken, als getypeerd object. Verplicht wanneer ruleScope pattern is.
- windowDaysoptioneel
- Voor een patroonregel hoeveel dagen terug naar de rest van het patroon wordt gezocht, tussen 1 en 365. Verplicht wanneer ruleScope pattern is.
- windowLookaheadDaysoptioneel
- Voor een patroonregel hoeveel dagen vooruit naar de rest van het patroon wordt gezocht.
- windowExcludeTriggerAccountoptioneel
- Voor een patroonregel de rekening van de transactie die de controle startte buiten de zoekopdracht laten. Standaard false.
- groupoptioneel
- De groep waaronder de regel wordt ingedeeld: spendingHabits, problemsAndAnomalies, incomeAndTransfers, subscriptionsAndRecurring of taxAndRecordKeeping. Laat hem weg om hem onder none in te delen. categoryMapping is gereserveerd voor regels die Era zelf maakt en wordt geweigerd met een 400.
{
"rule": { … },
"retroactiveStatus": "in_progress",
"affectedTransactionCount": 0
}retroactiveStatus is null tenzij je de aanroep vroeg de regel toe te passen op transacties die je al hebt, of ongedaan te maken wat hij deed. in_progress betekent dat dat werk met de wijziging wordt vastgelegd en op de achtergrond draait, dus affectedTransactionCount is nog niet definitief; het activiteitenlogboek legt vast hoe het afloopt.
Een regel voorvertonen
Probeert de voorwaarden van een regel uit op je recente transacties en meldt waarop ze zouden passen, zonder iets op te slaan: hoeveel overeenkwamen van hoeveel er werden gecontroleerd, tot 50 van de overeenkomende sleutels en tot 10 voorbeelden. Een transactieregel controleert de laatste 90 dagen, hoogstens 5.000 transacties, en zijn voorbeelden bevatten de handelaar, het bedrag en de datum. De voorbeelden van een patroonregel bevatten detectionReason, waarom het patroon paste (wat leeg kan zijn), en geen handelaar, bedrag of datum. Er wordt niets geschreven, dus banking:read is genoeg.
- filters
- De voorwaarden, als lijst van getypeerde filterobjecten; elk noemt zijn soort in een type-veld. Een transactie moet aan elk voldoen; nest and-, or- en not-filters om ze anders te combineren. Minstens één. Een account_type-filter dat rekeningtypen opsomt, werkt alleen bij een patroonregel; bij een transactieregel wordt het geweigerd met een 400.
- ruleScopeoptioneel
- transaction, de standaard, past transacties een voor een. pattern past een patroon over meerdere, een terugkerende afschrijving of een paar overboekingen, beschreven door patternSpec.
- patternSpecoptioneel
- Voor een patroonregel het patroon om naar te zoeken, als getypeerd object. Verplicht wanneer ruleScope pattern is.
- windowDaysoptioneel
- Voor een patroonregel hoeveel dagen terug naar de rest van het patroon wordt gezocht, tussen 1 en 365. Verplicht wanneer ruleScope pattern is.
{
"matchCount": 12,
"totalEvaluated": 418,
"matchingGroupKeys": ["utgr_5d0e2b77", … ],
"sampleMatches": [
{
"groupKey": "utgr_5d0e2b77",
"merchantName": "Blue Bottle Coffee",
"amount": -6.25,
"currency": "USD",
"transactionDate": "2026-09-12"
},
…
]
}Een regel wijzigen
Vervangt de definitie van een regel door degene die je meestuurt, dus stuur elk veld mee dat je wilt behouden, niet alleen wat je wijzigt. De ruleId in het pad is de id die de lijst met regels teruggeeft, en version moet degene zijn die je het laatst las. Bij een regel uit de bibliotheek van Era kan alleen userOverrides veranderen: stuur al het andere terug zoals de lijst het teruggaf. Je hebt banking:write nodig in plaats van banking:read, maar het wijzigt alleen je regels en transacties in Era: bij je bank verandert niets.
- versionoptioneel
- De versie van de regel zoals je hem het laatst las. Die moet overeenkomen met de huidige versie van de regel, anders wordt de aanroep geweigerd met een 409. Weglaten slaat de controle dus niet over, maar laat hem falen.
- ruleName
- Een naam voor de regel.
- descriptionoptioneel
- Een optionele notitie over waar de regel voor dient.
- priorityoptioneel
- Waar de regel draait onder je andere: hoger draait eerst, en als twee regels hetzelfde op één transactie zouden instellen, wint de hogere. Standaard nul.
- filters
- De voorwaarden, als lijst van getypeerde filterobjecten; elk noemt zijn soort in een type-veld. Een transactie moet aan elk voldoen; nest and-, or- en not-filters om ze anders te combineren. Minstens één. Een account_type-filter dat rekeningtypen opsomt, werkt alleen bij een patroonregel; bij een transactieregel wordt het geweigerd met een 400.
- actions
- Wat er gebeurt met elke transactie waarop de regel past, als lijst van getypeerde actieobjecten: een categorie instellen, een tag toevoegen of verwijderen, de handelaar hernoemen, de omschrijving herschrijven, een beoordelingsstatus instellen, hem verbergen of markeren als overboeking. Minstens één, en niet meer dan één van elke soort, behalve de tagacties. Elke tag moet al bestaan en mag één keer voorkomen.
- applyRetroactivelyoptioneel
- Laat de gewijzigde regel opnieuw draaien over de transacties die je al hebt, en maak eerst ongedaan wat de oude versie ermee deed. Standaard false.
- appliesFromoptioneel
- Alleen transacties op of na deze datum.
- appliesTooptioneel
- Alleen transacties op of vóór deze datum.
- applicationScopeoptioneel
- Wanneer de regel draait: prospective alleen voor nieuwe transacties, retroactive wanneer hij over bestaande wordt uitgevoerd, of both. Standaard both.
- userOverridesoptioneel
- Bij een regel uit de bibliotheek van Era je eigen waarden voor de instellingen die je mag afstemmen, als getypeerd object van dezelfde soort als het patroon van de regel. Wordt genegeerd bij regels die je zelf maakte.
- groupoptioneel
- De groep waaronder de regel wordt ingedeeld, uit dezelfde lijst die create neemt. De update vervangt de hele definitie, dus weglaten wist de groep van de regel: stuur zijn huidige groep mee om hem te behouden. Bij een regel uit de bibliotheek van Era laat je hem weg of stuur je de groep die hij al heeft.
{
"rule": { … },
"retroactiveStatus": null,
"affectedTransactionCount": 0
}retroactiveStatus is null tenzij je de aanroep vroeg de regel toe te passen op transacties die je al hebt, of ongedaan te maken wat hij deed. in_progress betekent dat dat werk met de wijziging wordt vastgelegd en op de achtergrond draait, dus affectedTransactionCount is nog niet definitief; het activiteitenlogboek legt vast hoe het afloopt.
Een regel aanzetten
Zet een regel weer aan, zodat hij weer op nieuwe transacties draait. Een regel aanzetten die al aanstaat, verandert niets. Regels uit de bibliotheek van Era kunnen net als de jouwe aan- en uitgezet worden. Je hebt banking:write nodig in plaats van banking:read, maar het wijzigt alleen je regels en transacties in Era: bij je bank verandert niets.
- versionoptioneel
- De versie van de regel zoals je hem het laatst las. Laat hem weg om de controle over te slaan; stuur hem mee, en de aanroep wordt geweigerd met een 409 als de regel intussen is veranderd.
{
"rule": { … },
"retroactiveStatus": null,
"affectedTransactionCount": 0
}Een regel uitzetten
Zet een regel uit, zodat hij stopt met draaien op nieuwe transacties. Hij behoudt zijn definitie, en wat hij al deed blijft staan tenzij je het terugvraagt met revert_retroactively. Een regel uitzetten die al uitstaat, laat hem uit. Je hebt banking:write nodig in plaats van banking:read, maar het wijzigt alleen je regels en transacties in Era: bij je bank verandert niets.
- versionoptioneel
- De versie van de regel zoals je hem het laatst las. Laat hem weg om de controle over te slaan; stuur hem mee, en de aanroep wordt geweigerd met een 409 als de regel intussen is veranderd.
- revert_retroactivelyoptioneel
- Maak ook ongedaan wat de regel al met je transacties deed: de categorieën, tags en andere wijzigingen die hij toepaste. Standaard false, waardoor die wijzigingen blijven staan.
{
"rule": { … },
"retroactiveStatus": null,
"affectedTransactionCount": 0
}retroactiveStatus is null tenzij je de aanroep vroeg de regel toe te passen op transacties die je al hebt, of ongedaan te maken wat hij deed. in_progress betekent dat dat werk met de wijziging wordt vastgelegd en op de achtergrond draait, dus affectedTransactionCount is nog niet definitief; het activiteitenlogboek legt vast hoe het afloopt.
Een regel verwijderen
Verwijdert een regel voorgoed. Om een regel te stoppen zonder hem te verliezen, zet je hem in plaats daarvan uit. De ruleId in het pad is de id die de lijst met regels teruggeeft, en version moet degene zijn die je het laatst las. Regels uit de bibliotheek van Era kunnen niet worden verwijderd, alleen uitgezet. Je hebt banking:write nodig in plaats van banking:read, maar het wijzigt alleen je regels en transacties in Era: bij je bank verandert niets. Met revert_retroactively worden het verwijderen en het ongedaan maken van wat de regel met je bestaande transacties deed samen vastgelegd, dus het ongedaan maken kan niet verloren gaan zodra het verwijderen slaagt: het antwoord zegt in_progress, het ongedaan maken draait op de achtergrond en het activiteitenlogboek legt vast hoe het afloopt.
- versionoptioneel
- De versie van de regel zoals je hem het laatst las. Die moet overeenkomen met de huidige versie van de regel, anders wordt de aanroep geweigerd met een 409. Weglaten slaat de controle dus niet over, maar laat hem falen.
- revert_retroactivelyoptioneel
- Maak ook ongedaan wat de regel al met je transacties deed: de categorieën, tags en andere wijzigingen die hij toepaste. Standaard false, waardoor die wijzigingen blijven staan.
{
"success": true,
"retroactiveStatus": null,
"affectedTransactionCount": 0
}retroactiveStatus is null tenzij je de aanroep vroeg de regel toe te passen op transacties die je al hebt, of ongedaan te maken wat hij deed. in_progress betekent dat dat werk met de wijziging wordt vastgelegd en op de achtergrond draait, dus affectedTransactionCount is nog niet definitief; het activiteitenlogboek legt vast hoe het afloopt.