# IBAN Validator: Bulk Check & Bank Lookup (`offerastudio/iban-bank-validator`) Actor

Validate up to 10,000 IBANs: country, length and mod-97 per the SWIFT IBAN Registry, national check digits (BE, FR, ES, IT, NL), printed format, test/example IBAN detection, SEPA flag, plus bank name and BIC for DE, AT, CH and LI from official open files.

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

## Pricing

from $1.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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does IBAN Validator do?

**IBAN Validator** checks up to **10,000 IBANs in one run**, offline and in seconds, and adds the **bank name and BIC** for German, Austrian, Swiss and Liechtenstein IBANs. For every IBAN you get:

- ✅ **valid / invalid** with the first check that failed: **country** and **length** per the **SWIFT IBAN Registry**, the **BBAN structure**, the **mod-97 check digits**, and the **national check digits** for Belgium, France, Spain, Italy and the Netherlands
- 🖨️ the IBAN in **electronic** (`DE89370400440532013000`) and **printed** (`DE89 3704 0044 0532 0130 00`) format
- 🏦 **bank code, branch code and account number** as the registry defines them, and for **DE, AT, CH and LI** the **bank name and BIC** from official open bank-code files (source, licence and validity date on every row)
- 🧪 a **test / example IBAN** flag: the IBANs printed in the IBAN Registry, IBANs used in public payment documentation and placeholder-looking accounts are marked, so nobody pays to them
- 🌍 a **SEPA flag**: `usesIbanOutsideSepa: true` for countries that use IBAN but are not in SEPA (Turkey, Saudi Arabia, Brazil, Israel, Ukraine …), where euro SEPA transfers do not work

Paste IBANs as they come: lower case, with spaces, dots or dashes, or as a comma- or semicolon-separated list.

### Who is it for?

- **Finance and accounts payable teams** that check supplier and employee IBANs before a payment run (typos are caught before the bank rejects the file).
- **Marketplaces, SaaS and fintechs** that need to validate IBANs at onboarding or in bulk, and want the bank name and BIC for display.
- **Data and CRM cleanup**: find typos and test IBANs in a customer or supplier list.
- **Developers** who want a reference implementation of the offline IBAN rules with the registry data behind it.

### How the check works

1. **Country and length.** The first two letters must be an IBAN country in the SWIFT IBAN Registry and the length must match (`DE` = 22 characters, `NO` = 15, `MT` = 31 …).
2. **Structure.** The part after the check digits must have the structure of the country (digits where digits are required, capital letters where letters are required).
3. **Mod-97.** The ISO 7064 check digits (positions 3–4) must match.
4. **National check digits** where the algorithm is public and the same for every bank: **BE** (mod 97), **FR** (RIB key), **ES** (two control digits), **IT** (CIN letter) and **NL** (11-test, for 9–10 digit account numbers; old giro numbers have no check). **Germany is not checked**: its *Prüfziffer* methods differ by bank (the Bundesbank publishes about 150 of them), so `nationalCheck` says `not-applicable`.
5. **Bank lookup** for IBANs that passed all checks: the bank code is looked up in a bundled file. Bank-code files are used only where the licence allows it:

| Country | File | Licence / terms |
| --- | --- | --- |
| **DE** Germany | Deutsche Bundesbank *Bankleitzahlendatei* | Free to store, pass on and copy for personal or business use if unaltered and credited "Quelle: Deutsche Bundesbank" |
| **AT** Austria | OeNB SEPA-Zahlungsverkehrsverzeichnis | CC BY 4.0, commercial use allowed (credit "© OeNB") |
| **CH**, **LI** Switzerland and Liechtenstein | SIX Swiss Bank Master | SIX: "Information in the Download Bank Master may be used freely" |

For every other country there is **no openly licensed bank-code file**: the row returns the **bank code as printed in the IBAN** and says `bankLookup: "not-available"` with a note that the bank name is not available. The bank-code files are bundled with the Actor and refreshed by a script (`npm run refresh-data` in the Actor's folder); every row says which file it used and how old it is (`bankSource`, `bankDataValidity`).

### How to use it

1. Click **Start** with the default input: eight example IBANs from the IBAN Registry and one with a bad checksum.
2. Replace the list with your own IBANs, one per line.
3. Turn **Look up the bank** off if you only need the checks.

The **Results** tab shows one row per IBAN; **Bank lookup** and **Checks** have their own tabs.

### Input example

```json
{
    "ibans": ["DE89 3704 0044 0532 0130 00", "DE75 5121 0800 1245 1261 99", "NL91 ABNA 0417 1643 00", "DE89 3704 0044 0532 0130 01"],
    "lookupBank": true
}
```

### Output example

Real output of a local run on 1 October 2026 (bank data from the files downloaded the same day):

| IBAN | valid | status | bank | BIC | test IBAN |
| --- | --- | --- | --- | --- | --- |
| DE89 3704 0044 0532 0130 00 | true | valid | Commerzbank | COBADEFFXXX | true (registry example) |
| DE75 5121 0800 1245 1261 99 | true | valid | Societe Generale | SOGEDEFFXXX | false |
| FR14 2004 1010 0505 0001 3M02 606 | true | valid | not available for FR (bank code 20041) | – | true (registry example) |
| DE89 3704 0044 0532 0130 01 | false | invalid-checksum | – | – | false |

One row in full:

```json
{
    "input": "DE75 5121 0800 1245 1261 99",
    "position": 9,
    "iban": "DE75512108001245126199",
    "ibanPrinted": "DE75 5121 0800 1245 1261 99",
    "countryCode": "DE",
    "countryName": "Germany",
    "valid": true,
    "status": "valid",
    "message": "Valid IBAN: country, length, structure and mod-97 check digits match.",
    "checkDigits": "75",
    "expectedLength": 22,
    "nationalCheck": "not-applicable",
    "bankCode": "51210800",
    "branchCode": null,
    "accountNumber": "1245126199",
    "bankLookup": "found",
    "bankName": "Societe Generale",
    "bic": "SOGEDEFFXXX",
    "bankSource": "Deutsche Bundesbank Bankleitzahlendatei (Quelle: Deutsche Bundesbank)",
    "bankDataValidity": "07.09.2026 to 06.12.2026",
    "bankNote": null,
    "isTestIban": false,
    "testReason": null,
    "inSepa": true,
    "usesIbanOutsideSepa": false,
    "error": null,
    "errorMessage": null
}
```

**Fields worth knowing:**

- `status`: `valid`, `invalid-country`, `invalid-length`, `invalid-format`, `invalid-checksum` or `invalid-national-check`. `valid` is true only for `valid`.
- `bankLookup`: `found`, `not-found` (the code is not in the file: closed or merged bank, or an example IBAN), `not-available` (no open file for the country), `no-bank-code` (the country's IBAN has none) or `not-checked` (lookup off, or the IBAN failed a check).
- `error` / `errorMessage` are set on free rows only: `empty-input`, `not-an-iban`, `too-long`, `invalid-input`, `limit-reached`.

### How much does it cost?

This Actor uses **pay per event**:

| Event | Price |
| --- | --- |
| IBAN checked (one row per IBAN-shaped entry, valid or invalid) | **$0.001** |
| Entries that cannot be read as an IBAN, and run-level notes | **free** |

- 1,000 IBANs cost **$1.00**; the default run costs **$0.009**.
- No external service is called, so there are no other costs. Apify also charges a tiny standard start fee per run.
- Set **Maximum cost per run** in the run options and the Actor stops when it is reached.

### Limitations

- **A valid IBAN is not proof that the account exists, is open, or belongs to the person you expect.** The checks catch typos and impossible numbers. The Actor does not contact any bank and cannot confirm the account holder (use your bank's *Verification of Payee* service for that).
- **The country formats come from the SWIFT IBAN Registry**, transcribed from open data sets; the registry changes now and then. Countries that only have a partial IBAN (for example Algeria, Morocco, Senegal) are not in the registry and are reported as `invalid-country`.
- **National check digits** only for BE, FR, ES, IT and NL. A few neobank accounts do not follow their country's national rule and fail the national check although the IBAN works: such rows say `invalid-national-check` and name the reason; check the IBAN with the bank if you doubt it.
- **Bank names only for DE, AT, CH and LI** (see the table above). The bank-code files are a snapshot that is as old as the Actor's last release; `bankDataValidity` shows the validity the publisher states. A bank that merged or changed its code recently may show `not-found`.
- **Test IBAN detection** is a list of known documentation IBANs plus placeholder patterns; an IBAN that is not flagged is not guaranteed to be real.
- **10,000 IBANs per run.** Entries are de-duplicated after normalising.

### Data and licences

The IBAN structure data is from the SWIFT IBAN Registry (the ISO 13616 registration authority). The bank-code files come from the Deutsche Bundesbank (Quelle: Deutsche Bundesbank), the Oesterreichische Nationalbank (© OeNB, CC BY 4.0) and SIX Interbank Clearing. Not affiliated with or endorsed by any of them. No personal data is processed beyond the IBANs you enter; the Actor stores nothing between runs.

### FAQ

#### Does it call a bank or an API?

No. Everything runs offline in the Actor, using the registry table and the bundled bank-code files. That is why it is fast and cheap.

#### Why does a valid IBAN have no bank name?

Bank names come from open bank-code files, and only DE, AT, CH and LI have one that the licence allows to bundle. For other countries the row returns the bank code and says so. Many national bank registers exist but do not allow redistribution.

#### Why is an IBAN flagged as a test IBAN?

It is one of the example IBANs printed in the SWIFT IBAN Registry or in public bank and payment documentation, or its account number is a placeholder such as `0123456789`. These look real and pass every check, but they are not someone's account.

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Structured Data Validator: Schema & Rich Results](https://apify.com/offerastudio/structured-data-validator): JSON-LD and Microdata checked against Google's rich result rules.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.
- [Policy Change Monitor: Privacy & Terms Tracker](https://apify.com/offerastudio/policy-change-monitor): privacy policy and terms changes, classified clause by clause.
- [SaaS Pricing Monitor: Track Competitor Plans](https://apify.com/offerastudio/saas-pricing-monitor): competitor pricing plans as structured data, with price-change diffs.
- [Sitemap Change Monitor: New & Removed URLs](https://apify.com/offerastudio/sitemap-change-monitor): new, removed and changed URLs from a site's sitemaps.
- [Site SEO Crawler: Broken Links & On-Page Audit](https://apify.com/offerastudio/site-seo-crawler-audit): site-wide crawl for broken links, redirects and on-page SEO issues.
- [Website Tech Stack Detector: Bulk Lead Filters](https://apify.com/offerastudio/website-tech-stack-detector): technologies used by websites, with filters for lead lists.
- [Domain Availability & Expiry Checker (RDAP)](https://apify.com/offerastudio/domain-whois-availability): domain availability, registrar and expiry dates from RDAP.
- [Status Page SLA Monitor: Uptime & Incidents](https://apify.com/offerastudio/status-page-sla-monitor): SaaS vendor uptime, incidents and a monthly SLA table from public status pages.

**Company data and compliance**

- [Company Contact Finder: Emails, Phones & Socials](https://apify.com/offerastudio/company-contact-finder): contact details published on company websites.
- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.
- [UK Company Distress Watch: Insolvency Alerts](https://apify.com/offerastudio/uk-company-distress-watch): administrations, liquidations and winding-up petitions from The Gazette.
- [Sanctions Screening: OFAC, EU, UN & UK Lists](https://apify.com/offerastudio/sanctions-screening): names screened against official sanctions lists, with match scores.
- [OSHA & EPA Violation Monitor: Fines by Company](https://apify.com/offerastudio/osha-epa-violation-monitor): US OSHA and EPA enforcement cases and penalties by company.
- [Email List Precheck: Syntax, MX & Disposable Check](https://apify.com/offerastudio/email-list-precheck): cheap email list hygiene before a real verification.
- [UK Company Officer Changes: Director & PSC Alerts](https://apify.com/offerastudio/uk-company-officer-changes): director, owner, address and status changes for a watchlist of UK companies.
- [FDA Warning Letters Monitor: By Company & Subject](https://apify.com/offerastudio/fda-warning-letters-monitor): FDA warning letters by company and subject, with cited regulations.
- [Supplier Risk Report: Sanctions, VAT & Insolvency](https://apify.com/offerastudio/supplier-risk-report): one risk row per supplier from eight official registers, with changes since last run.
- [Brand Impersonation Domain Monitor: Look-alikes](https://apify.com/offerastudio/brand-impersonation-domain-monitor): look-alike domains and certificates that imitate your brand, with a risk score.

**Media and AI**

- [Audio & Video Transcriber: Podcasts, SRT, Speakers](https://apify.com/offerastudio/audio-video-transcriber): audio, video, podcasts and social links to text, SRT and VTT.
- [Podcast Mention Alerts: Brand Mentions by Second](https://apify.com/offerastudio/podcast-mention-alerts): where your brand is said in new podcast episodes, with the exact second.
- [News Brand Mentions Monitor: New Articles Only](https://apify.com/offerastudio/news-brand-mentions-monitor): new news articles about your brand, people or topics.
- [YouTube Channel Monitor: New Videos & Growth](https://apify.com/offerastudio/youtube-channel-monitor): new videos and view growth of the channels you watch.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.
- [US Product Recalls Monitor: FDA & CPSC Feed](https://apify.com/offerastudio/us-product-recalls-monitor): FDA and CPSC recalls in one feed, with severity.
- [EU Tenders Feed: TED Public Procurement Alerts](https://apify.com/offerastudio/eu-tender-feed): EU public tenders from TED with CPV, country and value filters.
- [Liquor License Openings: New Bars & Stores (US)](https://apify.com/offerastudio/liquor-license-openings): new US liquor licences from official state open data.
- [Clinical Trials Change Monitor: Status & Updates](https://apify.com/offerastudio/clinicaltrials-change-monitor): status, enrollment and results changes on ClinicalTrials.gov studies.
- [Career Site Jobs Monitor: ATS Jobs & New Roles](https://apify.com/offerastudio/career-site-jobs-monitor): open roles from company career sites, with new and closed roles since the last run.
- [App Reviews Monitor: App Store & Google Play](https://apify.com/offerastudio/app-store-reviews-monitor): app reviews from both stores, only new ones in monitor mode.
- [US Federal Contracts Feed: SAM.gov & USAspending](https://apify.com/offerastudio/us-federal-contracts-feed): SAM.gov contract opportunities with the buyer's award history.
- [Grants.gov Opportunities: US Federal Grants Feed](https://apify.com/offerastudio/grants-gov-opportunities): US federal grant opportunities by keyword, eligibility and agency.
- [Federal Register Monitor: US Rules & Notices Feed](https://apify.com/offerastudio/federal-register-monitor): new US rules, proposed rules and notices by agency or topic.
- [B2B Sales Trigger Feed: Hiring + Tech Leads](https://apify.com/offerastudio/b2b-sales-trigger-feed): companies hiring for a role and using (or not using) a technology, with contacts.
- [Local Business Leads: OpenStreetMap, No Website](https://apify.com/offerastudio/local-business-leads-osm): local businesses by city and category, including those with no website.
- [Solana Token Pair Monitor: New & Trending Pairs](https://apify.com/offerastudio/solana-token-pair-monitor): new and trending Solana pairs with liquidity, volume and safety flags.

### Feedback

Missing a country's national check digits or a bank-code file with an open licence? Open an issue on the **Issues** tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/iban-bank-validator/changelog.md

# Actor input Schema

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

Up to 10,000 IBANs, one per line. Spaces, dots and dashes are ignored; lower case is fine. You can also paste a comma- or semicolon-separated list. Duplicates are checked once.

## `lookupBank` (type: `boolean`):

Add bank name and BIC for valid IBANs from DE, AT, CH and LI (official open bank-code files bundled with the Actor). For other countries the bank code is returned and the bank name is marked as not available. Free either way.

## Actor input object example

```json
{
  "ibans": [
    "DE89 3704 0044 0532 0130 00",
    "AT61 1904 3002 3457 3201",
    "CH93 0076 2011 6238 5295 7",
    "FR14 2004 1010 0505 0001 3M02 606",
    "GB29 NWBK 6016 1331 9268 19",
    "NL91 ABNA 0417 1643 00",
    "ES91 2100 0418 4502 0005 1332",
    "DE89 3704 0044 0532 0130 01"
  ],
  "lookupBank": true
}
```

# Actor output Schema

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

No description

## `banks` (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": [
        "DE89 3704 0044 0532 0130 00",
        "AT61 1904 3002 3457 3201",
        "CH93 0076 2011 6238 5295 7",
        "FR14 2004 1010 0505 0001 3M02 606",
        "GB29 NWBK 6016 1331 9268 19",
        "NL91 ABNA 0417 1643 00",
        "ES91 2100 0418 4502 0005 1332",
        "DE89 3704 0044 0532 0130 01"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/iban-bank-validator").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": [
        "DE89 3704 0044 0532 0130 00",
        "AT61 1904 3002 3457 3201",
        "CH93 0076 2011 6238 5295 7",
        "FR14 2004 1010 0505 0001 3M02 606",
        "GB29 NWBK 6016 1331 9268 19",
        "NL91 ABNA 0417 1643 00",
        "ES91 2100 0418 4502 0005 1332",
        "DE89 3704 0044 0532 0130 01",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/iban-bank-validator").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": [
    "DE89 3704 0044 0532 0130 00",
    "AT61 1904 3002 3457 3201",
    "CH93 0076 2011 6238 5295 7",
    "FR14 2004 1010 0505 0001 3M02 606",
    "GB29 NWBK 6016 1331 9268 19",
    "NL91 ABNA 0417 1643 00",
    "ES91 2100 0418 4502 0005 1332",
    "DE89 3704 0044 0532 0130 01"
  ]
}' |
apify call offerastudio/iban-bank-validator --silent --output-dataset

```

## MCP server setup

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

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/ITGJvhF5UbXR9FJCN/builds/EltsQvHoVGec8oa1U/openapi.json
