# OpenIBAN IBAN Validator — Bulk IBAN Checker (`devilscrapes/openiban-iban-validator-scraper`) Actor

Bulk IBAN validation against the free, keyless openiban.com API. Feed IBANs in any common format and get one row back per IBAN: checksum validity, bank-code and BIC enrichment where available, and the messages explaining any failure — built for whole-list AP/AR and KYC batch checks.

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

## Pricing

Pay per event

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

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## OpenIBAN IBAN Validator (Bulk)

**💰 $1.20 / 1 000 IBANs checked**  ·  pay only for results  ·  no credit card to try

*We do the dirty work so your dataset stays clean.* 😈

Bulk-validate IBANs against the free, keyless openiban.com REST API. Feed IBANs in any common format (glued or spaced) and get one row back per IBAN: checksum validity, bank-code/BIC enrichment where available, and the raw messages explaining any failure.

</div>

***

### 🎯 What this scrapes

A customer hands us a list of IBANs — mixed formatting, mixed countries — and we return one row per IBAN: checksum validity, bank-code validation result, bank name/BIC where the free openiban.com directory has it, and the raw `messages[]` explaining which of two failure modes hit (bad checksum vs. unresolved bank code). Built for a recurring fintech/payments/AP-AR/KYC batch job against a whole customer list, not a one-off lookup: one bad IBAN never fails a 5,000-row batch.

### 🔥 What we handle for you

- 🧾 **Any common IBAN format, one clean value** — glued (`DE89370400440532013000`) or spaced (`DE89 3704 0044 0532 0130 00`) both normalize before we ever call openiban.
- 🧱 **Bounded, polite concurrency** — openiban is a free, shared keyless service, so we cap in-flight requests and back off automatically on `429`/`5xx` instead of hammering it.
- ✅ **Clean negatives are not errors** — an invalid IBAN is a normal, useful answer. Every entry — valid, cleanly invalid, or unparseable — lands as its own row with a clear status, so one bad IBAN never fails your whole batch.
- 🔍 **Two failure modes, disambiguated** — `messages[]` passes through verbatim so you can tell a bad checksum apart from an unresolved bank code, instead of a single flattened boolean.
- 🧊 **Typed, validated dataset rows** — Pydantic-checked, one row per requested IBAN, every time — the row count you get back always matches the row count you sent in.
- 💰 **Pay-Per-Event pricing** — priced for volume, not per-lookup margin. You always know what a batch costs before you run it.

### 💡 Use cases

- Payment/AP-AR teams — validate a beneficiary's IBAN before a wire transfer to avoid a bounced payment.
- Compliance/KYC onboarding — batch-check IBANs on file as part of a customer onboarding sweep.
- ERP/accounting pipeline enrichment — attach bank name and BIC to existing vendor or customer records.
- Data-quality cleanup — find and flag malformed IBANs sitting in a spreadsheet or CRM export.

### ⚙️ How to use it

1. Click **Try for free** at the top of the page.
2. Fill in the input form — most fields have sensible defaults.
3. Click **Start**. Output streams into the run's dataset.
4. Export from **Storage → Dataset** as JSON, CSV, or Excel — or fetch via the API.

### 📥 Input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `ibans` | `array` | **yes** | — | IBANs to validate, one per list item. Whitespace is stripped before use. |
| `maxConcurrency` | `integer` | no | 3 | Cap on concurrent requests to openiban.com. Kept low by design — a free, shared keyless service. |
| `proxyConfiguration` | `object` | no | {} | Apify Proxy configuration. Present per org standard — openiban.com is a public keyless API, so no proxy is used unless you explicitly enable one here. |

#### Example input

```json
{
  "ibans": [
    "DE89 3704 0044 0532 0130 00",
    "DE89370400440532013001",
    "NL91ABNA0417164300"
  ],
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

### 📤 Output

Every row is one dataset item.

| Field | Type | Notes |
|---|---|---|
| `iban` | `string` | Normalised input (whitespace stripped, uppercased); also the path value used. |
| `valid` | `boolean` | openiban `valid`. Conflates checksum + bank-code validation. Null only for skipped rows. |
| `bankCode` | `string` | openiban `bankData.bankCode`; empty string normalised to null. |
| `bankName` | `string` | openiban `bankData.name`; empty string normalised to null. |
| `bic` | `string` | openiban `bankData.bic`, when present. |
| `bankCity` | `string` | openiban `bankData.city`, when present. |
| `bankZip` | `string` | openiban `bankData.zip`, when present. |
| `bankCodeValid` | `boolean` | openiban `checkResults.bankCode`, when present. |
| `messages` | `array` | openiban `messages[]` verbatim — the only field that disambiguates checksum vs. bank-code failure. Never null. |
| `skipped` | `boolean` | True only for empty input or unrecoverable transport/parse failure. |
| `skipReason` | `string` | Set only when `skipped` is true. |

#### Example output

```json
{
  "iban": "DE89370400440532013000",
  "valid": true,
  "bankCode": "37040044",
  "bankName": "Commerzbank",
  "bic": "COBADEFFXXX",
  "bankCity": "Köln",
  "bankZip": "50447",
  "bankCodeValid": true,
  "messages": ["Bank code valid: 37040044"],
  "skipped": false,
  "skipReason": null
}
```

### 💰 Pricing

Pay-Per-Event — you pay only when these events fire:

| Event | USD | What it is |
|---|---:|---|
| `actor-start` | $0.20 | One-off warm-up charge per run |
| `iban-checked` | $0.001 | Charged once per input IBAN processed |

Example: 1 000 IBANs checked at the rates above ≈ **$1.20**. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.

### 🚧 Limitations

- Bank-directory enrichment (bank name, BIC, city, ZIP) is confirmed for DE and NL only. AT, CH, and BE are unconfirmed — we neither claim support nor absence. FR, GB, ES, IT, and PL are confirmed checksum-only (no bank-directory match).
- Checksum validation itself works across all IBAN-format countries — the enrichment gap above only affects the bank-directory fields.
- Concurrency is capped at 5 requests in flight by design — openiban.com is a free, shared keyless service.
- No caching or dedup of previously-seen IBANs across runs — every run re-checks every IBAN you send.
- openiban.com is a free, single-maintainer service — its uptime and rate-limit posture aren't contractually guaranteed.

### ❓ FAQ

**Why is `valid` sometimes `false` even though the IBAN's checksum is fine?**

`valid` reflects both checksum AND bank-code/BIC validation. An IBAN can have a perfect checksum but still come back `valid: false` if its bank code doesn't resolve — check `messages[]` on that row to see exactly which check failed.

**Is an invalid IBAN a failed run?**

No. An IBAN openiban reports as invalid is a normal, useful answer — the run still succeeds, and that row simply says `valid: false` with an explanation in `messages[]`.

**What happens if one IBAN in my batch is malformed?**

It's still sent to openiban and comes back as its own row with `valid: false` and a `messages[]` entry explaining why — the rest of your batch is processed normally. Only a genuinely empty entry, or a request that fails after retries, is marked `skipped: true`.

**Does this actor call a paid IBAN-validation service?**

No — openiban.com is free and keyless. We don't add a markup for data access; you're paying for bulk throughput, retry/backoff handling, and clean, typed dataset rows.

### 💬 Your feedback

Spotted a bug, hit a weird edge case, or need a new field? Open an
issue on the Actor's **Issues** tab on Apify Console — we ship
fixes weekly and we read every report.

***

<div align="center">

Built by **[Devil Scrapes](https://apify.com/DevilScrapes)** 😈 — a small fleet of
opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

</div>

# Actor input Schema

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

IBANs to validate, one per list item. Whitespace is stripped before use, so <code>"DE89 3704 0044 0532 0130 00"</code> is accepted alongside glued strings.

## `maxConcurrency` (type: `integer`):

Cap on concurrent requests to openiban.com. Kept low by design — a free, shared keyless service.

## `proxyConfiguration` (type: `object`):

Apify Proxy configuration. Present per org standard — openiban.com is a public keyless API, so no proxy is used unless you explicitly enable one here.

## Actor input object example

```json
{
  "ibans": [
    "DE89 3704 0044 0532 0130 00",
    "DE89370400440532013001",
    "NL91ABNA0417164300"
  ],
  "maxConcurrency": 3,
  "proxyConfiguration": {}
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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",
        "DE89370400440532013001",
        "NL91ABNA0417164300"
    ],
    "maxConcurrency": 3,
    "proxyConfiguration": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/openiban-iban-validator-scraper").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",
        "DE89370400440532013001",
        "NL91ABNA0417164300",
    ],
    "maxConcurrency": 3,
    "proxyConfiguration": {},
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/openiban-iban-validator-scraper").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",
    "DE89370400440532013001",
    "NL91ABNA0417164300"
  ],
  "maxConcurrency": 3,
  "proxyConfiguration": {}
}' |
apify call devilscrapes/openiban-iban-validator-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/Jutd3iHud3HaKPM4B/builds/SYPiDjV30nxcFW1EC/openapi.json
