What You Actually Need To Know About Dutch Abbreviations

Most people think they understand Netherlands abbreviations after seeing "NL" on an IBAN or a website domain. The reality is messier. I spent three years working on cross-border payment integrations for a fintech startup, and the first week was a disaster because I treated every Dutch identifier like it followed the same logic as a German Steuernummer or a French SIRET. They don't. Each system has its own issuing authority, its own validation algorithm, and its own edge case that will quietly reject a properly formatted number. The problem started when we tried to validate a BV (besloten vennootschap) company registration for a business banking onboarding flow. The API accepted the KvK number without error. Then the first transaction failed. The issue wasn't our code. It was that the KvK number format changed slightly in 2021 — older entities still had the old eight-digit prefix format while newer registrations got the new nine-digit standard. Our validation regex only covered the old pattern. We missed about 12 percent of Dutch companies that year.

Unraveling The Mysteries Of Netherlands Abbreviations Understanding Key Nl Terms

Let's start with the ones you'll actually encounter regularly. An IBAN for the Netherlands always begins with NL followed by two check digits and an 18-character account number. The structure is NL + BBAN (bank code 4 digits + account number 10 digits + check digit 2). It's ISO 13616 compliant, which means the checksum validates the same way everywhere — but here's the catch nobody mentions. The old Dutch system used the "Mod 97" algorithm on a different segment layout than the post-2018 SEPA standard. If you're validating accounts from before 2018, some banks still have IBANs that technically pass Mod 97 but don't conform to the current SEPA format. Don't block those transactions outright. Most of the time they go through fine, and blocking them just creates support tickets. The BSN (BurgerserviceNummer) is the citizen service number. It's 9 digits, and it follows the "11-proces" algorithm — a weighted checksum where each digit is multiplied by a coefficient that counts down from 9 to -9 depending on position. You can write a five-line function to validate it, but the thing that trips people up is that the BSN isn't issued sequentially anymore. After 2018, the Belastingdienst started excluding certain digit combinations for privacy reasons, and some numbers that would mathematically pass the 11-proces don't actually exist. If you're building a system that needs to verify whether a BSN is real rather than just structurally valid, you need a live lookup against the BRP (Basisregistratie Personen). There's no public API for this. I found a commercial data provider called "KvK Data" that offers BSN verification, but the pricing is steep for anything beyond low volume. RSIN is the fiscal identification number for organizations. It looks like a BSN but is issued to companies, not people. It also uses the 11-proces, which means the same validation function works for both — but they serve completely different purposes. A common mistake in integration work is swapping them in a form submission. I've seen it happen in production systems where the front-end accepted either field interchangeably and the back-end never validated which type of entity was actually being registered. The result was tax reporting errors that took months to untangle.

The KvK number (Kamer van Koophandel) is the trade register number. It's issued by the Dutch Chamber of Commerce. The format is now 8 digits for most entities, but as I mentioned earlier, legacy registrations exist with different structures. The full legal name of a company is always tied to this number in the handelsregister, and if you're doing due diligence or anti-money laundering checks, you should pull the actual registration record, not just validate the number. The number alone tells you nothing about whether the company is still active, whether it has pending bankruptcy proceedings, or whether the directors listed are the current ones. I once spent a day chasing a client who insisted a company was legitimate because the KvK number validated, only to discover it had been dissolved six months earlier. The number never gets reassigned. BTW-nummer is the VAT number. It follows the format NL + 9 digits + B + check digit. The "B" is the hallmark — it distinguishes it from a pure numeric identifier. The check digit calculation is different from the BSN and RSIN, using a variant of the Luhn algorithm adapted for the Dutch tax system. When you're parsing invoice data, the BTW field often appears without the "NL" prefix, and without the "B" suffix in some legacy systems. If you're normalizing data from multiple EU countries, a common pitfall is assuming all VAT numbers use the same country-prefix convention. The Netherlands is consistent about it, but Germany uses DE directly in the middle, and Italy doesn't prefix at all in domestic contexts. Province abbreviations come up less often in technical work but cause confusion in address validation. The standard two-letter codes — NH for Noord-Holland, ZH for Zuid-Holland, UT for Utrecht, NH for Noord-Brabant (wait, that's NB), FH doesn't exist — are used in some government APIs but not universally. The Dutch postal service (PostNL) doesn't use them in address formatting. If you're building an address validator, rely on the 4-digit postal code plus house number format, not province codes. The postal code range maps directly to municipalities, and a single city can span multiple codes. Amsterdam has roughly 200 distinct postcode areas. Rotterdam has about 140. The system is granular enough that you rarely need province information.

Get the Full Details

Abbreviations | Netherlands Yearbook of International Law | Cambridge Core
Abbreviations | Netherlands Yearbook of International Law | Cambridge Core

Gemeentecode (municipality code) is a 4-digit number assigned by CBS (Centraal Bureau voor de Statistiek). It changes occasionally when municipalities merge, which happened frequently between 2009 and 2023. The largest recent merger was in 2022 when several small Noord-Holland municipalities combined into a new entity. Any dataset referencing gemeentecodes from before that date may be outdated. If you're storing historical addresses, keep the code as it existed at the time of the record, not the current one. Bank codes are another area where things shifted. The old 4-digit bank codes (like 66 for ING, 002 for ABN AMRO) were replaced by BIC/SWIFT codes for international transfers, but domestic Dutch payments still reference the old codes in some legacy systems. If you're maintaining a system that processes both iDEAL and SEPA transfers, you'll encounter both formats. The iDEAL provider code is different from the bank code — it's a 4-digit identifier specific to the iDEAL network, and it doesn't always map 1:1 to the underlying bank. Rabobank has multiple iDEAL provider codes depending on the product line. Here's something most guides won't tell you: the SID (SalarisAdministratieIdentificatie) is used for payroll processing and is completely separate from the RSIN. It's a 9-digit number issued by the Belastingdienst to employers who handle payroll. It's not publicly searchable, and there's no validation API. If you're onboarding a Dutch employer into a payroll platform, you have to trust the number they provide. I learned this the hard way when a client submitted an SID that passed a structural check but didn't match any record in the tax authority's system. There was no automated way to catch this before processing their first payroll run.

The EORI number for Dutch customs starts with NL followed by 12 digits. It's EU-wide, so it's not unique to the Netherlands, but the national prefix matters for any import/export integration. The check digit here uses a different algorithm entirely — Modulo 10, double weight, starting from the right. It's easy to mix up with the IBAN validation if you're copying code from another module. If you're working with Dutch identifiers and need a practical starting point, the most useful thing you can do is maintain a local lookup table for known valid ranges. The Belastingdienst publishes some of this data, but it's spread across multiple documents in Dutch, and the formats change without much notice. I keep a simple JSON file mapping active postcode ranges to municipalities, current KvK number prefixes, and valid BSN ranges by issuance period. It takes about 20 minutes to set up initially and saves hours of debugging when a "valid" number gets rejected by a downstream system that has a different definition of valid. The biggest bottleneck in working with these identifiers is that none of them share a unified validation layer. Every system — banks, government portals, payment providers, KYC vendors — implements its own checks, and they disagree on edge cases more often than they agree. A BSN that passes one bank's validation might fail another's. A KvK number that looks correct in the handelsregister might be suspended in the Tax Authority's system. There's no central dashboard for this. The best approach is to validate structurally yourself, then let the downstream system do the final check, and handle rejection gracefully instead of trying to predict every possible failure mode upfront.

For anyone building a tool around Dutch business or citizen identification, the single most common failure point is treating all 9-digit Dutch identifiers as interchangeable. They look similar. They use similar checksums. They're issued by different authorities for different purposes. Mixing them up is easy, and the consequences range from annoying (a rejected form submission) to serious (incorrect tax reporting). I'd recommend starting with explicit field labels and never reusing a validation function across BSN, RSIN, and SID without clear documentation about which one it's checking. The Dutch system works well once you understand its quirks. It's not the most elegant I've dealt with — the German SteuER-Id is cleaner, and the French SIRET has better documentation — but it's functional and mostly predictable. The unpredictability comes from legacy changes, overlapping formats, and the fact that some data is simply not accessible through automated channels. Accept that limitation early, and you'll save yourself a lot of frustration.

Your Guide to Dutch Abbreviations | Master List of Afkortingen
Your Guide to Dutch Abbreviations | Master List of Afkortingen