# Bulk IBAN Validator & Formatter, Offline (`comall-agency/iban-validator-formatter`) Actor

Validate IBANs fully offline: country length from the ISO 13616 registry (78 countries), mod-97 checksum, BBAN extraction and clean 4-character formatting. The verdict says why a value failed, and expected\_length beside actual\_length makes a bad paste obvious. No bank lookup.

- **URL**: https://apify.com/comall-agency/iban-validator-formatter.md
- **Developed by:** [Comall Agency](https://apify.com/comall-agency) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 iban checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## IBAN Validator & Formatter — 100% Offline

Catch a mistyped IBAN before a transfer fails, or before money reaches the
wrong account. This Actor validates a batch of IBANs and returns each one
cleanly formatted.

**100% offline: no external call, no third-party lookup, nothing leaves
the run.** Pure arithmetic, no signup, no API key.

### What it does

For every IBAN you send, it:

1. Normalises the input — strips spaces, upper-cases letters.
2. Checks the **country code** against the ISO 13616 registry
   (**78 countries** are covered) and confirms the IBAN has exactly the
   length that country uses. A German IBAN is 22 characters, a French one
   27, a Norwegian one 15 — the wrong length is the most common paste
   error and it is caught here.
3. Verifies the **mod-97 checksum**: the first four characters are moved
   to the end, letters are converted to numbers (A=10 … Z=35), and the
   resulting very large number must leave a remainder of 1 when divided
   by 97. This is the check that catches single-digit typos and
   transposed digits.
4. Extracts the **BBAN** (the country-specific part after the check
   digits) and returns a human-readable version grouped in blocks of four.

### Use cases

- **Payments and payroll** — sanity-check supplier or employee IBANs
  before a transfer run, rather than paying bank fees on a rejected
  transfer.
- **Onboarding and KYC forms** — give immediate feedback on a mistyped
  IBAN at the point of entry, before it becomes a failed payment weeks
  later.
- **Finance data cleanup** — bulk-check a column of IBANs pulled from a
  spreadsheet, a CRM export or a legacy ERP.
- **Formatting for display** — turn `FR1420041010050500013M02606` into
  `FR14 2004 1010 0505 0001 3M02 606` for a statement or a PDF.

### Input

```json
{
  "ibans": [
    "FR1420041010050500013M02606",
    "de89 3704 0044 0532 0130 00",
    "GB00WEST12345698765432"
  ]
}
```

Spaces and lower-case letters are fine — the input is normalised for you.

### Output (one row per IBAN)

```json
{
  "input": "FR1420041010050500013M02606",
  "iban_normalized": "FR1420041010050500013M02606",
  "valid_format": true,
  "valid_checksum": true,
  "country_code": "FR",
  "expected_length": 27,
  "actual_length": 27,
  "bban": "20041010050500013M02606",
  "formatted": "FR14 2004 1010 0505 0001 3M02 606",
  "verdict": "valid",
  "checked_at": "2026-08-28T17:00:00.000Z"
}
```

The `verdict` field tells you *why* something failed rather than just
that it did: `valid`, `invalid_checksum`, `invalid_length`,
`unknown_country` or `invalid_format`. `expected_length` next to
`actual_length` usually makes a bad paste obvious at a glance.

### Pricing

Pay-per-event: **$0.005 per IBAN checked**, charged once a completed
check is produced — valid or invalid alike, since finding out that an
IBAN is wrong is exactly the answer you paid for.

### Limitations — read this before you buy

- **Structural validation only.** A `valid` verdict means the IBAN is
  well-formed and its checksum is correct. It does **not** mean the
  account exists, is open, or belongs to the person you think. No bank is
  contacted; that is what makes this fully offline.
- There is **no BIC/SWIFT derivation** and no bank-name lookup.
- A country absent from the ISO 13616 registry returns `unknown_country`
  rather than a guess.

### FAQ

**Can a valid IBAN still fail a transfer?**
Yes. The checksum only proves the number is internally consistent. A
closed account, a wrong beneficiary name or a bank-level rejection are
all invisible to any offline validator.

**Why not use a bank-lookup API instead?**
Because the overwhelming majority of bad IBANs are typos, and a mod-97
check catches those in microseconds without sending anyone's bank details
to a third party.

### Related Actors

Part of the same family of small, single-purpose checkers on this account —
each does one thing, priced per item checked:

- [Card Number Validator (Luhn)](https://apify.com/comall-agency/card-number-validator) — Luhn checksum and card-network detection, output is masked.
- [Barcode Check-Digit Validator](https://apify.com/comall-agency/barcode-checkdigit-validator) — EAN-13, EAN-8 and UPC-A check digits.
- [EU VAT Number Checker](https://apify.com/comall-agency/eu-vat-checker) — official VIES lookup.
- [Email Address Validator](https://apify.com/comall-agency/email-address-validator) — syntax, domain and MX checks.
- [Password Strength Checker](https://apify.com/comall-agency/password-strength-checker) — entropy scoring, never returns the password.
- [Cron Expression Validator](https://apify.com/comall-agency/cron-expression-tool) — plain-English description and next run times.
- [French E-Invoice Partner Resolver](https://apify.com/comall-agency/fr-einvoice-partner-resolver) — SIRET / SIREN / VAT resolution.

# Actor input Schema

## `ibans` (type: `array`):

List of IBANs to validate (spaces/case ignored). Each is checked: format length for its country, checksum (ISO 13616 mod-97).

## Actor input object example

```json
{
  "ibans": [
    "FR1420041010050500013M02606",
    "DE89370400440532013000",
    "GB00WEST12345698765432"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "ibans": [
        "FR1420041010050500013M02606",
        "DE89370400440532013000",
        "GB00WEST12345698765432"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("comall-agency/iban-validator-formatter").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "ibans": [
        "FR1420041010050500013M02606",
        "DE89370400440532013000",
        "GB00WEST12345698765432",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("comall-agency/iban-validator-formatter").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "ibans": [
    "FR1420041010050500013M02606",
    "DE89370400440532013000",
    "GB00WEST12345698765432"
  ]
}' |
apify call comall-agency/iban-validator-formatter --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,comall-agency/iban-validator-formatter"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mzNOYLGTq3JfHUmWc/builds/Vf8SYOsFTL2vNGmGT/openapi.json
