¬†  

YNAB Integration

Martijn shared this question 11 months ago
Question

Are there plans for YNAB (budgeting software; can be found here: https://www.youneedabudget.com/ ) integration? Automated syncing with YNAB would change my banking life for the better.

Comments (54)

photo
47

Hi Martijn! Every external party is more than free to start developing a realtime connection with bunq's API. They can start right away developing this connection!

From our side nothing is required to realise this integration, so I really advise to contact YNAB for this! 👍 The more bunqers attend them on this, the more likely they'll start implementing it!

photo
14

Sadly, ynab has given me this exact response. They can support Bunq anytime to help you build an integration.


This sounds like a standoff.

photo
photo
29

Hey Martijn! Did you find a way to accomplish this?

photo
28

Not yet, unfortunately

photo
32

Hi YNAB and bunq users. I’ve been in contact with the YNAB help desk.. and we just need a lot of people contacting YNAB’s support (help@youneedabudget.com) and tell them you would love it if they’d look into integration with bunq. This has to be done on YNAB’s end, so let’s start asking them. A lot! They say that’ll help move it up the wishlist.

photo
32

I've asked YNAB about a week ago and this was their response:


My original message:

Hi there! My bank in the Netherlands, bunq, has an api available to import my financial data into other apps like YNAB. YNAB would have to build support for this though. If it was only for bunq that'd be a bit much to ask, but because of new European legislation for the financial sector called PSD2 all European banks will be obligated to share the financial data of customers should they wish to do so. With the European union having somewhere around 500 million residents that could open up a whole new market for YNAB. Are there any plans to support this on the road map?


Their response:

Hello! Thanks for reaching out! We are planning to have a public API in the future. This should allow European based users to build bank connections on their own, which is incredibly exciting! 


We'll be sure to announce it's release very loudly when it's ready. :)


Let me know if you have any other questions!

photo
29

The public API has been up for a while, you can request access at: https://github.com/ynab/ynab-sdk-js

photo
photo
37

Well, it turns out YNAB released their API. For the past few days, I've been working on a realtime connection between my bunq accounts and my YNAB budgets. It's pretty functional right now although still work in progress. There is little to none documentation and no tests, yet. If you'd like, star the repositories and keep an eye on them for updated documentation and howto's.

The first repository contains a Symfony Bundle for easy bunq interaction: https://github.com/Jorijn/symfony-bunq-bundle

When used with the second Bundle, you're able to subscribe to MUTATION events and post them to YNAB's API. https://github.com/Jorijn/ynab-bunq-connector-bundle

photo
33

So I have absolutely no idea what you said there with all the technical terms, but I'm really happy to hear you're working on this 👏👏🎉🎉

photo
38

Good to see more YNAB users!

I've made a realtime upload too, also based on MUTATION callbacks: https://github.com/wesselt/bunq2ynab

Really handy to see your transactions pop up in YNAB as soon as they happen!

photo
29

Looks good but I am a newbie and I get a missing module error?!


File "list_user.py", line 4, in <module>

import bunq

File "/Users/wk/Python-Bunq/bunq.py", line 5, in <module>

import requests

ModuleNotFoundError: No module named 'requests'

photo
36

@WWVV: Looks like you're missing requests? Try:


pip3 install requests

photo
28

Stapje verder krijg nu...


File "/Users/wk/Python-Bunq/bunq.py", line 295, in call

raise Exception(result["Error"][0]["error_description"])

Exception: Insufficient authentication.

photo
30

@WWVV: Dan werkt requests 😊 Heb je een geldige API key geplaatst in het bestand "api_token.txt" ? Welk commando gebruik je om het script te starten? Wat is de volledige uitvoer?

photo
28

Ik denk het ook dat de requester werkt en ja ik heb dat bestan aangemaakt, er zijn nu ook want ander bestanden aangemaakt..en hieronder het resultaat de eerste keer heeft het script wat meer gedaan..


WK2:python-bunq wk$ python3 list_user.py

Requesting session token...

Requesting installation token...

Generating new private key...

Registering IP 10.0.1.119

Traceback (most recent call last):

File "list_user.py", line 17, in <module>

users = bunq.get('v1/user')

File "/Users/wk/Python-Bunq/bunq.py", line 307, in get

return call('GET', method)

File "/Users/wk/Python-Bunq/bunq.py", line 284, in call

result = call_requests(action, method, data)

File "/Users/wk/Python-Bunq/bunq.py", line 266, in call_requests

sign(action, method, headers, data)

File "/Users/wk/Python-Bunq/bunq.py", line 190, in sign

headers['X-Bunq-Client-Authentication'] = get_session_token()

File "/Users/wk/Python-Bunq/bunq.py", line 143, in get_session_token

reply = post(method, data)

File "/Users/wk/Python-Bunq/bunq.py", line 311, in post

return call('POST', method, data)

File "/Users/wk/Python-Bunq/bunq.py", line 284, in call

result = call_requests(action, method, data)

File "/Users/wk/Python-Bunq/bunq.py", line 266, in call_requests

sign(action, method, headers, data)

File "/Users/wk/Python-Bunq/bunq.py", line 188, in sign

headers['X-Bunq-Client-Authentication'] = get_installation_token()

File "/Users/wk/Python-Bunq/bunq.py", line 112, in get_installation_token

register_device()

File "/Users/wk/Python-Bunq/bunq.py", line 131, in register_device

post(method, data)

File "/Users/wk/Python-Bunq/bunq.py", line 311, in post

return call('POST', method, data)

File "/Users/wk/Python-Bunq/bunq.py", line 295, in call

raise Exception(result["Error"][0]["error_description"])

Exception: User credentials are incorrect. Incorrect API key or IP address.

WK2:python-bunq wk$ python3 list_user.py

Requesting session token...

Traceback (most recent call last):

File "list_user.py", line 17, in <module>

users = bunq.get('v1/user')

File "/Users/wk/Python-Bunq/bunq.py", line 307, in get

return call('GET', method)

File "/Users/wk/Python-Bunq/bunq.py", line 284, in call

result = call_requests(action, method, data)

File "/Users/wk/Python-Bunq/bunq.py", line 266, in call_requests

sign(action, method, headers, data)

File "/Users/wk/Python-Bunq/bunq.py", line 190, in sign

headers['X-Bunq-Client-Authentication'] = get_session_token()

File "/Users/wk/Python-Bunq/bunq.py", line 143, in get_session_token

reply = post(method, data)

File "/Users/wk/Python-Bunq/bunq.py", line 311, in post

return call('POST', method, data)

File "/Users/wk/Python-Bunq/bunq.py", line 295, in call

raise Exception(result["Error"][0]["error_description"])

Exception: Insufficient authentication.

photo
31

@WWVV: Aah ik zie het, je zit achter een NAT router, dus hij registreert het verkeerde IP 10.0.1.119. Ik heb de code aangepast om op een betere manier het IP te bepalen: https://github.com/wesselt/bunq2ynab/commit/ff4f82b05374d3fe4f4230ba36ff823b7eac7457


Als je de nieuwe versie hebt, draai "bash clean.sh" om de lokale staat te verwijderen, of gooi in ieder geval "installation_token.txt" weg. Als dat niet werkt probeer het met een nieuwe API key, er zit dacht ik een beperking op hoe vaak je een nieuwe key kan registreren. Ben benieuwd!

photo
31

Werkt allemaal super nu tot zover.... Nu de "Personal Access Token" van de YNAB website https://app.youneedabudget.com/settings/developer

Die link breng me naar een pagina met My Setting, waar ik mijn trail kan bevestigingen, mijn password kan veranderen etc maar gaan optie voor een token..... Of moet ik daarvoor al een echte klant zijn? Misschien niet beschikbaar voor een trial? De URL van de pagina is https://app.youneedabudget.com/settings

photo
33

@WWVV: De YNAB API staat nog niet voor iedereen open. Je kan toegang aanvragen via: https://github.com/ynab/ynab-sdk-js Kreeg geen antwoord op mijn aanvraag, maar toen ik een paar dagen later weer keek zag ik de API optie in My Settings.

photo
29
photo
36

@Jorijn. So, I activated bunq premium and requested YNAB to allow me to make an API key, because you made my banking dream become almost reality. Thank you for that!


However, I have a question. How do you make the bunq - YNAB connection? I do not understand how to make it work :)

Thanks in advance

photo
26

Great stuff, guys!!!! Wessel, I'm setting up your scripts now and requested for the YNAB API key. Waiting on their response for 2 days now.

photo
28

Hey Jeffrey,


I have a tiny description written down. Send me an email at jorijn@jorijn.com so I can forward it to you.


I’ll also try and put up some docs soon.

photo
28

@Peter: Thanks! Two days is long... you could email api@youneedabudget.com and ask?

photo
24

@Wessel. I received the API. When I run the script:

/home/pi/bunq2ynab# python3 list_budget.py

Accounts for budget "My Budget":

<amount> Bunq (checking)


Then:

root@hestia:/home/pi/bunq2ynab# python3 bunq2ynab.py <id> <id> Bunq checking

Getting BUNQ identifiers...

Reading list of payments...

Getting YNAB identifiers...

Traceback (most recent call last):

File "bunq2ynab.py", line 23, in <module>

ynab_budget_id = ynab.get_budget_id(ynab_budget_name)

File "/home/pi/bunq2ynab/ynab.py", line 101, in get_budget_id

raise Exception("YNAB budget '{0}' not found".format(budget_name))

Exception: YNAB budget 'Bunq' not found

#


Any idea how I can get the correct budget and account id?

photo
26

@Peter: The sync script should accept both IDs and names.


There's a script called "list_budget.py" that lists your YNAB budgets and accounts.


Or you can see them in the YNAB website:


9413f5ac6656986c0b38798db7fa156c

photo
13

Just replying to let you know that your script has been working amazing for me! It now runs automatically every hour or so on my little home server. This made me actually decide to fully switch to Bunq with all my accounts :D

Do you know if there is some sort of listening function in the API, so that transactions can be pushed instead of pulled?

photo
13

Hey Wessel, just tried your connection, but failed at getting information from bunq bank. Here's the log

UserPerson "Mr. Xavier"  (999)
Traceback (most recent call last):
  File "list_user.py", line 21, in <module>
    print_accounts(v["id"])
  File "list_user.py", line 9, in print_accounts
    for a in [a["MonetaryAccountBank"] for a in bunq.get(method)]:
KeyError: 'MonetaryAccountBank
What could that be?

photo
13

@Joost: Thanks! The Bunq api has "callbacks" that push changes to a URL. You can check which callbacks are active with:

python3 list_callback.py
With the toggle_callback script, you can turn a callback on or off. The callback for transactions is MUTATION, you can set it up for port 12345 on your domain.com like:

python3 toggle_callback.py <username> MUTATION https://yourdomain.com:12345/
On that port I've got the script called "buns-callback.wsgi" listening. It basically starts python and runs the normal synchronisation script.

BUNQ callbacks come from the IP range 185.40.108.0/22. You could use a firewall to only allow incoming connections from that IP.

photo
14

@Rutger: that looks like you don't have any account? What happens if you add logging to the script? Replace this line in list_user.py:

import bunq
With:

import bunq
bunq.set_log_level(1)

That should show the JSON data that is exchanged. Does the reply to GET v1/user/xxx/monetary-account contain a "Response" with a "MonetaryAccountBank" inside?

photo
9

@Wessel vet! Ik zie dat ik m'n eigen run_bunq2ynab.sh kan toevoegen. Maar hoe start ik de .wsgi? Moet dat ook niet via een .py?

photo
12

@Joost: Bunq eist dat callbacks via HTTPS gaan met een geldig certificaat. Daarom draait het WSGI script bij mij via uWSGI achter nginx. Misschien eenvoudiger om Apache met mod_wsgi gebruiken. Maar je hebt minimaal een domein naam en een certificaat nodig.

photo
13

Oei, dat klinkt als of het daar ophoudt voor mij, ik vond het al heel wat dat ik met mijn drie weekjes online pythonles zo ver kwam, maar dit gaat mijn pet te boven. Dan maar weer terug naar hopen dat Bunq of YNAB dit zelf gaat ondersteunen :) (Mocht je ooit zin hebben een uitgebreide tutorial te typen hoor ik het wel ;) Ik had zelf bedacht dat het misschien met https://www.noip.com zou kunnen, maar dat klinkt niet als of je er een certificaat bij krijgt.

photo
13

@Joost: heb een suggestie op het forum gezet om een eenvoudige callback mogelijk te maken: https://together.bunq.com/topic/api-callback-zonder-domein-naam-of-certificaat

photo
16

@Joost: Heb een script toegevoegd "auto_sync.py" dat een callback opent bij BUNQ naar je huidige IP. Als je het script sluit haalt hij de callback weer weg. Als het goed is krijg je dan instant sync naar YNAB Heb jij zin/tijd om te kijken of dat werkt?

Code op GitHub: https://github.com/wesselt/bunq2ynab/blob/master/auto_sync.py


Omdat bunq een callback pas als afgeleverd ziet als hij op een volledig https endpoint is aangekomen, krijg je 5 retries. Dat is met het volume van een normale privé rekening hoop ik geen probleem.

photo
22

@Joost Ik ben zelf van plan de code van Wessel te gaan draaien via AWS Lambda: https://aws.amazon.com/lambda/ - dan heb je geen eigen server nodig waar je de code op moet draaien, je hoeft geen webservers te configureren, niks. Je moet alleen een Lambda functie aanmaken bij AWS. Dat wil ik dan weer doen middels Terraform (https://www.terraform.io/docs/providers/aws/r/lambda_function.html). Indien interesse kan ik wel de code op Github gooien.

AWS Lambda is gratis voor 1 miljoen requests per maand, ik vermoed dat de meeste mensen niet zoveel transacties zullen doen ;)

photo
16

Wauw, vet om te zien dat er nog zoveel opties zijn. Ik heb helaas de komende dagen geen tijd om verder te knutselen, maar ik zal van me laten horen als ik er weer aan toe kom.

photo
16

@Wessel Ik krijg hem helaas niet aan de praat. In eerste instantie zette hij een callback op naar een IP wat ik niet herkende, wel van mijn provider maar niet van mijn server. Heb het handmatig aangepast naar m'n eigen IP in add_callback, maar het lijkt niet te werken. Port forwarding staat aan voor 44716. Het zou iets met m'n router te maken kunnen hebben. Ik zit achter een router van de SSH (studentenhuis), dus misschien dat die specifieke instellingen de boel frustreren? Als ik een test stuur met telnet krijg ik wel netjes "Incoming call from xxx.xxx.x.xx... Not from BUNQ 185.40.108.0/22 range, ignoring..." met list_callback.py zie ik ook keurig "MUTATION URL https://mijn.server.ip:44716/bunq2ynab-autosync";

photo
17

Okee negeer wat hierboven staat, ik was even vergeten dat ik natuurlijk een public IP en een local IP heb... Ik zal even een Issue in Github openen als ik beter weet waar het fout gaat, dat lijkt me makkelijker dan hier.

photo
20

@Wessel het werkt! Fantastisch!

photo
20

@Joost: Leuk! Ik draai hem nu ook op deze manier. Nu nog kijken of het mogelijk is met upnp de poort automatisch open te zetten...

photo
15

@Rick if you could upload the code to github that would be great.


It would be great to have this in lambda to have it running all the time without requiring my computer to be running.

photo
15

@Thomas Ik heb helaas nog geen YNAB token kunnen regelen. Zodra ik die heb ga ik er werk van maken :).

photo
12

@Rick I got access to the API by emailing api@youneedabudget.com and they got back to me within a day to grant me access. Maybe that can help :)

photo
13

@Thomas yeah did that this morning so I'm hoping for a quick reply :)

photo
13

@Thomas: good news, I got it working via AWS Lambda. Bad news: it'll take a lot of effort to convert this into something github-worthy, so I'm not planning on doing this for the handful of users that might want it. If you want you can mail me at rick -at- vandenhof.eu and I'll guide you thru setting it up.

photo
10

Anyone else interested in running bunq2ynab auto sync (based on Wessels code, thanks!) via AWS Lambda can take a look at my instructions here: https://github.com/rvdh/aws_lambda_bunq2ynab

photo
6

@Rick thank you for all your help with me getting this up and running 🙌

photo
9

@Rick Very nice that you are working on this auto sync. Would love to be able to run this.

I am a bit stuck with setting it up in AWS Lambda. And I got a few questions, if you don't mind. What kind of event template do I need to use to set up the test event? In addition, if I am running the correct test event, how to get the Value of the Environment Variables (bunq_installation_token, and the other five variables)?

Thanks in advance!

Edit: The error I receive is the following: 'Incorrect padding: Error'

photo
11

@Jeffrey: those questions are all answered in the README in the repository :)

photo
10

@Rick: I'm sure is explained in the repository, but I can't seem to make it work. I'm probably doing something wrong here. The YNAB log output is shown correctly, that part seems to be working.

However, I can't make the bunq part to get working. I receive 'Execution result: failed', every time, and it is related to something padding.

{   "errorMessage": "Incorrect padding",   "errorType": "Error",   "stackTrace": [
No clue what I'm doing here...  :)

photo
16

@Jeffrey:


BUNQ_PRIVATE_KEYssh-keygen -t rsa -b 2048 -f private_key.pem && cat private_key.pem | base64


That command (works on Mac or Linux) should get you the properly formatted key. If on windows, you need something like puttygen to generate a key, export as PEM and base64 encode it.

photo
photo
30

It would change my banking life forever too! But it would be so cool if it all was in a single app, the past, the present and the future! https://together.bunq.com/topic/budgeting-seeing-the-future

photo
26

I would be interested in a way to connect my accounts at ynab and bunq, too.

But as I am no coder, the scripts mentioned in this thread are nothing I can work with.

photo
35

I understand your concern but the alternative would be to give someone you understandably do not trust full access to your bank account to realize this connection..

photo