IBAN Validator avatar

IBAN Validator

Pricing

Pay per event

Go to Apify Store
IBAN Validator

IBAN Validator

Validate IBANs in bulk. Verifies structure, MOD-97 check digits, country codes, and extracts bank and branch identifiers. Returns the formatted IBAN, country name, SEPA membership status, and detailed error reasons for invalid entries. Ideal for payment processing and compliance checks.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Validate International Bank Account Numbers (IBANs) in bulk. Checks structure, MOD-97 check digits, country codes, and SEPA eligibility. Extracts bank identifier, branch code, account number, and formats each IBAN in standard grouped notation.

Zero-dependency on paid data sources — all validation is performed locally using the ibantools library, so results are instant and consistent.


What does it do?

IBAN Validator accepts a list of IBAN strings and returns one dataset item per IBAN with:

  • Validity flag — did this IBAN pass all structural and checksum tests?
  • 🌍 Country — full country name and ISO code extracted from the IBAN prefix
  • 🏦 Bank & branch identifiers — bank code and branch code parsed from the BBAN section
  • 🔢 MOD-97 result — was the ISO 7064 check digit calculation correct?
  • 📐 Formatted IBAN — standard 4-character grouped format (e.g. DE89 3704 0044 0532 0130 00)
  • 🇪🇺 SEPA status — is the IBAN from a Single Euro Payments Area country?
  • ⚠️ Detailed error reasons — wrong length, bad check digits, unrecognized country code, etc.

Handles malformed input gracefully — every item gets a result, even empty strings or totally invalid values.


Who is it for?

🏦 Fintech and payment platforms

You receive IBANs from users during onboarding or payment setup. Before sending funds or storing data, you need to validate each IBAN structurally. This actor processes thousands of IBANs in one run and returns structured results for your downstream pipeline.

📊 Finance and compliance teams

You maintain a spreadsheet or database of counterparty IBANs for reporting or audit purposes. Batch-validate the entire list to flag invalid entries and identify which country each IBAN belongs to — without writing a single line of code.

🔗 Data pipeline engineers

You're building ETL pipelines that ingest customer-submitted banking data. Wire this actor into your pipeline via the Apify API to validate IBANs on the fly and reject bad records before they reach your database.

🧪 QA engineers testing payment flows

You need to verify that your integration correctly distinguishes valid from invalid IBANs. Use this actor to generate ground-truth validation results for any test corpus.

🌍 E-commerce businesses with EU customers

You accept SEPA bank transfers. Validate incoming IBANs before triggering payment requests to reduce failed transactions and processing fees.


Why use it?

  • No API keys required — purely local computation using the ibantools library, which implements the official IBAN specification
  • Bulk processing — validate hundreds or thousands of IBANs in a single run
  • Detailed error reasons — not just "invalid", but WHY it's invalid (wrong length, bad MOD-97, unrecognized country code)
  • SEPA detection — instantly know if an IBAN supports euro zone payments
  • Flexible input — accepts IBANs with or without spaces, upper or lowercase
  • Zero false negatives — every input item produces an output item, including empty strings
  • Structured output — flat JSON schema, no nested objects, compatible with Apify datasets, Google Sheets, Zapier, and Make

What data does it extract?

FieldTypeDescription
inputstringOriginal IBAN string as provided
isValidbooleanTrue if the IBAN passes all structural and checksum checks
formattedIbanstringIBAN in standard 4-char grouped format (e.g. DE89 3704 0044 0532 0130 00)
electronicFormatIbanstringIBAN in compact electronic format (no spaces)
countryCodestringISO 3166-1 alpha-2 country code (e.g. DE, GB, NL)
countryNamestringFull country name (e.g. Germany, United Kingdom)
countryInSepabooleanTrue if the country is a SEPA member
checkDigitsstringThe two check digit characters (positions 3–4 of the IBAN)
bbanstringBasic Bank Account Number — the national account identifier portion
bankIdentifierstringBank code extracted from the BBAN (country-specific)
branchIdentifierstringBranch code extracted from the BBAN, where applicable
accountNumberstringAccount number portion of the BBAN, where parseable
expectedLengthnumberExpected total IBAN length for this country
actualLengthnumberActual length of the provided string
mod97ValidbooleanTrue if the MOD-97 check digit algorithm passed
issuesarrayList of human-readable error messages (empty if valid)
errorstringFirst error message, or null if valid
validatedAtstringISO 8601 timestamp of when validation was performed

How much does it cost to validate IBANs?

IBAN Validator uses Pay-Per-Event (PPE) pricing:

EventPrice
Actor start$0.01 per run
Per IBAN validated$0.001 per IBAN

Cost examples

IBANs validatedEstimated cost
10~$0.02
100~$0.11
1,000~$1.01
10,000~$10.01

Free plan estimate

Apify's free plan includes $5 of monthly platform credit. That covers approximately 4,900 IBAN validations per month for free.

Pricing is tiered — higher-tier Apify plans receive discounts on per-event prices. See Apify pricing plans for details.


How to validate IBANs — step by step

  1. Open the actor — go to https://apify.com/automation-lab/iban-validator
  2. Enter your IBANs — paste them into the "IBAN numbers" field, one per line. Spaces and lowercase are accepted.
  3. Click Start — the actor runs instantly (no proxies, no browser, pure computation)
  4. Review results — switch to the Dataset tab and use the "Overview" view for a clean table
  5. Export — download as JSON, CSV, or XLSX; or connect to Google Sheets via the integration

Input parameters

ParameterTypeRequiredDescription
ibansarray of stringsYesList of IBAN strings to validate. Spaces and case are normalized automatically. Duplicates are deduplicated.

Example input

{
"ibans": [
"DE89 3704 0044 0532 0130 00",
"GB29 NWBK 6016 1331 9268 19",
"NL91 ABNA 0417 1643 00",
"NOTANIBAN",
"DE00 3704 0044 0532 0130 00"
]
}

Output examples

Valid IBAN (Germany)

{
"input": "DE89 3704 0044 0532 0130 00",
"isValid": true,
"formattedIban": "DE89 3704 0044 0532 0130 00",
"electronicFormatIban": "DE89370400440532013000",
"countryCode": "DE",
"countryName": "Germany",
"countryInSepa": true,
"checkDigits": "89",
"bban": "370400440532013000",
"bankIdentifier": "37040044",
"branchIdentifier": null,
"accountNumber": "532013000",
"expectedLength": 22,
"actualLength": 22,
"mod97Valid": true,
"issues": [],
"error": null,
"validatedAt": "2026-03-24T10:00:00.000Z"
}

Valid IBAN (United Kingdom)

{
"input": "GB29 NWBK 6016 1331 9268 19",
"isValid": true,
"formattedIban": "GB29 NWBK 6016 1331 9268 19",
"electronicFormatIban": "GB29NWBK60161331926819",
"countryCode": "GB",
"countryName": "United Kingdom",
"countryInSepa": true,
"checkDigits": "29",
"bban": "NWBK60161331926819",
"bankIdentifier": "NWBK",
"branchIdentifier": "601613",
"accountNumber": null,
"expectedLength": 22,
"actualLength": 22,
"mod97Valid": true,
"issues": [],
"error": null,
"validatedAt": "2026-03-24T10:00:00.000Z"
}

Invalid IBAN — bad check digits

{
"input": "DE00 3704 0044 0532 0130 00",
"isValid": false,
"formattedIban": null,
"electronicFormatIban": "DE00370400440532013000",
"countryCode": "DE",
"countryName": "Germany",
"countryInSepa": true,
"checkDigits": "00",
"bban": null,
"bankIdentifier": null,
"branchIdentifier": null,
"accountNumber": null,
"expectedLength": 22,
"actualLength": 22,
"mod97Valid": false,
"issues": ["MOD-97 check digit validation failed"],
"error": "MOD-97 check digit validation failed",
"validatedAt": "2026-03-24T10:00:00.000Z"
}

Invalid IBAN — unrecognized country

{
"input": "NOTANIBAN",
"isValid": false,
"formattedIban": null,
"electronicFormatIban": "NOTANIBAN",
"countryCode": "NO",
"countryName": "Norway",
"countryInSepa": true,
"checkDigits": "TA",
"bban": null,
"bankIdentifier": null,
"branchIdentifier": null,
"accountNumber": null,
"expectedLength": 15,
"actualLength": 9,
"mod97Valid": null,
"issues": ["Wrong BBAN length for country", "Wrong BBAN format for country", "ChecksumNotNumber"],
"error": "Wrong BBAN length for country",
"validatedAt": "2026-03-24T10:00:00.000Z"
}

Tips and best practices

  • Spaces are fine — the actor normalizes DE89 3704 0044 0532 0130 00 and DE89370400440532013000 to the same result
  • Case is irrelevant — lowercase IBANs like de89370400440532013000 are accepted and normalized to uppercase
  • Duplicates are skipped — if you submit the same IBAN twice (with or without spaces), it is validated once
  • Large batches work well — the actor processes IBANs sequentially in milliseconds each; 10,000 IBANs typically complete in under 60 seconds
  • Check issues for details — when isValid is false, the issues array lists every reason, not just the first
  • Use mod97Valid for checksum-only checks — if you want to specifically test whether the MOD-97 algorithm passed (independent of structural issues), read the mod97Valid field
  • bankIdentifier availability — this field is extracted by ibantools based on the BBAN structure defined per country. Some countries (e.g. Germany) include the bank routing code; others may have null here
  • branchIdentifier availability — available for countries like United Kingdom where the sort code is part of the BBAN structure

Integrations

🔗 Zapier workflow — validate IBANs from a Google Form

  1. Trigger: Google Forms — New response (includes an IBAN field)
  2. Action: Apify — Run actor (automation-lab/iban-validator) with ibans: [{{IBAN_field}}]
  3. Action: Apify — Wait for run to finish
  4. Filter: Filter — Only continue if isValid = true
  5. Action: Slack — Send message or CRM — Create record with validated IBAN details

🔗 Make (Integromat) workflow — enrich payment data

  1. Trigger: Airtable — Watch records (new rows with IBAN column)
  2. Module: Apify — Run actor sync with the IBAN list
  3. Module: Apify — Get dataset items
  4. Module: Airtable — Update record — write back countryName, isValid, bankIdentifier

🔗 Python ETL pipeline

import apify_client
import csv
client = apify_client.ApifyClient("YOUR_API_TOKEN")
with open("ibans.csv") as f:
ibans = [row[0] for row in csv.reader(f)]
run = client.actor("automation-lab/iban-validator").call(
run_input={"ibans": ibans}
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
invalid = [item for item in items if not item["isValid"]]
print(f"Found {len(invalid)} invalid IBANs")

🔗 Webhook-driven validation

Configure your Apify actor run to POST results to your endpoint:

curl -X POST "https://api.apify.com/v2/acts/automation-lab~iban-validator/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ibans": ["DE89370400440532013000", "GB29NWBK60161331926819"],
"webhooks": [{
"eventTypes": ["ACTOR.RUN.SUCCEEDED"],
"requestUrl": "https://your-server.com/iban-results"
}]
}'

API usage

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('automation-lab/iban-validator').call({
ibans: [
'DE89 3704 0044 0532 0130 00',
'GB29 NWBK 6016 1331 9268 19',
'INVALID123',
],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const valid = items.filter(item => item.isValid);
console.log(`${valid.length} of ${items.length} IBANs are valid`);

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("automation-lab/iban-validator").call(run_input={
"ibans": [
"DE89 3704 0044 0532 0130 00",
"GB29 NWBK 6016 1331 9268 19",
"INVALID123",
]
})
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
for item in items:
status = "VALID" if item["isValid"] else f"INVALID: {item['error']}"
print(f"{item['input']}: {status}")

cURL

# Start a run
curl -X POST "https://api.apify.com/v2/acts/automation-lab~iban-validator/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ibans": ["DE89370400440532013000", "GB29NWBK60161331926819"]}'
# Fetch results (replace DATASET_ID with the defaultDatasetId from the run response)
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_TOKEN"

Use with Claude AI (MCP)

This actor is available as a tool in Claude AI through the Model Context Protocol (MCP). Add it to Claude Desktop, Cursor, Windsurf, or any MCP-compatible client.

Setup for Claude Code

$claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/iban-validator"

Setup for Claude Desktop, Cursor, or VS Code

Add this to your MCP config file:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/iban-validator"
}
}
}

Example prompts

  • "Validate these IBANs and tell me which ones are invalid and why: DE89370400440532013000, GB29NWBK60161331926819, INVALID123."
  • "I have a list of 500 customer IBANs from our database — validate them all and summarize the errors by type."
  • "Check if this IBAN is from a SEPA country and extract the bank identifier: NL91ABNA0417164300."

Learn more in the Apify MCP documentation.


Legality

IBAN Validator performs purely algorithmic validation using the official IBAN specification (ISO 13616). It does not call any external bank APIs, access account data, or verify whether an account is active or closed.

No personal data is stored beyond your own Apify dataset. Results are retained per your Apify account's data retention settings. The actor does not log IBAN values beyond standard Apify run logs visible only to you.

Using this actor to validate IBANs provided by your own users for payment processing purposes is standard practice in fintech and is legal in all jurisdictions.


FAQ

Does it verify that the account actually exists?

No. IBAN Validator checks the structural validity and checksum of the IBAN — it does not verify that the account is open or that the bank recognizes it. Structural validity is a prerequisite for any payment attempt, but it does not guarantee a successful transfer.

What IBAN formats are supported?

All standard IBAN formats from the official IBAN registry are supported, covering 80+ countries. The actor handles IBANs with and without spaces, and accepts both upper and lowercase input.

Why is bankIdentifier null for some valid IBANs?

The bankIdentifier field is derived from the BBAN according to the country-specific BBAN structure. For some countries, ibantools does not extract a separate bank code from the BBAN, so the field returns null even for valid IBANs.

Why is mod97Valid null for some invalid IBANs?

If the IBAN has structural issues (wrong length, invalid country code) that prevent the MOD-97 algorithm from being meaningfully applied, mod97Valid is null rather than false. It is explicitly false only when the structure is otherwise valid but the check digit fails.

The actor returned isValid: false for an IBAN my bank says is correct — why?

Check the issues field for the specific error. Common reasons include: extra/missing spaces that weren't stripped (though the actor handles this), an IBAN from a country whose format recently changed, or a QR-IBAN which is a Swiss payment-specific format. If you believe this is a bug, please open an issue on GitHub.

How do I handle the FR76 format with wrong checksum?

French IBANs use an additional Luhn-variant checksum within the BBAN. If the IBAN passes MOD-97 but fails with WrongAccountBankBranchChecksum, the IBAN format is technically valid per ISO 13616 but the French national check failed. Most payment systems reject these.