Created:
Last modified:
What is the IND Appointment Checker
It is a site where one can check for available appointments with the IND. The IND is the Immigratie- en Naturalisatiedienst, which roughly translates to the Immigration and naturalisation service. They're the government body in the Netherlands who deals with well, immigration and naturalisation services. If you want to stay in the Netherlands (for longer than your nationality automatically allows), this is who you will be dealing with. This could be for Highly Skilled Work Visas, Partnership Visa, Asylum visa, or a whole lot more.
Why
Basically, when I needed to book my Biometrics and Document collect appointments in the latter half of 2022, appointments were hard to come by. At my closest IND desk appointments were always booked up, and when any did become available they got snapped up fast. Also interacting with the IND website, eargerly reloading to view the latest data, was a pain. You have to first choose the desk you want to book at, then view the available days, then choose the day to view the available times in a dropdown field.
Personally, I prefer to see all the data (within reason) at once. This includes seeing multiple IND desk's appointments. As I had the option to go to any desk I wanted (for Biometrics) I wanted to balance availability with distance travelled. If I could get in, in the next day, even if I had to travel half way across the Netherlands (which isn't too far for an Aussie), that was a trade off I was happy with. If I had to wait a long time either way, I would go with a close IND desk.
How (laymans)
In my poking around on the website, while I was "patiently" reloading and rechecking appointment times, I found the way the website does it's calls to their database. It returned a (somewhat garbled) JSON object with all relevant appointment data. I found the different props needed to be sent (appointment type, location id and number in attendance), and started doing a rough and ready fetch call in the browser, sorting the data of a few locations by data/time, and console.log-ing out the top three locations. Within approx 30mins of playing with this I managed to spot a perfect appointment for the end of that week!
I was a little disappointed, to tell you the truth. I wanted to do more with this code, but there wasn't the pressing need now I had an appointment booked. Thankfully (cue sarcasm and huge eyeroll), the IND desk cancelled my appointment, emailing me to say they hadn't meant to make that appointment available. To be clear, the booking of the appointment is still done on their website, mine is just to view the same data in an easier way.
So, I got my chance to continue building this site. I found the other appointment API's and built out a small website to check appointments for Biometrics, Document Collection, Return Visas and Endorsement Stickers. I figured if I found this easier to view, others would too. That pushed me to make it as functional and accessible as possible.
This is not a new problem, nor a new solution. In fact if you do an internet search on IND appointments, you will find a good number of applications people have built to overcome this very problem. I haven't spotted any websites specifically, and the applications were usually for sending notifications. However I prefer the somewhat more reserved approach; performing manual calls to the site when you're in a position to then book the appointment straight away. At the end of the day we are utilising another organisations server capacity/energy, may as well use it responsibly.
How (technical)
The initial test
- Found network request to database on desk selection
- Realised structure required to make calls (appointment type id, location id and number of people attending)
- Checked each location to find their id
- Checked each appointment type for their id
- Tested maximum number of people attending (6)
- Created small script in browser to call a few locations, sort data by date/time and log top 3
Building it out
- Created nodejs express server to handle api calls from my front end to IND's server
- Hosted server on free tier of Heroku
- Frontend built out in vanilla HTML/(S)CSS/javascript
- Later hosted express server on my shared hosting via cPanel's (terrible) Node.js App
- Used nodemon to run the node app to try and keep it alive, as Node.js App's on cPanel aren't very stable (I will be changing this to a php api set up in the near future)
- Rebuild the frontend using my set up of PUG and Typescript with webpack compiling for ease of CD/CI
- Added error emailing for when the Node app inevitably goes down.
Of course everything is saved to, and pushed live from GitHub. Between GitHub and webpack, updating my sites are so easy!
Where
First there is the Biometrics page, which is where you go to update, or submit for the first time, your fingerprints, signature and photo. This was the first one I did, and if I remember correctly, it was the hardest one to book (of this and the Document Collection). Amsterdam especially seems to fill up faster than other desks.
On the Document Collection page you can see the appointments for collecting documents, such as residence permits, EU registration cards and other important documents. This collection point is already set in some circumstances, and you may not get a choice in where you can collect your documents from. It's always best to check the IND website, of course.
I haven't personally used the next two, but the database calls to get the information was all the same, and I could find the API's so I thought I'd make them too. They are the Endorsement Stickers and Return Visas
Endorsement Stickers are used to show your ability to reside in the Netherlands while you are awaiting a response on your visa/residency application. The Return Visa is incase your residence permite expires before or during an overseas travel.