IBAN-validatie: opbouw, modulo-97 en controle in bulk

2026-07-17

Een batch van 300 leveranciersbetalingen wordt door de bank geweigerd. Oorzaak: één IBAN met een spatie te veel en één met een verwisseld cijfer. Iemand heeft ze uit een PDF gekopieerd. Het herstel kost een middag en de betalingen gaan een dag later de deur uit.

IBAN-validatie is meer dan een snelle blik. Een betrouwbare controle gaat in stappen: eerst opschonen, dan de opbouw per land, dan de wiskundige modulo-97-check en tot slot de afhandeling van uitzonderingen. In dit artikel lees je hoe dat werkt, met codevoorbeelden en tips voor hele lijsten.

Waarom IBAN-controle in elke stap hoort

Vuistregel: IBAN-controle hoort niet alleen aan het eind vóór de export. Ze hoort bij het importeren, tijdens de verwerking en bij de laatste goedkeuring.

In de praktijk werkt een proces in meerdere lagen:

  1. Opschonen: spaties, kleine letters en onzichtbare tekens weghalen.
  2. Opbouw: landcode, lengte en toegestane tekens per land.
  3. Modulo-97: de controlecijfers narekenen.
  4. Uitzonderingen: oude gegevens, verdachte patronen, ontbrekende namen.

Voor een losse controle gebruik je de IBAN-validator of de IBAN-check.

De opbouw van een IBAN

Opbouw van een IBAN met landcode, controlegetal en rekeninggegevens

Elk IBAN begint met een landcode van twee letters en twee controlecijfers. Daarna volgt het nationale deel, met een lengte die per land vastligt. Een Nederlands IBAN heeft altijd 18 tekens.

De onderdelen van een Nederlands IBAN

Onderdeel Inhoud Betekenis
Landcode NL Nederland
Controlegetal 2 cijfers Voor de modulo-97-check
Bankcode 4 letters De bank, bijvoorbeeld ABNA, INGB, RABO
Rekeningnummer 10 cijfers Het rekeningnummer, aangevuld met voorloopnullen

Een bekend voorbeeld uit de documentatie is NL91 ABNA 0417 1643 00. Een Belgisch IBAN heeft 16 tekens, een Duits 22. Welke bank bij een IBAN hoort, zie je met bank bij IBAN.

Waar oude gegevens problemen geven

Bij de overstap naar IBAN in 2014 werden oude Nederlandse rekeningnummers omgezet. In oude bestanden kom je soms nog negen- of tiencijferige nummers tegen, of nummers die zijn aangevuld met de verkeerde bankcode. Zet zulke nummers niet zelf om met een formule: laat ze door de klant of leverancier bevestigen.

Kernpunt: een IBAN kan technisch kloppen en toch onbruikbaar zijn als het uit een verouderde bron komt.

De modulo-97-check

Uitleg van de modulo-97-berekening

De opbouw alleen is niet genoeg. De harde controle is de modulo-97-check: na herschikken en omzetten moet de rest van deling door 97 precies 1 zijn.

Zo werkt het

  1. Zet de eerste vier tekens achteraan. NL91ABNA0417164300 wordt ABNA0417164300NL91.
  2. Zet letters om in getallen: A=10 tot en met Z=35. N wordt 23, L wordt 21.
  3. Bereken de rest van het getal gedeeld door 97.
  4. Controleer de rest. Alleen 1 is geldig.

Wat er in software misgaat

  • Controleren op ruwe gegevens met spaties of kleine letters.
  • Het hele getal in één keer omzetten, waardoor het te groot wordt voor een gewoon integer-type.
  • Alleen een reguliere expressie gebruiken en de modulo-97 vergeten.

Kernpunt: controleer je direct op ruwe gegevens, dan controleer je vaak alleen de fout. Eerst opschonen, dan controleren.

Reguliere expressies en codevoorbeelden

Een reguliere expressie is handig voor de eerste laag: vorm en toegestane tekens. Echte validatie komt pas met de lengte per land en de modulo-97.

Wat regex wel en niet kan

^NL[0-9]{2}[A-Z]{4}[0-9]{10}$        (Nederland)
^[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}$     (algemeen)

Regex vertelt je niet of de controlecijfers kloppen.

JavaScript

function validateIban(raw) {
  const iban = raw.replace(/\s+/g, '').toUpperCase();
  if (!/^NL[0-9]{2}[A-Z]{4}[0-9]{10}$/.test(iban)) {
    return { valid: false, reason: 'Ongeldige opbouw' };
  }
  const rearranged = iban.slice(4) + iban.slice(0, 4);
  const converted = rearranged.replace(/[A-Z]/g, ch => (ch.charCodeAt(0) - 55).toString());
  let remainder = 0;
  for (const digit of converted) {
    remainder = Number(String(remainder) + digit) % 97;
  }
  return { valid: remainder === 1, reason: remainder === 1 ? null : 'Ongeldig controlegetal' };
}

Python

import re

def validate_iban(raw: str) -> dict:
    iban = re.sub(r"\s+", "", raw).upper()
    if not re.fullmatch(r"NL\d{2}[A-Z]{4}\d{10}", iban):
        return {"valid": False, "reason": "Ongeldige opbouw"}
    rearranged = iban[4:] + iban[:4]
    converted = "".join(str(ord(ch) - 55) if ch.isalpha() else ch for ch in rearranged)
    remainder = 0
    for digit in converted:
        remainder = int(f"{remainder}{digit}") % 97
    return {"valid": remainder == 1, "reason": None if remainder == 1 else "Ongeldig controlegetal"}

Voor andere landen vervang je de landspecifieke regex door een tabel met lengtes per landcode. Meer over de berekening lees je in hoe bereken je een IBAN.

Lijsten met IBAN’s in bulk controleren

Bulkverwerking van IBAN's

Wat werkt in batchprocessen

  • Elke regel apart controleren en doorgaan bij een fout, niet de hele batch stoppen.
  • Per fout het regelnummer, de waarde en de reden vastleggen.
  • De bron corrigeren, niet alleen de export.
  • Na correctie de hele lijst opnieuw controleren.

Typische fouten in de praktijk

Fout Oorzaak Oplossing
Verkeerde lengte Cijfer weggevallen of dubbel Navragen bij de bron
Ongeldig controlegetal Tikfout of verwisselde cijfers Navragen bij de bron
Onbekende landcode Kolommen verschoven, BIC in IBAN-kolom Kolomkoppeling controleren
Onzichtbare tekens Kopiëren uit PDF of mail Opschonen vóór controle
Naam past niet bij IBAN Verouderde gegevens Bevestigen bij de ontvanger

Sinds oktober 2025 controleert je bank bij elke SEPA-overboeking of de naam van de ontvanger bij het IBAN hoort (verificatie van de begunstigde). Klopt die niet, dan krijg je een waarschuwing en moet je de betaling bewust bevestigen. Houd namen in je betaalbestanden dus gelijk aan de naam op de rekening. Meer uitleg in verificatie van de begunstigde.

Kernpunt: een bulkcontrole zonder duidelijk foutenlog is vooral een snelle route naar lang handwerk.

IBAN-controle in je systemen en via een API

Integratie van IBAN-controle via een API

Eigen code, bibliotheek of API

Eigen code is prima voor één land. Werk je met veel landen, gebruik dan een onderhouden bibliotheek of een API die ook bank en BIC teruggeeft. Laat de controle draaien bij het invoeren van een nieuwe klant of leverancier, niet pas bij de betaling.

Controle ingebouwd in het betaalbestand

Maak je betaal- of incassobestanden vanuit Excel, CSV of JSON, dan wil je dat elk IBAN wordt gecontroleerd voordat het bestand bestaat. Met GenerateSEPA gebeurt dat automatisch bij het omzetten naar SEPA XML, en via de API kun je dezelfde controle in je eigen systeem gebruiken.

Samenvatting en praktijktips

Stap Wat je doet Wanneer
1 Opschonen: spaties, hoofdletters, onzichtbare tekens Bij elke import
2 Opbouw per land controleren Bij elke import
3 Modulo-97 narekenen, nooit vervangen door regex Bij elke import
4 Fouten loggen met regel en reden Bij bulkcontrole
5 Namen gelijk houden aan de rekeninghouder Bij stamgegevens
6 Opnieuw controleren vóór de betaalbatch Bij elke run

Wil je je IBAN’s controleren en meteen een geldig SEPA-bestand maken? Probeer GenerateSEPA 7 dagen gratis.

Lees ook: een IBAN controleren en wat een BIC-code is.


Veelgestelde vragen

Wat is het verschil tussen een opbouwcontrole en de modulo-97-check?
De opbouwcontrole kijkt of landcode, lengte en toegestane tekens kloppen. De modulo-97-check rekent met de controlecijfers of het nummer wiskundig klopt. Pas als beide slagen is het IBAN formeel geldig; of de rekening ook bestaat en bij de juiste naam hoort, controleert de bank.
Waarom mislukken zoveel IBAN-controles op de opmaak?
Omdat IBAN's worden gekopieerd met spaties, kleine letters, onzichtbare tekens of een voorvoegsel als IBAN:. Zonder eerst op te schonen faalt de controle op een nummer dat eigenlijk correct is. Schoon daarom altijd eerst op en controleer daarna.
Wat betekent de naamcontrole (VoP) voor het controleren van IBAN's?
Sinds oktober 2025 controleert je bank bij een SEPA-overboeking of de naam van de ontvanger hoort bij het IBAN. Dat is een extra laag bovenop je eigen IBAN-controle. Zorg daarom dat namen in je betaalbestanden overeenkomen met de naam op de rekening.
Hoe controleer je grote lijsten met IBAN's efficiënt?
Schoon alle nummers eerst op, controleer per regel opbouw en modulo-97, en schrijf elke fout weg met regelnummer en reden. Corrigeer daarna de bron en controleer opnieuw. Een converter of API die IBAN's valideert voordat het betaalbestand wordt gemaakt, doet dit automatisch.

Gerelateerde artikelen