Top IBAN Validation Libraries for Node.js, Python, PHP, and Go in 2026
Comparison of ibantools, python-stdnum, php-iban, and go-iban — features, MOD-97 support, BIC lookup, TypeScript support — plus when to use a library vs. a hosted API.
Technical Support, ibanchecker.cash
IBAN validation libraries let you embed MOD-97 check digit verification directly in your application without an external API call. This guide covers the most actively maintained libraries for Node.js, Python, PHP, and Go in 2026, compares them on the features that matter for production use, and explains when you should choose a library over a hosted API.
Node.js / JavaScript
ibantools
ibantools is the most widely adopted IBAN library in the JavaScript ecosystem. Written in TypeScript, it ships with type definitions and covers MOD-97 validation, BBAN format checking for all IBAN countries, IBAN formatting, and BIC validation.
npm install ibantoolsimport { isValidIBAN, electronicFormatIBAN, friendlyFormatIBAN, extractIBAN } from 'ibantools';
isValidIBAN('DE89370400440532013000'); // true
isValidIBAN('DE89370400440532013001'); // false (check digit wrong)
electronicFormatIBAN('DE89 3704 0044 0532 0130 00');
// 'DE89370400440532013000'
friendlyFormatIBAN('DE89370400440532013000');
// 'DE89 3704 0044 0532 0130 00'
const info = extractIBAN('GB29NWBK60161331926819');
// { valid: true, countryCode: 'GB', bban: 'NWBK60161331926819', ... }Strengths: TypeScript-native, tree-shakeable, zero runtime dependencies, comprehensive BBAN format validation beyond just MOD-97, actively maintained. Limitation: No BIC-to-bank-name lookup, it validates BIC format but does not resolve the bank name.
iban (npm)
The iban package is a lighter alternative focused on core MOD-97 validation and formatting. Good for projects where bundle size is a constraint and you only need the validity check.
npm install ibanconst IBAN = require('iban');
IBAN.isValid('DE89370400440532013000'); // true
IBAN.electronicFormat('DE89 3704 ...13000'); // 'DE89370400440532013000'
IBAN.printFormat('DE89370400440532013000'); // 'DE89 3704 0044 0532 0130 00'Strengths: Tiny footprint, simple API, works in browser and Node. Limitation: No TypeScript definitions, no BBAN format checks beyond length, only MOD-97.
Python
python-stdnum
python-stdnum is a comprehensive library for validating and formatting identification numbers, IBANs, VAT IDs, ISBNs, and 200+ other formats. The IBAN module performs format validation, MOD-97 check digit verification, and BBAN format checks for all registered countries.
pip install python-stdnumfrom stdnum import iban
iban.is_valid('DE89370400440532013000') # True
iban.is_valid('DE89370400440532013001') # False
iban.validate('DE89 3704 0044 0532 0130 00')
# 'DE89370400440532013000' (returns normalized form or raises exception)
iban.format('DE89370400440532013000')
# 'DE89 3704 0044 0532 0130 00'
# Compact form (strips spaces)
iban.compact('DE89 3704 0044 0532 0130 00')
# 'DE89370400440532013000'Strengths: Battle-tested, widely used in European fintech, BBAN format validation per country, raises typed exceptions on invalid input (useful for fail-fast validation). Limitation: No BIC lookup, broader dependency footprint due to the multi-format scope.
schwifty-iban
A lighter Python-only IBAN validator with a minimal API surface. Suitable when you want only IBAN validation without the broader stdnum dependency tree.
pip install schwiftyfrom schwifty import IBAN
iban = IBAN('DE89 3704 0044 0532 0130 00')
iban.is_valid # True
iban.country_code # 'DE'
iban.bic # Attempts BIC derivation where possible
iban.formatted # 'DE89 3704 0044 0532 0130 00'Strengths: Object-oriented API, BIC derivation from BBAN where the bank code is embedded (works for some countries). Limitation: BIC derivation is not universally reliable, the embedded bank code is only the routing prefix, not the full BIC.
PHP
globalcitizen/php-iban
The most complete IBAN library in the PHP ecosystem. Covers validation, formatting, country-specific BBAN verification, human-readable descriptions, and machine-readable IBAN component extraction.
composer require globalcitizen/php-iban<?php
require_once('php-iban.php');
verify_iban('DE89370400440532013000'); // true
verify_iban('DE89370400440532013001'); // false
machine_format_iban('DE89 3704 0044 0532 0130 00');
// 'DE89370400440532013000'
human_format_iban('DE89370400440532013000');
// 'DE89 3704 0044 0532 0130 00'
iban_get_parts('DE89370400440532013000');
// ['country' => 'DE', 'checksum' => '89', 'bban' => '370400440532013000', ...]Strengths: Comprehensive, well-documented, supports BBAN decomposition, includes country registry data. Limitation: Procedural API style, not namespaced, may conflict in large projects without careful loading.
iban-validation (Laravel / Composer)
For Laravel projects, yard/laravel-iban provides a validation rule that integrates with Laravel's validator:
$request->validate([
'iban' => ['required', 'iban'],
]);Go
almerlucke/go-iban
The most actively maintained Go IBAN library. Pure Go, no CGO, performs MOD-97 validation and length checks against the full IBAN country registry.
go get github.com/almerlucke/go-ibanpackage main
import (
"fmt"
"github.com/almerlucke/go-iban/iban"
)
func main() {
result, err := iban.NewIBAN("DE89370400440532013000")
if err != nil {
fmt.Printf("Invalid: %v\n", err)
return
}
fmt.Printf("Valid IBAN: %s\n", result.PrintFormat)
fmt.Printf("Country: %s\n", result.CountryCode)
}Strengths: Idiomatic Go, returns typed error on invalid input, compact dependency. Limitation: No BIC lookup or bank metadata.
Comparison Table
| Library | Language | MOD-97 | BBAN Format | BIC Lookup | TypeScript |
|---|---|---|---|---|---|
ibantools | JS/TS | ✓ | ✓ | Format only | ✓ |
iban (npm) | JS | ✓ | Length only | ✗ | Community |
python-stdnum | Python | ✓ | ✓ | ✗ | N/A |
schwifty | Python | ✓ | ✓ | Partial | N/A |
php-iban | PHP | ✓ | ✓ | ✗ | N/A |
go-iban | Go | ✓ | ✓ | ✗ | N/A |
Library vs. API: When to Use Which
Use a library when:
- You need offline or embedded validation, mobile apps, CLI tools, air-gapped environments.
- You are doing high-volume preprocessing where network latency and cost per call matter.
- You only need mathematical validity, you do not need bank name, BIC, or branch data.
- You want zero external dependencies at runtime.
Use the ibanchecker.cash API when:
- You need bank name, BIC, or branch metadata alongside the validity result, no library provides this.
- You want automatic updates when new countries join the IBAN standard or banks update their codes.
- You are building a web application or SaaS where an HTTP call is already part of the flow.
- You process IBANs in multiple languages or services and want a single authoritative validation source.
Many production systems combine both: use a library as a local pre-filter to reject obvious malformed input without an API call, then call the API for valid-looking IBANs to retrieve bank metadata. This pattern reduces API costs while maintaining data quality.
Sources & References
- SWIFT IBAN Registry — Official IBAN country format specifications
- ISO 13616-1:2020 — International standard for IBAN structure
- schwifty (PyPI) — Python library for IBAN and BIC validation
- php-iban (Packagist) — Comprehensive PHP IBAN validation library
- iban4j (Maven) — Java library for IBAN and BIC validation
- IbanNet (NuGet) — .NET IBAN validation library
Last updated: June 2026
Integrate IBAN validation via API
REST API with 1,000 free validations/month. JSON response with bank name, SEPA status, and BBAN breakdown.
How to Validate IBANs in JavaScript (API & Manual)
Two approaches: call the ibanchecker.cash API for full bank data, or implement MOD-97 validation yourself. Includes work...
IBAN Validation in Python: Complete Implementation with Regex and Check Digits
Two production-ready approaches: call the ibanchecker.cash API for bank metadata, or implement the MOD-97 algorithm your...
Building an IBAN Validation API: REST Endpoint Design and Edge Cases
Architect-level guide to IBAN API design — GET vs POST tradeoffs, error code standards, normalization contracts, KV cach...
IBAN Regex Patterns That Actually Work (And Why Simple Regex Isn't Enough)
Country-specific regex patterns for DE, GB, FR, NL plus a generic IBAN regex — and why regex is only step 1 of validatio...