# Klirr

> Gratis app för svensk hushållsekonomi: konton, intäkter och utgifter, överföringar, återkommande poster (lön, räkningar, prenumerationer), budget, planerade inköp, lån med räntesimulering, sparmål och kvitton. Ett hushåll kan ha flera medlemmar. AI-agenter som Claude arbetar med hushållet via MCP eller REST, med samma kommandon som appen.

Adress: https://klirr.encyon.com

## Begrepp

- **Hushåll**: en arbetsyta med medlemmar. Ägare och medlemmar ändrar; läsare ser det som delas. Var och en kan ha privata poster (Bara jag) som bara den personen ser, också när någon annan äger hushållet, och allt räknas för den som frågar. En individ eller grupp (Barnen, bostaden, hunden) är bara en etikett.
- **Belopp** är heltal i öre (`amount_ore`): 199 kr är 19900. **Datum** skrivs ÅÅÅÅ-MM-DD i hushållets kalender (Europe/Stockholm som standard), månader ÅÅÅÅ-MM.
- **Väntade tillfällen** kommer från återkommande regler, lån och planerade inköp med månad. Varje tillfälle har en stabil `key` (serien och datumet).
- **Matchning** kopplar en faktisk post till ett väntat tillfälle: tillfället lämnar prognosen och posten räknas med sitt verkliga belopp. Att ångra lägger tillbaka tillfället.
- **Budget**: budgetrader med gränser och huvudtaggar. En post har en huvudtagg (budgetraden) och valfria extrataggar för filtrering, och räknas en gång.
- **Lån**: ränteperioder, betalningsmodell (rak, annuitet, amorteringsfri) och avgifter. En simulering ändrar ingenting förrän nya villkor sparas.
- **Kvitton**: en bild (JPG, PNG, WebP) eller PDF per kvitto, högst 15 MB, kopplat till en utgift eller ett planerat inköp. En agent kan läsa av kvittot själv utan kostnad och spara avläsningen.
- **Kontoutdrag**: en CSV från banken läses gratis med `read_bank_csv` (förhandsgranskningen med mappningen av kolumnerna, dubbletterna och raderna före startsaldot) och sparas med `import_transactions`, alla rader eller inga. Mappningen sparas per konto, så att nästa fil från samma bank läses likadant. Utan konto i Klirr ger `read_bank_csv` utan `account_id` ett förslag till kontot (`new_account`, med startsaldot ur saldokolumnen), och `import_transactions` med `new_account` lägger upp kontot och raderna tillsammans. Flera filer, en per konto, paras med `pair_transfers`: samma belopp ut från ett konto och in på ett annat inom fyra dagar är en intern överföring, inte en utgift och en inkomst, också mot det som redan finns i Klirr. En överföring till ett eget konto som inte finns i Klirr blir en överföring till ett konto utanför Klirr. `import_bank_files` sparar filerna och överföringarna i en transaktion.
- **Flytt mellan hushåll**: `preview_move` visar vad som kan flyttas till ett annat hushåll där du är ägare eller medlem, vad som följer med och vad som slås ihop på namn (taggar, budgetrader, individer). `move_to_household` flyttar konton med allt på dem, eller allt, i en transaktion. Det som redan är privat förblir privat.
- **Regler för taggar**: taggen som väljs för en rad blir en regel för radens text (`list_tag_rules`, `save_tag_rule`), så att samma text får samma tagg vid nästa inläsning och för nya poster. Efter reglerna föreslår Klirrs lista över vanliga svenska butiker och tjänster en tagg, lokalt och utan AI. En post utan tagg är Okänt, och `list_unsorted` och `sort_transactions` taggar dem grupp för grupp; `group_texts` ger de unika texterna i rader som inte sparats än.
- **Förslag utan AI**: `suggest_recurring` hittar lön, räkningar och prenumerationer i historiken och `accept_recurring` lägger upp dem och matchar posterna som finns; `suggest_matches` och `accept_matches` matchar poster mot väntade tillfällen. `dismiss_suggestion` säger nej till ett förslag. `make_recurring` gör en enstaka post eller överföring återkommande, ifylld ur historiken, och `preview_make_recurring` visar hur det blir.

## Tre vägar för din AI

Sidan För din AI i appen (https://klirr.encyon.com/for-din-ai) visar samma sak med adresserna att kopiera.

1. **I webbläsaren, utan att lägga till något (WebMCP).** När webbläsaren har stöd registrerar Klirr sina kommandon som verktyg med `document.modelContext.registerTool` (äldre Chrome: `navigator.modelContext`), med samma namn och indata som nedan. En AI-agent i webbläsaren kan använda dem direkt. Utan konto körs de mot hushållet i webbläsaren, och inget skickas till Klirr; inloggad mot kontot, med personens behörighet. Det som ändrar något visas i Klirr och görs först när personen godkänt det. Valet per webbläsare (läsa och ändra, bara läsa eller av) finns på sidan För din AI.
2. **Öppet, utan konto: https://klirr.encyon.com/api/mcp/open.** Räkneverktyg ur samma register som räknar på data i anropet: `get_loans` (lån), `get_forecast` (prognos till ett datum), `get_budget` (budget), `read_bank_csv` (läs en csv från banken), `suggest_recurring` (förslag på återkommande), `get_subscriptions` (prenumerationer). Hushållet skickas med i `household`, med samma indata som create-kommandona (accounts, rules, loans, purchases, transactions, transfers, budget_lines), och byggs i minnet för anropet. Inget sparas, och inget loggas utom anropets storlek och tid. Högst 30 anrop i minuten från en adress, högst 1 MB per anrop och 5000 poster. I Claude Code: `claude mcp add --transport http klirr-open https://klirr.encyon.com/api/mcp/open`.
3. **Ditt hushåll, med konto: https://klirr.encyon.com/api/mcp.** Allt i hushållet, med OAuth, som nedan.

## MCP för ditt hushåll

- Adress: https://klirr.encyon.com/api/mcp (Streamable HTTP, utan sessioner).
- Inloggning: OAuth 2.1 med PKCE och dynamisk registrering. Upptäckt: https://klirr.encyon.com/.well-known/oauth-authorization-server och https://klirr.encyon.com/.well-known/oauth-protected-resource. MCP kräver ett konto i Klirr: användaren loggar in och väljer nivå, bara läsa (förval) eller läsa och ändra.
- Ett verktyg per kommando nedan, med samma namn och indata plus ett valfritt `household_id`. Dessutom `list_households`, `upload_receipt` (base64) och `get_receipt` (bilden som bild, PDF som resurs).
- Kvittoflödet: `upload_receipt` eller `list_receipts`, sedan `get_receipt`, läs kvittot, `save_receipt_reading` med `source: "hand"`, och `suggest_receipt_links` för att se om köpet redan finns (en rad ur banken). Finns det kopplar `apply_receipt` kvittot dit med varorna; annars registrerar `create_transaction` utgiften med varorna i `items`.
- Varorna över tid: `search_items` söker bland varorna på utgifterna, och `get_item_prices` visar priset på en vara över tid.
- I Claude Code: `claude mcp add --transport http klirr https://klirr.encyon.com/api/mcp`.

## API-nycklar

För egna program och agenter utan OAuth. Skapas av den inloggade under Inställningar, med nivån bara läsa (read) eller läsa och ändra (write). Nyckeln (`kl_key_…`) visas en gång och skickas som `Authorization: Bearer kl_key_…`. Den gäller både REST och MCP och kan återkallas när som helst.

## REST-API

- Bas: https://klirr.encyon.com/api/v1. Förteckningen med metod, väg, beskrivning och JSON-schema för varje kommando: GET https://klirr.encyon.com/api/v1 (öppen).
- GET /households: hushållen. Varje kommando ligger under /households/{household_id}, till exempel GET /households/{household_id}/transactions eller POST /households/{household_id}/transactions.
- GET tar indata i adressen (tal och true/false omvandlas, listor som `simulate` som JSON); POST, PATCH och DELETE tar en JSON-kropp. POST /households/{household_id}/imports/csv (`read_bank_csv`), /imports/texts (`group_texts`) och /imports/transfers (`pair_transfers`) läser utan att spara och kräver bara läsbehörighet, eftersom filen och raderna inte får plats i adressen.
- POST /households/{household_id}/receipts laddar upp ett kvitto (multipart med fältet `file`, eller JSON `{ name, data }` med base64). GET /households/{household_id}/receipts/{receipt_id}/file hämtar filen.
- Svaren är `{ data }` eller `{ error: { code, message, request_id } }`. 401 utan nyckel, 403 utan behörighet, 404 för det som inte finns i hushållet.

## Kommandon

- `get_household`: Hushållets namn, dagens datum i hushållets kalender, inställningarna med sina val och hur mycket som finns registrerat.
- `get_overview`: Saldo i dag och prognos vid budgetperiodens slut för hushållet som du ser det, budgeten för perioden, kommande betalningar till periodens slut, det som väntar på bekräftelse och årsdiagrammet (intäkter, utbetalningar och netto per kalendermånad). Budgetperioden (budget.period, KLIRR-26) går från lön till lön, från en fast dag eller är en kalendermånad, efter hushållets inställning budget_period; med lönen slutar den dagen före nästa lön, så att budgetens kvar är kvar till lönen. month är kalendermånaden för Okänt och private_from_others. Andras privata poster räknas inte; private_from_others visar det de valt att visa av dem. unknown är Okänt: poster utan huvudtagg (antal, och summan där utgifter är plus), alla och i månaden; sortera dem med list_unsorted och sort_transactions. Varje budgetrad har basis, vad gränsen bygger på, som i get_budget, och get_budget_row öppnar en rad med posterna bakom.
- `get_year`: Intäkter, utbetalningar och netto per månad för ett år. status är historik (faktiska poster), prognos (faktiska plus väntade) eller ingen_data. Överföringar mellan egna konton räknas inte. budget_ore är budgetens gräns för perioden med månadens nyckel, och budget_costs kostnaderna med längre intervall som betalas då (KLIRR-34), så att månaderna med högre budget syns.
- `get_forecast`: Hushållets saldo i dag och prognosen till ett valfritt datum, med betalningarna fram dit.
- `update_settings` (write): Ändrar hushållets namn eller inställningar: month_end (när dagen saknas i månaden), purchase_placement (var ett inköp med bara månad hamnar i dagsprognosen), budget_period (budgetperioden, KLIRR-26: lonen från den dag lönen kommer, fast_dag från dagen i budget_period_day, kalendermanad), budget_period_day (1 till 28 eller sista), budget_period_weekend (en väntad lönedag eller fast dag på en helg eller röd dag: bankdagen_fore eller samma_dag), budget_period_income (vilken inkomst som styr Från lönen: storsta eller en inkomsts id), budget_rollover, receipt_retention, receipt_match_days (hur många dagar ett kvittos datum och postens får skilja när kvittot letar efter sitt köp), import_date (vilket datum som föreslås när en fil från banken har flera), import_category (hur bankens kategori blir tagg), import_before_start (om rader före kontots start föreslår att starten flyttas), budget_from_history (hur en budget räknas ur historiken, KLIRR-21), timezone och add_more_keep (vad som står kvar i formuläret med Lägg till fler). get_household visar valen.
- `setup_household` (write): Fyller ett tomt hushåll: what=standard ger budgetrader och taggar att börja med; what=exempel lägger in exempelhushållet från prototypen (konton, lön, räkningar, prenumerationer, lån och sparmål) för att prova.
- `get_privacy`: Dina egna val för privata poster: vad de andra i hushållet ser av det du lagt som Bara jag (others_see: ingenting, att_det_finns eller summan) och synligheten för nya poster (new_visibility: hushall eller privat). available false utan konto.
- `update_privacy` (write): Ändrar dina egna val: others_see (vad de andra ser av dina privata poster: ingenting, att_det_finns eller summan) och new_visibility (förvalet för nya poster: hushall eller privat). Gäller bara dig.
- `set_visibility` (write): Gör något privat (privat: bara du ser det) eller delat med hushållet (hushall). kind är konto, post, overforing, aterkommande, inkop, lan, sparmal, kvitto eller taggregel och id dess id. Bara den som lade in det kan byta. Allt på ett privat konto är privat, och en överföring mellan ett privat och ett delat konto syns för de andra som en överföring till eller från ett privat konto. Ett konto, lån, sparmål, inköp eller en post kan bli privat när allt som hör till det är ditt.
- `preview_move`: Visar vad du kan flytta till ett annat hushåll du är med i (targets, där du är ägare eller medlem): dina konton med vad som finns på dem (counts), konton som följer med eftersom något hänger ihop (linked), om något är privat för någon annan och stoppar flytten (blocked) och om kontot kan bli Bara jag (private_ok). Med ett val (all, accounts, goals, tag_rules, receipts) och to_household visar result exakt vad move_to_household skulle göra: vad som slås ihop på namn (taggar, budgetrader, individer), konton som får nytt namn och om det gamla hushållet blir tomt, eller error. default_visibility är förvalet. available false utan konto. Ändrar inget.
- `move_to_household` (write): Flyttar konton med allt på dem (accounts), eller allt du ser (all: true), till ett annat hushåll där du är ägare eller medlem (to_household, id ur list_households), i en transaktion: allt eller inget. Det som hänger ihop med ett annat konto (en överföring, ett lån, en matchning) tar med det kontot. Taggar, budgetrader och individer eller grupper som finns i båda slås ihop på namn, och mottagarens namn och gränser gäller; ett konto vars namn redan finns får en siffra efter sig. visibility (hushall eller privat) gäller det som flyttas, och account_visibility per konto (id eller namn); det som redan är privat förblir privat, och privat på ett konto går bara när allt på det är ditt. Utan visibility gäller förvalet i preview_move. Kvittona flyttas med. Något som är privat för någon annan stoppar flytten av kontot det hör till. Visa preview_move för användaren och fråga först.
- `list_accounts`: Hushållets konton med startsaldo, bokfört saldo i dag och prognos till ett datum (förval: månadens sista dag).
- `create_account` (write): Lägger upp ett eget konto med namn, startsaldo i öre och datumet saldot gäller från. Poster före det datumet räknas inte. number är clearing- och kontonumret, så att en bankfil för kontot känns igen (read_bank_files). Med visibility privat är kontot och allt på det bara ditt.
- `update_account` (write): Ändrar ett kontos namn, typ, startsaldo, datum för startsaldot, clearing- och kontonummer (number, null tar bort det), ordning eller arkiverar det. visibility byter synligheten (bara den som lade in kontot).
- `delete_account` (write): Tar bort ett konto som inte används. Ett konto med poster, överföringar, regler, lån eller inköp arkiveras i stället (update_account archived).
- `list_transactions`: Faktiska intäkter och utgifter, nyaste först. Filtrera på datum, typ, konto, tagg (huvudtagg, extratagg eller en varas egen tagg), individ eller grupp, budgetrad (budget_line: en rads line_id, okant eller utan, bara utgifter som räknas där, som i get_budget_row, med delen på raden i budget_line_ore), tagg i budgeten (budget_tag: bara utgifter med en del på taggen, huvudtaggen eller en varas egen tagg men aldrig en extratagg, som taggarna i get_budget_row, med delen på taggen i budget_tag_ore) eller fritext i beskrivningen, butiken och varorna. Varje post visar om den är matchad mot ett väntat tillfälle, vilka kvitton den har och varorna (items) med butiken (merchant) när de finns.
- `get_transaction`: En faktisk post med matchning och kvitton.
- `create_transaction` (write): Registrerar en faktisk intäkt eller utgift: datum, konto, belopp i öre, beskrivning, huvudtagg för budgeten, valfria extrataggar och individ eller grupp. Utan tagg får posten taggen från hushållets regler för taggar om någon passar texten (list_tag_rules), annars från Klirrs lista över vanliga butiker och tjänster när hushållet använder den; annars är den Okänt. match_key matchar den mot ett väntat tillfälle (list_expected), så att tillfället ersätts av posten. items är varorna från kvittot och merchant butiken. Finns köpet redan (en rad ur banken), koppla kvittot till det med apply_receipt i stället; suggest_receipt_links visar vilket.
- `update_transaction` (write): Ändrar en faktisk post. Ett ändrat belopp eller datum ändrar saldot och budgeten; en matchning finns kvar. items ersätter alla varor (en tom lista tar bort dem), och merchant är butiken enligt kvittot.
- `delete_transaction` (write): Tar bort en faktisk post med dess kvitton. Var den matchad väntar tillfället igen i prognosen.
- `read_bank_files`: Läser en eller flera CSV-filer från banken (högst tio) utan att du anger konton, gratis och utan AI, och sparar inget. Klirr känner igen kontot för varje fil: kontonumret i filen först, sedan namnet i filen (som Produkt), sedan raderna som redan finns. recognition.status är kant (kontot finns i Klirr), nytt (ett nytt konto skapas ur filen, med namn som Privatkonto …1234, typ och startsaldo ur filen) eller fraga (Klirr vet inte: fråga användaren, med gissningen i recognition.account_id, null för ett nytt konto, och kandidaterna). Varje fil läses sedan på sitt konto som med read_bank_csv (read: raderna med status, mappningen, move_start och saldot jämfört med banken), och file_balance är filens sista bokförda saldo med datumet, så att du kan säga "saldo enligt filen". status är klar, mappning (filen behöver en mappning: skicka mapping), saldo (filen saknar saldokolumn: skicka new_account.balance_today_ore) eller dubblett (samma fil två gånger). pairs, external och loans är som i pair_transfers, med row som index i filens read.rows. import_input är ett färdigt förslag till import_bank_files när alla filer är klara: visa det för användaren, ändra det hen vill och spara med import_bank_files. Byt konto för en fil med account_id eller new_account och läs igen.
- `read_bank_csv`: Läser en CSV-export från banken eller inklistrade rader för ett konto, utan AI och gratis, och ger förhandsgranskningen utan att spara något. Skicka filen som text eller som content_base64 (då känns teckenkodningen igen: UTF-8, Windows-1252 eller UTF-16). Utan mapping används kontots sparade mappning om den passar filen (mapping_source sparad), annars ett förslag ur rubrikerna (forslag). Svaret har kolumnerna, mappningen, några rader som de blir (sample), raderna med status (ny, mojlig_dubblett mot en befintlig post eller överföring, fore_start före kontots startsaldo) och en föreslagen tagg (tag_source regel när den kommer från hushållets regler för taggar, kategori när den kommer från bankens kategori), och saldot i filen jämfört med Klirr. Utan account_id läses filen för ett nytt konto (Börja med en bankfil): new_account har namn, typ, startdatum och startsaldo ur saldokolumnen (null utan saldokolumn; fråga då efter saldot i dag och dra av sum_ore). Har filen rader före kontots start (status fore_start) föreslår move_start att starten flyttas till filens första dag, med startsaldot ur saldokolumnen så att saldot blir bankens, eller baklänges utan saldokolumn så att dagens saldo står kvar; skicka move_start till import_transactions så kommer raderna med. Högst 2 000 rader i taget: har filen fler kommer de första nya, och nästa läsning ger resten. Ändra mappningen och läs igen tills raderna stämmer, och spara sedan de rader användaren vill ha med import_transactions och mappningen.
- `group_texts`: Grupperar rader ur bankfiler på text och typ, utan AI och utan att spara något: varje unik text (utan siffror, så inga kontonummer eller datum) med antal, summa och typiskt belopp i öre utan tecken, mellanrum i dagar (interval_days, null med ett datum) och taggen som hushållets regler (tag_source regel) eller Klirrs lista över butiker och tjänster (lista) ger. rows är radernas nummer i indatan. texts, known och left säger hur många texter som är kända och hur många som är kvar att sortera; det som är kvar kan sorteras grupp för grupp, och det som ingen sorterar är Okänt.
- `pair_transfers`: Hittar interna överföringar i en eller flera bankfiler innan de sparas, utan att spara något: samma belopp ut från ett av hushållets konton och in på ett annat inom 4 dagar. Skicka filernas nya rader (status ny ur read_bank_csv) med en ref per fil och kontot (account_id, eller account_name och account_number för ett nytt konto ur filen). Raderna paras med varandra och med det som redan finns i Klirr: en inkomst eller utgift på ett annat konto (sidan transaction_id; den blir överföringen när den sparas) eller en överföring till ett eget konto utanför Klirr (sidan transfer_id; kontot utanför byts mot filens konto). Texten (som Överföring via internet), kontonumret i texten och samma text på båda sidor gör paret säkrare (reasons, confidence hog eller trolig). external är rader som ser ut som överföringar utan motpart: förslaget är en överföring till ett eget konto utanför Klirr (account.account_id när kontot redan finns, annars ett nytt med namn och nummer ur texten; samma account.key är samma konto). sign säger varför förslaget är säkert (nummer: numret är ett konto i Klirr, namn: texten nämner ett av hushållets konton, egen: texten säger egen överföring); utan sign är det en fråga, och include är false med förvalet bara_tydliga, så att raden blir en inkomst eller utgift om användaren inte säger något annat. external är tomt när hushållets inställning import_transfers är utgift_och_inkomst. loans är lånebetalningarna (texten säger lån, bolån, amortering eller avbetalning): de blir aldrig konton utanför Klirr. group samlar raderna per lån (numret i referensen eller texten), och loan är lånet i Klirr med delarna (amortering, ränta, avgift) när det finns på kontot; skicka då loan_id på raden till import_bank_files. Utan loan blir raden en utgift; föreslå att lägga upp lånet. Visa paren för användaren och spara med import_bank_files.
- `import_transactions` (write): Sparar rader ur en förhandsgranskning (read_bank_csv, eller ett kontoutdrag som du läst själv) som poster på ett konto, alla eller inga: negativt belopp blir en utgift och positivt en inkomst, med taggen. Rader före kontots startsaldo går inte att spara. Med mapping, som den kom från read_bank_csv, sparas mappningen för kontot så att nästa fil från samma bank läses likadant. Med new_account i stället för account_id skapas kontot först (Börja med en bankfil), med startsaldot och startdatumet (förval: den tidigaste radens datum). Med move_start ur read_bank_csv flyttas kontots start bakåt först, med det nya startsaldot, så att rader före den gamla starten kommer med. Med learn (förval) blir taggarna som valts regler för taggar, så att samma text får samma tagg nästa gång. Fråga användaren om de möjliga dubbletterna innan du sparar dem. Svaret har de nya posternas id (transaction_ids), till exempel för suggest_matches.
- `preview_import_recurring`: Förslagen på återkommande poster i en omgång bankfiler, innan något sparas: samma indata som import_bank_files. Lön, andra inkomster, räkningar och prenumerationer i de nya raderna tillsammans med det som redan finns, lönen först, med intervall, dag, belopp och raderna i filerna (rows, { ref, row }) som förslaget bygger på. include säger om förslaget står ikryssat enligt hushållets inställning import_recurring (foresla_ikryssade, foresla_urkryssade eller fraga_inte, då inga förslag). Skicka de valda med import_bank_files i recurring, med ref och row ur förslaget. links är raderna som passar ett väntat tillfälle av något som redan är återkommande (som suggest_matches), med key: skicka dem med import_bank_files i links för att koppla dem.
- `import_bank_files` (write): Sparar en omgång bankfiler i en transaktion, allt eller inget: per fil kontot (account_id, eller new_account som skapas), mappningen, move_start och raderna som poster (negativt belopp en utgift, positivt en inkomst, med taggen), som import_transactions. transfers är de interna överföringarna ur pair_transfers som användaren vill ha, med from (pengarna ut) och to (pengarna in); en rad som är en sida i en överföring sparas inte som post. En sida är { ref, row } (en rad i en fil), { ref } (en fils konto, eller ett konto utanför Klirr i external_accounts som skapas med typen extern och startsaldo 0), { account_id }, { transaction_id } (en befintlig inkomst eller utgift som blir överföringen och tas bort) eller { transfer_id } (en befintlig överföring till eller från ett konto utanför Klirr, vars konto utanför byts mot den andra sidans konto; ingen ny överföring skapas). Överföringar räknas aldrig som intäkter eller utgifter. En rad med loan_id är en betalning på lånet: den delas i amortering (som minskar skulden), ränta och avgift efter lånets plan och matchas mot lånets tillfällen. Med learn (förval) blir taggarna som valts regler, utom när de är Klirrs listas förslag.
- `preview_bank_setup`: Visar vad setup_from_bank_files skulle göra med flera CSV-filer från banken, utan att spara något: allt körs på en kopia av hushållet i minnet. Varje fil blir ett konto med namn, typ och startsaldo ur filen (read_bank_csv), med raderna och taggarna som reglerna föreslår (import_transactions). Sedan läggs det som återkommer upp (lön och andra intäkter, räkningar och prenumerationer, suggest_recurring), och budgeten räknas fram ur historiken per budgetrad (suggest_budget). Inget av det använder AI. Svaret har varje fil med status (klar, mappning när filen behöver en mappning, saldo när filen saknar saldokolumn och saldot i dag behövs i account.balance_today_ore, dubblett, utelamnad), förslagen på återkommande med stabila nycklar, budgeten per rad och sammanfattningen: prenumerationerna per år, en vanlig månad in och ut, konton och saldon, budgeten och vad som är kvar i månaden, prognosen och Okänt (poster utan tagg). Ändra det användaren vill och förhandsvisa igen, och spara med setup_from_bank_files och samma indata.
- `setup_from_bank_files` (write): Sätter upp hushållet ur flera CSV-filer från banken, allt eller inget, med samma indata som preview_bank_setup (förhandsvisa först och visa användaren). Varje fil blir ett konto med namn, typ och startsaldo ur filen (read_bank_csv), med raderna och taggarna som reglerna föreslår (import_transactions). Sedan läggs det som återkommer upp (lön och andra intäkter, räkningar och prenumerationer, suggest_recurring), och budgeten räknas fram ur historiken per budgetrad (suggest_budget). Inget av det använder AI. Alla filer ska ha status klar, dubblett eller utelamnad i förhandsvisningen; annars sparas inget. En budgetrad som redan har en gräns behåller den, om inte budget anger en annan.
- `list_unsorted`: Okänt: poster utan huvudtagg, grupperade på text och typ (samma text utan siffror och ord som kortköp är en grupp), störst grupp först, med taggen som hushållets regler eller Klirrs lista över butiker föreslår (tag_source regel eller lista). Tagga en grupp med sort_transactions, så blir valet en regel och posterna är inte längre okända.
- `sort_transactions` (write): Sätter huvudtaggen på poster, grupp för grupp (transaction_ids ur list_unsorted och taggen), allt eller inget. Med learn (förval) blir valet en regel för postens text, så att samma text får samma tagg nästa gång. Taggen skapas om den saknas.
- `list_tag_rules`: Hushållets regler för taggar: en post vars text innehåller regelns ord i följd får regelns tagg. Siffror, månader och ord som kortköp och autogiro räknas inte, och passar flera regler vinner den med flest ord. kind gäller bara utgifter eller inkomster (null: båda). source val är en regel som Klirr gjort av ett val vid sorteringen; hand en som skrivits in för hand. uses är hur många poster regeln passar. available false betyder att regler inte ingår i hushållets plan.
- `save_tag_rule` (write): Skapar en regel (utan rule_id) eller ändrar en (med rule_id): texten som ska kännas igen, taggen (skapas om den saknas) och kind utgift, inkomst eller null för båda. Finns redan en regel för samma text ändras den. apply true taggar också poster utan tagg som regeln passar och säger hur många.
- `delete_tag_rule` (write): Tar bort en regel. Posterna behåller sina taggar.
- `suggest_recurring`: Letar i posterna efter det som återkommer: samma text på samma konto med jämna mellanrum (vecka, varannan vecka, månad, varannan månad, kvartal, halvår eller år) och belopp i samma storlek. Varje förslag har category (lon, inkomst, rakning eller prenumeration), namn, belopp (varies när det skiftar), intervall, första och nästa datum, taggen och posterna det bygger på. Det som redan är en återkommande post föreslås inte. Godkänn med accept_recurring, säg nej med dismiss_suggestion. Fråga användaren först. Behöver minst två tillfällen, så två eller tre månaders historik. ask_once säger att appen ska fråga en gång om förslagen (KLIRR-35), ikryssade när ticked; svaret sparas med dismiss_suggestion och nyckeln rec:fragan. En enstaka post blir återkommande med make_recurring.
- `accept_recurring` (write): Gör ett förslag ur suggest_recurring (key) till en återkommande post, med ändringarna användaren vill ha (namn, belopp, intervall, första datum, tagg, prenumeration), och matchar posterna förslaget bygger på mot sina tillfällen. Tillfällen mellan den sista posten och i dag väntar på bekräftelse. Svaret har den nya posten, hur många poster som matchades och hur många tillfällen som väntar.
- `preview_make_recurring`: Utkastet när en enstaka inkomst, utgift (transaction_id) eller överföring mellan egna konton (transfer_id) ska bli återkommande. source historik: ifyllt ur serien av liknande poster (samma text på samma konto med jämna mellanrum, som suggest_recurring), med namn, belopp, intervall (unit och every), första datum, dagen, konto och tagg. source raden: från raden själv, varje månad från radens datum. linked är posterna som kopplas till sina tillfällen med intervallet (unit, every och first_date ändrar det), och similar_rules återkommande poster som redan finns och liknar det; rule_id visar hur det blir att koppla posterna till en av dem. Sparar inget; make_recurring gör det.
- `make_recurring` (write): Gör en enstaka inkomst eller utgift (transaction_id) eller en överföring mellan egna konton (transfer_id) till en återkommande post, ifylld som preview_make_recurring visar, med ändringarna användaren vill ha (namn, belopp, intervall, första datum, slutdatum, konto, tagg, prenumeration). Posten och liknande poster bakåt (serien) kopplas till sina tillfällen, så att inget räknas två gånger. Med rule_id kopplas posterna i stället till en återkommande post som redan finns, och dess första datum flyttas bakåt i samma takt när det behövs. Tillfällen mellan den sista posten och i dag väntar på bekräftelse. Ångra med delete_rule (avsluta eller ta bort); posterna står kvar.
- `suggest_matches`: Poster som liknar väntade tillfällen som inte är matchade (lön, räkningar, prenumerationer och lånedelar): samma konto och typ, ett datum nära tillfället (en vecka för det som kommer varje månad) och samma belopp eller en liknande text. Ett förslag per tillfälle och post, med same_amount och similar_text. Godkänn med accept_matches (eller match_expected), säg nej med dismiss_suggestion och förslagets id. transaction_ids begränsar till vissa poster, till exempel de nyss inlästa.
- `accept_matches` (write): Matchar poster mot väntade tillfällen, ett par i taget som match_expected men allt eller inget: pairs med key (tillfället) och transaction_id (posten), till exempel förslagen ur suggest_matches som användaren godkänt.
- `suggest_links`: Förslagen när något ska kopplas för hand, de troligaste först (likely: samma konto, ett datum inom intervallets marginal och samma belopp eller en liknande text). Med transaction_id (en enstaka inkomst eller utgift) eller transfer_id (en överföring) är candidates de väntade tillfällena av återkommande poster inom 45 dagar som raden kan kopplas till, med key. Med key (ett väntat tillfälle ur list_expected) är candidates raderna som redan finns och kan kopplas till det, med transaction_id eller transfer_id, i stället för en ny rad med confirm_expected. Koppla med match_expected, lös upp med unmatch_expected: raden blir då enstaka igen och tillfället väntas igen. linked_key är tillfället raden redan är kopplad till.
- `dismiss_suggestion` (write): Sparar att ett förslag inte stämmer, så att det inte kommer tillbaka: ett förslag på återkommande (key ur suggest_recurring, rec:…) eller på matchning (id ur suggest_matches, match:…). undo true tar tillbaka nejet.
- `list_transfers`: Överföringar mellan egna konton, nyaste först, med valfritt datumintervall.
- `create_transfer` (write): Registrerar en överföring mellan två egna konton som en händelse. Kontona ändras med motsatta belopp; hushållets totalsaldo, intäkter och utgifter ändras inte. goal_id kopplar den till ett sparmål. En överföring mellan ett privat och ett delat konto syns för de andra som en överföring till eller från ett privat konto, utan namnet; med visibility privat syns den inte alls för dem.
- `update_transfer` (write): Ändrar datum, konton, belopp, notering, sparmål eller synlighet för en överföring. En överföring till eller från någon annans privata konto ändras av den personen.
- `delete_transfer` (write): Tar bort en överföring. Var den matchad mot en schemalagd överföring väntar den igen.
- `list_rules`: Återkommande regler: lön och andra inkomster, räkningar, prenumerationer och schemalagda överföringar, med nästa datum, intervall, månadssnitt och årskostnad.
- `create_rule` (write): Lägger upp något som återkommer: kind inkomst (som nettolön), utgift (räkning eller, med subscription, prenumeration) eller overforing (schemalagd överföring till to_account_id, till exempel månadssparande med goal_id). Ordinarie belopp i öre, första datum, intervall (unit vecka, manad, kvartal, halvar, ar och every, till exempel unit manad every 2 för varannan månad) och valfritt slutdatum.
- `update_rule` (write): Ändrar en återkommande regel. Det ordinarie beloppet gäller alla tillfällen som inte är matchade och inte har ett eget belopp.
- `delete_rule` (write): mode avsluta sätter ett slutdatum (end_date, förval i dag) och behåller historiken; mode ta_bort tar bort regeln och dess undantag. Faktiska poster som var matchade finns kvar som vanliga poster.
- `list_expected`: Väntade tillfällen mellan två datum: lön, räkningar, prenumerationer, lånebetalningar, planerade inköp med månad och schemalagda överföringar. status är matchad, vantar eller forfallen (passerat datum, väntar på bekräftelse). key används för att matcha, bekräfta, justera eller hoppa över.
- `adjust_expected` (write): Ett annat belopp för ett enskilt tillfälle av en återkommande regel (till exempel en lön som blev högre en månad), eller skip för att hoppa över det. amount_ore null och skip false återställer det ordinarie beloppet. Nästa tillfälle använder det ordinarie.
- `match_expected` (write): Kopplar en faktisk post (transaction_id) eller överföring (transfer_id) till ett väntat tillfälle (key): Koppla till återkommande. Tillfället räknas som mottaget eller betalt, tas bort ur prognosen och posten räknas med sitt belopp, så att inget räknas två gånger. suggest_links visar vad som passar, åt båda hållen. unmatch_expected löser upp kopplingen.
- `unmatch_expected` (write): Ångrar en matchning, på tillfällets key eller postens transaction_id. Den väntade posten återgår till prognosen; den faktiska finns kvar.
- `confirm_expected` (write): Bekräftar att ett väntat tillfälle har hänt, till exempel en löneutbetalning eller en räkning: en faktisk post (eller överföring) skapas med tillfällets belopp och matchas. date, amount_ore och account_id ändrar det som registreras.
- `list_purchases`: Planerade inköp med uppskattat pris, vem det gäller och vald månad. Ett inköp utan månad finns i listan men inte i prognosen; ett köpt visar vad det kostade.
- `create_purchase` (write): Planerar ett inköp: vad, vem det gäller (individ eller grupp), uppskattat pris i öre, konto, huvudtagg och valfri månad (ÅÅÅÅ-MM). Utan månad ligger det kvar i listan och kommer med i prognosen först när en månad väljs.
- `update_purchase` (write): Ändrar ett planerat inköp, till exempel priset eller månaden. month null tar bort månaden.
- `delete_purchase` (write): Tar bort ett planerat inköp. Var det köpt finns utgiften kvar.
- `buy_purchase` (write): Markerar ett planerat inköp som köpt: en utgift registreras med det verkliga priset och datumet och ersätter planeringen. Kvitton som laddats upp till inköpet flyttas till utgiften.
- `get_budget`: Budgeten för en budgetperiod: per budgetrad gränsen (med det som rullats vidare), betalt, kommande och kvar enligt prognos, med status (inom budget, kan passeras, passerad) och posterna bakom. En post räknas en gång, på sin huvudtaggs rad. Perioden följer hushållets inställning budget_period (KLIRR-26): lonen (från den dag lönen kom till dagen före nästa lön), fast_dag (från dagen i budget_period_day) eller kalendermanad. period har from och to (båda med), basis (det som gäller; lonen utan någon lön blir kalendermanad), income (inkomsten som styr) och start och next (hur början och nästa början blev till: kom, vantas, flyttad till bankdagen före en helg eller röd dag, dag eller manad). month är periodens nyckel ÅÅÅÅ-MM, den månad det mesta av perioden ligger i (25 okt till 24 nov är 2026-11), och gränsen per månad gäller perioden med samma nyckel. Ange month, eller date för perioden ett datum ligger i; utan båda gäller perioden i dag. incomes är inkomsterna som kan styra perioden (update_settings med budget_period_income). basis på en budgetrad säger vad gränsen bygger på (KLIRR-29): kind historik (ur historiken; source.via setup_from_bank_files är välkomsten med bankfilerna och set_budget_from_history budgeten ur historiken, med method, basis, months med perioderna och det som gick åt varje period, typical_ore, det vanliga, och suggested_ore, det avrundat uppåt till hela hundralappar), hand (satt för hand, source.at är när och source.via kommandot), exempel (exempeldatan), okand (satt innan Klirr sparade det) eller ingen (ingen gräns). override är en egen gräns för perioden (set_month_limit) med när den sattes, och carried_ore det som rullats in från perioden carried_from. spent_ore och typical_ore kan vara null, och då visas bara perioderna. Varje post har from (post, prenumeration, rakning, lan eller inkop) och tags (taggarna som räknas på raden); get_budget_row ger en rad med posterna förklarade. En rad har en löpande gräns varje månad (running_ore, budget_lines.limit_ore) och kostnader med längre intervall (costs, KLIRR-34), som en halvårsförsäkring: periodens gräns (base_limit_ore) är den löpande plus kostnaderna som betalas i perioden. Varje kostnad i costs har name, amount_ore, unit och every (som prenumerationerna), start_month, rule_id och follows när den följer en återkommande räkning, due och due_ore när den betalas i perioden, limit_ore (det den lägger till gränsen) och next_month. uneven säger hushållets val budget_uneven_costs: hogre_manaden (högre gräns de perioder den betalas) eller jamnt_fordelad (årets kostnad delat på tolv läggs till varje period och läggs undan; saved_ore är det sparade inför betalningen, set_aside_ore det som läggs undan i perioden eller, negativt, det sparade som används när den betalas). Kvar är gränsen plus det rullade minus set_aside_ore, betalt och kommande. cost_months är perioderna med betalningar de tolv perioderna framåt, och cost_suggestions räkningar med längre intervall och en tagg på raden som kan bli kostnader (update_budget_line med costs och rule_id).
- `get_budget_row`: En budgetrad öppnad (KLIRR-29): vad gränsen bygger på, taggarna och posterna bakom siffrorna. row är radens line_id ur get_budget, okant för Okänt (utgifter utan tagg) eller utan för Utan budgetrad (taggar utan rad). Svaret har row (raden som i get_budget, med basis), paid (betalt, de senaste först, med konto, delen och hela beloppet när posten är delad, antal kvitton och varorna som räknas på raden i goods), upcoming (kommande, närmast först, med from: prenumeration, rakning, lan, inkop eller post med datum framåt, och overdue när det är försenat), explain (Kvar enligt prognos: limit_ore plus carried_ore minus paid_ore minus upcoming_ore), tags (radens taggar, eller på Utan budgetrad taggarna som saknar rad, med det som räknats på dem och posterna bakom i items, de senaste först, med delen på taggen när ett köp delas; list_transactions med budget_tag och periodens datum ger taggens poster i Utgifter, KLIRR-33) och för Okänt groups (de största grupperna efter text, sortera dem med list_unsorted och sort_transactions). Summan av paid är radens paid_ore och summan av upcoming dess upcoming_ore. basis på en budgetrad säger vad gränsen bygger på (KLIRR-29): kind historik (ur historiken; source.via setup_from_bank_files är välkomsten med bankfilerna och set_budget_from_history budgeten ur historiken, med method, basis, months med perioderna och det som gick åt varje period, typical_ore, det vanliga, och suggested_ore, det avrundat uppåt till hela hundralappar), hand (satt för hand, source.at är när och source.via kommandot), exempel (exempeldatan), okand (satt innan Klirr sparade det) eller ingen (ingen gräns). override är en egen gräns för perioden (set_month_limit) med när den sattes, och carried_ore det som rullats in från perioden carried_from. spent_ore och typical_ore kan vara null, och då visas bara perioderna. Perioden väljs som i get_budget.
- `suggest_budget`: Föreslår en gräns per budgetrad ur hur det faktiskt har gått, utan att ändra något: method snitt_3 (snittet av de tre senaste hela månaderna, förval enligt hushållets inställning budget_from_history), snitt_6, snitt_12 eller median (medianen av högst tolv hela månader). Gränsen är det vanliga avrundat uppåt till hela hundralappar. Betalningar med längre intervall än en månad, som en halvårsförsäkring, räknas inte i snittet utan föreslås som egna kostnader på raden (costs, KLIRR-34): en återkommande utgift som redan finns (rule_id) eller det som återkommer i historiken. Svaret har månaderna som räknas, raderna med det vanliga, förslaget, kostnaderna, gränsen i dag och utgifterna per månad, det som saknar budgetrad och en vanlig månad in och ut. Överföringar mellan egna konton räknas inte. Sätt gränserna med set_budget_from_history.
- `set_budget_from_history` (write): Sätter gränserna per budgetrad ur historiken, som suggest_budget föreslår, med egna gränser i budget (line_id och limit_ore, null för ingen gräns). only_empty true (förval) ändrar bara rader utan gräns; false skriver över alla som historiken har ett förslag för. Raderna som sätts får också kostnaderna med längre intervall som suggest_budget föreslår (costs, KLIRR-34), utom de som redan finns. Med method sparas också hur hushållet vill räkna (budget_from_history). Varje ny gräns sparar vad den bygger på (limit_source, KLIRR-29): ur historiken med perioderna och det som gick åt, eller satt för hand när budget anger en annan gräns än förslaget. get_budget visar det i basis.
- `create_budget_line` (write): En ny budgetrad med den löpande gränsen varje månad i öre (null för ingen), valfria kostnader med längre intervall (costs, KLIRR-34) och valfria huvudtaggar som flyttas hit.
- `update_budget_line` (write): Byter namn, ordning, den löpande gränsen varje månad (limit_ore, null för ingen) eller kostnaderna med längre intervall (costs, KLIRR-34) på en budgetrad. Periodens gräns är den löpande plus kostnaderna som betalas i perioden. En ny gräns eller kostnad sparas som satt för hand (limit_source, KLIRR-29); ett nytt namn, en ny ordning eller samma kostnad igen behåller det gränsen bygger på.
- `delete_budget_line` (write): Tar bort en budgetrad med dess kostnader. Dess huvudtaggar blir utan budgetrad.
- `set_month_limit` (write): En annan gräns för en budgetrad en enskild månad, som ersätter den löpande och kostnaderna den perioden (KLIRR-34). limit_ore null återgår till den ordinarie gränsen. Med en budgetperiod från lönen eller en fast dag är month periodens nyckel, som get_budget visar (25 okt till 24 nov är 2026-11).
- `set_tag_line` (write): Kopplar en huvudtagg till en budgetrad (line_id), eller tar bort kopplingen (null). En huvudtagg hör till högst en rad; att koppla den till en ny flyttar den. Taggen skapas om den inte finns.
- `list_tags`: Alla taggar med budgetraden de hör till och hur många poster, regler och inköp som använder dem som huvudtagg, extratagg eller tagg på en vara.
- `rename_tag` (write): Byter namn på en tagg överallt. Finns det nya namnet redan slås taggarna ihop.
- `list_groups`: Individer och grupper: etiketter för vem något gäller, som Barnen, en person, ett husdjur eller bostaden. De har ingen inloggning och ger ingen åtkomst.
- `create_group` (write): En ny etikett för vem något gäller.
- `rename_group` (write): Byter namn på en individ eller grupp.
- `delete_group` (write): Tar bort en etikett. Det som hade den blir ogrupperat.
- `get_subscriptions`: Prenumerationerna med månadssnitt och årskostnad, grupperade per individ eller grupp (grupp), per tagg (tagg) eller ogrupperat (ingen). tag filtrerar listan och fördelningen. En prenumeration med flera taggar syns under var och en men räknas en gång i totalen.
- `get_loans`: Låneportföljen: skuld, nästa betalningar sammanlagt, totalt kvar att betala, ränta och avgifter. Per lån ränteperioder (bunden, rörlig eller antagen), dagar till nästa ändring eller översyn, betalning per period, slutdatum, kostnadsfördelning och betalningsplanen. simulate provar en annan betalningsmodell, ränta nu (rate_now) eller antagen ränta på enskilda lån utan att ändra något.
- `create_loan` (write): Lägger upp ett lån (bolan, billan, privatlan eller annat) med restskuld i öre per balance_date, slutdatum, betalningsmodell (rak, annuitet eller amorteringsfri), avgift per betalning, ränteperioder (rate i procent, until = bindningstidens slut eller nästa översyn, null tills vidare) och antagen ränta efter den sista kända perioden. Betalningarna blir väntade tillfällen (amortering, ränta, avgift) från kontot på betalningsdagen.
- `update_loan` (write): Ändrar lånets namn, typ, långivare, konto, betalningsdag eller räntetagg. Villkoren (skuld, ränta, modell) ändras med save_loan_terms.
- `save_loan_terms` (write): Sparar ett nytt villkor för lånet från ett datum (valid_from): restskulden då, slutdatum, modell, avgift och ränteperioder. Det ersätter hushållets betalningsplan från det datumet; det förra villkoret finns kvar som historik. En simulering ändrar aldrig villkoret förrän det sparas här.
- `delete_loan` (write): Tar bort ett lån och dess villkor. Bekräftade lånebetalningar finns kvar som vanliga utgifter.
- `list_goals`: Sparmålen med målbelopp, sparat (det som fanns innan plus kopplade överföringar), planerat månadssparande, förlopp och när målet nås i den takten.
- `create_goal` (write): Ett sparmål med målbelopp, det som redan är sparat, planerat månadssparande, sparkonto och valfritt måldatum. En överföring kopplas till målet med goal_id.
- `update_goal` (write): Ändrar ett sparmål.
- `delete_goal` (write): Tar bort ett sparmål. Överföringarna finns kvar, utan koppling.
- `list_receipts`: Kvitton (bild eller PDF) med vilken utgift eller vilket planerat inköp de hör till och avläsningen om den finns. Själva filen hämtas med get_receipt.
- `link_receipt` (write): Kopplar ett kvitto till en utgift (transaction_id) eller ett planerat inköp (purchase_id), eller lossar det (båda null). Ändrar inte posten; apply_receipt kopplar kvittot till en utgift och tar med varorna, butiken och taggen.
- `save_receipt_reading` (write): Sparar vad ett kvitto säger: butik, datum, total, moms, föreslagen huvudtagg och raderna (text och amount_ore, och när det står quantity, unit_price_ore, vat_rate i procent och en egen tag ur hushållets taggar), med source hand (läst av en människa eller din egen agent) eller ai. Belopp i öre. Det ändrar ingen utgift. Finns köpet redan (suggest_receipt_links), koppla med apply_receipt; annars registrera utgiften med create_transaction och varorna i items.
- `delete_receipt` (write): Tar bort ett kvitto. Utgiften finns kvar.
- `suggest_receipt_links`: Föreslår vilken befintlig utgift ett kvitto hör till, till exempel en rad ur en inläst bankfil: samma belopp, ett datum inom hushållets antal dagar (receipt_match_days) och, bäst först, en liknande butik (similar_merchant). Med receipt_id: posterna som passar kvittot; amount_ore, date och merchant ersätter avläsningen, för ett kvitto som läses av just nu. Med transaction_id: kvittona som väntar och passar posten. Utan båda: alla kvitton som väntar och har en avläsning, med högst ett förslag per kvitto och post. unknown säger att posten saknar tagg. Koppla med apply_receipt när användaren sagt ja. Ändrar inget.
- `apply_receipt` (write): Kopplar ett kvitto till en befintlig utgift (som en rad ur banken) i stället för att skapa en ny, och tar med det kvittot säger: varorna (items, annars kvittots rader när posten inte har några), butiken (merchant, annars kvittots) och huvudtaggen (tag, annars kvittots föreslagna när posten saknar tagg, så att en okänd post blir känd). Postens belopp, datum och text ändras inte. Fråga användaren först; suggest_receipt_links visar vilken post som passar.
- `search_items`: Varorna på hushållets utgifter över tid (från kvitton eller inskrivna för hand): sök på text, butik, tagg och datum. items är varje köp, nyast först, med datum, butik, antal, styckpris, belopp och tagg; products är en rad per vara med hur ofta den köpts, summan och styckpriset första och senaste gången, lägst och högst (change_ore är skillnaden). Priset för en vara över tid visar get_item_prices.
- `get_item_prices`: Varje köp av en vara, äldst först, med datum, butik, antal och styckpris, och hur styckpriset ändrats från första till senaste köpet (change_ore och change_pct). item är varans text (stora och små bokstäver och skiljetecken spelar ingen roll) eller key ur search_items; merchant begränsar till en butik.
- `list_households`: hushållen du är med i, med din roll.
- `upload_receipt` (write): laddar upp ett kvitto som base64, valfritt kopplat till en utgift eller ett inköp.
- `get_receipt`: kvittot med uppgifterna och själva filen.
