IBAN Validator & BIC Lookup API: Bank Code, Country, SEPA avatar

IBAN Validator & BIC Lookup API: Bank Code, Country, SEPA

Pricing

from $1.70 / 1,000 valid ibans

Go to Apify Store
IBAN Validator & BIC Lookup API: Bank Code, Country, SEPA

IBAN Validator & BIC Lookup API: Bank Code, Country, SEPA

Bulk IBAN validation: length, mod-97 check digits, country structure and national keys, plus bank code, account number, BIC and bank name from open registries. Invalid IBANs flagged free. No API key, no login. MCP-ready for AI agents. Pay per valid IBAN, no monthly rental. $2 per 1,000 IBANs.

Pricing

from $1.70 / 1,000 valid ibans

Rating

0.0

(0)

Developer

ABM

ABM

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

$2 per 1,000 valid IBANs. Invalid, empty and duplicate values are free. No API key, no login, no monthly rental.

Validate IBANs in bulk before you send SEPA transfers, payroll or supplier payments. For every IBAN this Actor checks:

  • Length for the country (e.g. 22 for Germany, 27 for France)
  • Check digits (ISO 13616 modulo 97)
  • Country BBAN structure (which positions must be letters or digits)
  • National check digits inside the BBAN when the country has them (French RIB key, Spanish, Italian CIN, Belgian, Norwegian, Polish keys…)

Then it extracts the country, bank code, branch code, account number and adds the BIC (SWIFT code) and bank name from the open national bank registries (Bundesbank, Banque de France, SIX, National Bank of Belgium, and ~40 more).

Everything is computed offline inside the Actor: no third-party API, no rate limit, no IBAN sent anywhere else. 100,000 IBANs take about a minute.

How much does it cost?

You pay $0.002 per valid IBAN (event iban-validated), which is $2 per 1,000 valid IBANs.

You sendValidInvalid / duplicatesYou pay
1,000 supplier IBANs97030970 × $0.002 = $1.94
10,000 employee IBANs9,900100$19.80
3 IBANs (test)30$0.006

Invalid IBANs are still returned in the dataset with the exact reason, free of charge. If you set a maximum cost per run, the Actor stops cleanly when the budget is reached.

Input

{
"ibans": [
"DE89370400440532013000",
"fr76 3000 6000 0112 3456 7890 189",
"GB82WEST12345698765432",
"DE89370400440532013001"
],
"validateNationalChecksum": true,
"deduplicate": true
}
FieldTypeDescription
ibansarray of stringsIBANs, one per item. Spaces, dashes, lowercase and an IBAN prefix are accepted. A single string with IBANs separated by new lines, commas or semicolons also works when calling the API.
ibansTextstringAlternative: paste an Excel column or CSV text (separated by new lines, commas, semicolons or tabs).
validateNationalChecksumboolean (default true)Also verify the domestic check digits inside the BBAN.
deduplicateboolean (default true)Return and charge each IBAN only once.

Up to 100,000 IBANs per run.

Output

One object per IBAN in the dataset:

{
"input": "DE89370400440532013000",
"position": 1,
"iban": "DE89370400440532013000",
"ibanFormatted": "DE89 3704 0044 0532 0130 00",
"isValid": true,
"errorCode": null,
"errorMessage": null,
"countryCode": "DE",
"countryName": "Germany",
"isSepaCountry": true,
"checkDigits": "89",
"bban": "370400440532013000",
"length": 22,
"expectedLength": 22,
"bankCode": "37040044",
"branchCode": null,
"accountNumber": "0532013000",
"nationalCheckDigits": null,
"currencyCode": "EUR",
"bic": "COBADEFFXXX",
"bankName": "Commerzbank",
"bankShortName": "Commerzbank Köln",
"bicFound": true,
"nationalChecksumVerified": true,
"charged": true,
"checkedAt": "2026-10-22T08:00:00+00:00"
}

An invalid IBAN (free):

{
"input": "DE89370400440532013001",
"position": 4,
"iban": "DE89370400440532013001",
"isValid": false,
"errorCode": "INVALID_CHECKSUM",
"errorMessage": "Check digits (mod 97) do not match: probably a typo. (Invalid checksum digits)",
"countryCode": "DE",
"length": 22,
"expectedLength": 22,
"bic": null,
"charged": false
}

Error codes: EMPTY, INVALID_CHARACTERS, INVALID_COUNTRY_CODE, INVALID_LENGTH, INVALID_STRUCTURE, INVALID_CHECKSUM, INVALID_NATIONAL_CHECKSUM, INVALID_BANK_CODE, INVALID_BRANCH_CODE, INVALID_ACCOUNT_CODE, INVALID.

A run summary (counts, error codes, list of invalid IBANs) is saved in the key-value store under SUMMARY and linked in the run's Output tab.

Use cases

1. Payroll: check employee IBANs before the monthly SEPA file

Who: payroll manager of a 2,400-employee company paying salaries in France, Spain and Germany. Input:

{ "ibansText": "FR7630006000011234567890189\nES9121000418450200051332\nDE89370400440532013000\nFR7630006000011234567890188", "validateNationalChecksum": true }

Output (extract):

[
{ "iban": "FR7630006000011234567890189", "isValid": true, "bankCode": "30006", "branchCode": "00001", "bic": "AGRIFRPPXXX" },
{ "iban": "FR7630006000011234567890188", "isValid": false, "errorCode": "INVALID_CHECKSUM" }
]

Then: the 3–5 invalid IBANs of the month are sent back to HR before the payment file is generated, avoiding rejected transfers (R-transactions cost €5–€15 each at most banks). Cost: 2,400 × $0.002 = $4.80 per month.

2. Accounts payable: clean the supplier master data and fill missing BICs

Who: AP team in a mid-size distributor with 6,000 suppliers exported from the ERP. Input:

{ "ibans": ["NL91ABNA0417164300", "BE68539007547034", "IT60X0542811101000000123456", "AT611904300234573201"] }

Output (extract):

[
{ "iban": "NL91ABNA0417164300", "isValid": true, "bic": "ABNANL2AXXX", "bankName": "ABN AMRO BANK N.V." },
{ "iban": "IT60X0542811101000000123456", "isValid": true, "bankCode": "05428", "branchCode": "11101", "nationalCheckDigits": "X" }
]

Then: the result is exported to CSV and re-imported in the ERP: the BIC column is filled for every bank found in the registries, invalid IBANs are flagged for the supplier onboarding team. 6,000 IBANs = $12, done in seconds.

3. Fintech / marketplace onboarding: validate payout IBANs in real time

Who: a marketplace that pays sellers in 15 European countries, calling the Actor from its onboarding backend. Input:

{ "ibans": ["PL61109010140000071219812874"], "deduplicate": true }

Output (extract):

[{ "iban": "PL61109010140000071219812874", "isValid": true, "countryCode": "PL", "isSepaCountry": true, "bankCode": "10901014", "bic": "WBKPPLPPXXX" }]

Then: the seller form refuses wrong IBANs immediately and shows the bank name for confirmation ("Is your bank Santander Bank Polska?"). At 20,000 sign-ups per month = $40.

Call it from the API

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<USERNAME>/iban-validator-bic-lookup").call(run_input={
"ibans": ["DE89370400440532013000", "GB82WEST12345698765432"],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["iban"], item["isValid"], item["bic"], item["errorMessage"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('<USERNAME>/iban-validator-bic-lookup').call({
ibans: ['DE89370400440532013000', 'GB82WEST12345698765432'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((i) => !i.isValid));

Synchronous HTTP (one call, JSON back):

POST https://api.apify.com/v2/acts/<USERNAME>~iban-validator-bic-lookup/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>
{"ibans": ["DE89370400440532013000"]}

Automation (Make, n8n, Zapier, Google Sheets)

Example with n8n or Make: every day at 7:00, read the "New suppliers" Google Sheet → run this Actor with the IBAN column in ibansText → write isValid, bic and errorMessage back to the sheet → send a Slack message to AP for each row where isValid is false. In Zapier, use the Apify app "Run Actor" action with the same input. Results can also be exported directly from the dataset as CSV, Excel, JSON or XML.

Use with AI agents (MCP)

The Actor is available through the Apify MCP server, so Claude, Cursor, ChatGPT and other AI agents can call it as a tool: "Check these 40 IBANs and tell me which ones will be rejected". The output is flat JSON with explicit isValid, errorCode and errorMessage fields, easy for an LLM to reason about.

FAQ

Does it check that the account really exists? No. Nobody can do that without access to the bank. It proves the IBAN is well-formed, has correct check digits and a bank code consistent with the country. This catches typos and most copy-paste errors, which are the main cause of rejected SEPA transfers.

Where does the BIC come from? From the open bank registries published by national central banks and payment associations, bundled in the Actor. When the bank is not in a registry, bic is null and bicFound is false; the IBAN is still validated (and charged).

Are my IBANs sent to a third party? No. Validation and BIC lookup run inside the Actor, no external request is made.

Which countries are supported? All ~90 countries that use IBAN (SWIFT IBAN registry). BIC/bank name lookup covers about 45 countries, mostly in Europe (DE, FR, GB, ES, IT, NL, BE, AT, CH, PL, SE, NO, DK, FI, PT, IE, LU, CZ, SK, HU, RO, BG, HR, SI, LT, LV, EE…).

Why was I not charged for some rows? Only valid IBANs are charged. Invalid, empty and duplicate values are free.

Limits

  • A valid IBAN does not guarantee that the account is open or belongs to the expected person (use Verification of Payee / SEPA name-check for that).
  • BIC lookup depends on the national registry coverage; for some banks (and most non-European countries) bic is null.
  • National check digits are verified only for countries that define them.
  • 100,000 IBANs per run; split bigger files into several runs.