The question
How do I get my Lunch Money balances into Home Assistant?
Two ways: a REST sensor you write yourself, or an integration that does it. Both are laid out here.
Why this is awkward
It looks like a ten-minute job, and for one account it is. Lunch Money has a real API, Home Assistant has a REST sensor, and the two meet in the middle. It is the fourth account that makes it awkward and the eighth that makes you stop.
The friction is that your accounts arrive from two different places. The ones you type in by hand and the ones a bank feeds are separate endpoints with separate shapes, so whatever you write, you write twice. And Lunch Money is mid-migration between two API versions, which moved the manual-accounts endpoint and renamed the field around it.
Doing it yourself
If you have a handful of accounts and no intention of adding more, doing it by hand is a perfectly reasonable answer, and you should not install anything to avoid twenty lines of YAML. In Lunch Money, open Settings → Developers and request an access token. Then a RESTful sensor reads it directly.
Bank-linked accounts come from /plaid_accounts and manually-managed ones from /assets, each wrapped in an envelope named after itself. Store the token in secrets.yaml with the word Bearer already on the front of it, because the header is passed through verbatim.
rest:
- resource: https://api.lunchmoney.dev/v1/plaid_accounts
scan_interval: 900
headers:
Authorization: !secret lunch_money_token
sensor:
- name: Current account
value_template: "{{ value_json.plaid_accounts[0].balance }}"
unit_of_measurement: GBP
device_class: monetary
state_class: totalWhat that costs you
- That [0] is a position in a list, not an account. Add an account in Lunch Money and the list reorders underneath you — every sensor keeps working and every one of them is now reporting a different account. You can match on name with a template loop instead, which is the right fix and is another dozen lines per sensor.
- Two endpoints, so two blocks, and manually-managed accounts do not carry the same fields as bank-linked ones. Anything you want across both — net worth, total assets — is a third template sensor on top.
- Subtracting credit cards and loans rather than adding them is on you, and it is the kind of sign error you notice a month later when net worth looks suspiciously healthy.
- Nothing tells you when a bank link dies. Lunch Money knows, and says so in its own interface, but a REST sensor reading a balance field just keeps reporting the last number it saw. A balance that stopped moving looks identical to a balance that stopped being updated.
- Lunch Money's v2 API is an open alpha, and it renamed /assets to /manual_accounts along with the envelope key inside it. A hand-written sensor pins one version and finds out the hard way when that stops being the right one.
- Every new account is a configuration.yaml edit and a restart.
Or the app that does it
The integration does the same reading, and the difference is not that it is cleverer — it is that the fiddly parts are already done and stay done. Accounts arrive as devices, matched on their own identity rather than their position in a list, so adding one in Lunch Money makes it appear without a restart and without disturbing the others.
It asks both endpoints, normalises the two shapes into one, and gives you net worth, total assets and total liabilities in your primary currency with the signs already the right way round. Bank-linked accounts get a connection sensor that goes to relink, error or revoked, so a dead link tells you instead of quietly freezing.
It negotiates the API version at startup and falls back if v2 is having a bad day. And it only ever reads: the single write it can make is asking Lunch Money to refresh from your banks, and only when you press the button.