Skip to content
IBANforge

Recipes — validate an IBAN in your stack

Create a free key without an email address. It normally provides 25 requests per month; read monthly_limit in the response. Claiming the same key with a code sent to an address you choose raises it to 200 per month. Store api_key in your secret manager: do not create a new key for every call.

curl -X POST https://api.ibanforge.com/v1/keys/generate

These recipes send an IBAN to the API to check its format and read available bank information. A missing bank or an unknown verdict does not validate the account. The check proves neither account existence nor ownership. First-call guide.

Python

IBANFORGE_API_KEY = api_key saved in the previous step, in a server-side environment variable.

With the official SDK (pip install ibanforge):

import os
from ibanforge import IBANforge
 
with IBANforge(api_key=os.environ["IBANFORGE_API_KEY"]) as client:
    result = client.validate_iban("DE89370400440532013000")
    print(result["valid"])
    print(result.get("bank_code_check"))
    print(result.get("bic"))

Or plain requests:

import requests
 
r = requests.post(
    "https://api.ibanforge.com/v1/iban/validate",
    json={"iban": "DE89370400440532013000"},
    headers={"Authorization": "Bearer ifk_your_key"},
    timeout=15,
)
data = r.json()
print(data["valid"], data["bank_code_check"]["status"])  # True verified

Node.js / TypeScript

Native fetch, no dependency:

const res = await fetch("https://api.ibanforge.com/v1/iban/validate", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer ifk_your_key",
  },
  body: JSON.stringify({ iban: "DE89370400440532013000" }),
});
const data = await res.json();
console.log(data.valid, data.bic?.code, data.bank_code_check?.status);
// true COBADEFFXXX verified

The official SDK (npm install @ibanforge/sdk) wraps the same call with types.

PHP

No extension needed beyond what ships with PHP:

<?php
$payload = json_encode(["iban" => "DE89370400440532013000"]);
$ctx = stream_context_create(["http" => [
    "method"  => "POST",
    "header"  => "Content-Type: application/json\r\nAuthorization: Bearer ifk_your_key",
    "content" => $payload,
    "timeout" => 15,
]]);
$data = json_decode(file_get_contents(
    "https://api.ibanforge.com/v1/iban/validate", false, $ctx), true);
echo $data["valid"] ? "valid" : "invalid", " — ",
     $data["bank_code_check"]["status"] ?? "n/a", PHP_EOL;
// valid — verified

Java

The official Java SDK (Java 17+, Jackson only) mirrors the TypeScript client method for method. It is on Maven Central: depend on com.ibanforge:ibanforge-sdk:1.5.0.

IBANforge client = IBANforge.builder().apiKey(System.getenv("IBANFORGE_API_KEY")).build();
IBANValidationResult r = client.validateIban("DE89 3704 0044 0532 0130 00");
System.out.println(r.valid() + " " + r.bic().code() + " " + r.bankCodeCheck().status());

Errors are typed under IBANforgeException: PaymentRequiredException (402, the x402 challenge in accepts), RateLimitException, InvalidInputException, ApiException. client.formatIban(...) and the other free routes need no key. README and the full method table.

C# / .NET

The official .NET SDK (net8.0, no dependency beyond the framework) exposes the same methods as async calls. Install IBANforge.Sdk 1.5.0 from NuGet:

dotnet add package IBANforge.Sdk --version 1.5.0
using var client = new IBANforgeClient(new IBANforgeOptions { ApiKey = Environment.GetEnvironmentVariable("IBANFORGE_API_KEY") });
var r = await client.ValidateIbanAsync("DE89 3704 0044 0532 0130 00");
Console.WriteLine($"{r.Valid} {r.Bic?.Code} {r.BankCodeCheck?.Status}");

Pass your own HttpClient (IHttpClientFactory) to the constructor when you have one; exceptions mirror the Java and TypeScript hierarchy. README.

Google Sheets

Use the official functions: they keep the key in your user properties and send columns in batches, without putting a key in a cell.

  1. Download the three Apps Script files and unzip them. In a test spreadsheet, open Extensions → Apps Script.
  2. Replace Code.gs, add an HTML file named Sidebar and paste Sidebar.html. In project settings, show appsscript.json and replace its content with the supplied manifest. Save.
  3. Run ibfShowSidebar in the editor and authorize the script. Return to the spreadsheet and save your key in the sidebar, never in a cell.
  4. Import these two test IBANs into column A through File → Import. They are a public documentation example and its invalid-checksum variant, not accounts to pay. Enter =IBAN_CHECK(A2:A3) in B2 and leave five columns empty.
  5. Check both rows: TRUE for the first format, FALSE for the second. Then read bank, BIC, bank-code verdict and SEPA. Missing fields are not payment approval.

Two IBANs consume two quota units, not one billable call. Cached results may avoid a new request for six hours; cache retention is not guaranteed. Manual installation; this download is not a Google Workspace Marketplace listing. All functions and limits.

n8n

First test on n8n Cloud or self-hosted n8n

  1. Download the workflow JSON and choose Import from File in the n8n workflow menu. It only contains two built-in nodes: Manual Trigger and HTTP Request. No extension or key is included.
  2. Open Contrôler l’exemple de documentation: POST to /v1/iban/validate, JSON body with public example DE89370400440532013000. Execute manually once.
  3. Check that output contains valid, bank_code_check and available sources. The workflow performs no payment or downstream action. HTTP errors, exhausted quota and timeouts stop the step.
  4. For your own key quota, choose Generic Credential Type → Header Auth in the HTTP node: name Authorization, value Bearer followed by your key. Store the key in credentials, never in exported JSON.

The keyless test uses the REST allowance described in the onboarding guide, shared by network address. n8n Cloud users may share an address; configure your key if its allowance is exhausted. Import a workflow · HTTP Request options.

Community extension for self-hosted n8n

The published package n8n-nodes-ibanforge@0.1.1 supports IBAN validation, BIC lookup, Swiss clearing and bank-level compliance pre-checks. This recipe is for self-hosted n8n, with an owner or admin account. Installing a package from npm is not available on n8n Cloud; Cloud requires a verified listing. See n8n's installation guide.

  1. Open Settings → Community nodes → Install and enter n8n-nodes-ibanforge@0.1.1.
  2. Get a free API key (25 requests/month without email, 200 after claiming, no card). In a new workflow, connect Manual Trigger to IBANforge and paste the key into an IBANforge API credential.
  3. Select Validate IBAN, enter the documentation example DE89370400440532013000, then execute the step.
  4. Inspect the JSON output: valid should be true for this example, bank_code_check reports the register result, and bic identifies the bank when available. A completed operation returning these fields proves the first API call; a green credential test alone does not.

In version 0.1.1, the credential test calls the public /v1/demo endpoint, which does not verify the key. Check the actual Validate IBAN result before using the workflow. Neither format validity nor a bank match proves that the account exists or belongs to a named beneficiary.

For a manual installation, run the following as the n8n service user, inside its container if applicable, then restart n8n:

mkdir -p ~/.n8n/nodes
cd ~/.n8n/nodes
npm install n8n-nodes-ibanforge@0.1.1

The node handles each incoming item separately; it has no batch operation. A list of 100 items can therefore consume 100 requests. Manual installation details.

Odoo

The public Odoo module, version 18.0.1.0.0 (AGPL-3), fills the BIC and bank name when the API can resolve them. It requires Odoo 18 with support for custom Python modules, on your own server or Odoo.sh. Odoo Online does not support these modules. This installation uses the source repository and does not depend on an Odoo Apps listing.

On your own Odoo server, clone the repository into a directory of your choice:

git clone --branch 18.0 --single-branch https://github.com/cammac-creator/ibanforge-odoo.git /path/to/ibanforge-odoo

Add /path/to/ibanforge-odoo to Odoo's existing addons_path list, keeping the other entries. The module is its child directory: the manifest must be at /path/to/ibanforge-odoo/ibanforge_bank_autofill/manifest.py. Alternatively, copy only that ibanforge_bank_autofill directory into an already configured addons directory. Ensure the Python requests library is available in Odoo's environment. On Odoo.sh, add that module directory to your project using the custom-module procedure.

  1. Restart Odoo, enable developer mode and update the apps list. Remove the default Apps filter if needed, then install IBANforge Bank Auto-fill (ibanforge_bank_autofill).
  2. Open Settings → IBANforge, paste your API key and save the settings. Keep the default API address. Without a key, the module makes no network calls.
  3. In a test database, create a partner bank account using DE89370400440532013000. Leave the bank field empty, enter the IBAN, then leave the field. Check the detected bank/BIC or the linked bank, save, and reopen the account to confirm that the bank link was kept.

An unavailable API or a missing BIC leaves automatic filling inactive; it does not block saving. Odoo's own base_iban still validates the IBAN format. At save time, a bank already set on the account is preserved. Entering and saving a new account can use two API calls, so 200 monthly requests do not mean 200 manually entered accounts. The IBAN is sent to the configured API; the result does not establish account ownership. Module behavior and limitations.

AI agents (MCP)

Remote MCP: add https://api.ibanforge.com/mcp in a compatible client. For a local process:

npx -y ibanforge-mcp

Or the hosted transport, no install: https://api.ibanforge.com/mcp — it answers 25 free tool calls a week per source address with no key at all (ISO week in UTC, reset on Monday 00:00 UTC), which is the fastest way for an assistant to evaluate the data before you commit to anything.

What you get back

The response the recipes print (production answer, abridged):

{
  "valid": true,
  "bic": { "code": "COBADEFFXXX", "bank_name": "Commerzbank", "city": "Köln" },
  "bank_code_check": {
    "value": "37040044",
    "status": "verified",
    "register": "Deutsche Bundesbank Bankleitzahlendatei",
    "authoritative": true,
    "as_of": "2026-08"
  }
}

authoritative: true means the national register itself answered. Fields the data cannot support are null, never guessed — the full semantics explain what verified does and does not promise.

Related: What "verified" means · IBAN to BIC · Test IBAN generator · Data sources

Put these checks to work

Choose a first step for your software or your supplier file.

Integrate IBAN checks into your software

Try a validation, inspect the response, then connect your application through the API or an existing integration.

Explore the API workflow

Check a supplier file

Upload a CSV or Excel file and preview the findings for free. Purchase the annotated workbook if you need the full report. No account or subscription required.

Explore the file audit

Available bank information varies by country and source. These checks do not confirm the account holder or guarantee that a payment will succeed.