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/generateThese 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 verifiedNode.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 verifiedThe 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 — verifiedJava
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.0using 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.
- Download the three Apps Script files and unzip them. In a test spreadsheet, open Extensions → Apps Script.
- Replace
Code.gs, add an HTML file namedSidebarand pasteSidebar.html. In project settings, showappsscript.jsonand replace its content with the supplied manifest. Save. - Run
ibfShowSidebarin the editor and authorize the script. Return to the spreadsheet and save your key in the sidebar, never in a cell. - 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. - Check both rows:
TRUEfor the first format,FALSEfor 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
- 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.
- Open Contrôler l’exemple de documentation: POST to
/v1/iban/validate, JSON body with public exampleDE89370400440532013000. Execute manually once. - Check that output contains
valid,bank_code_checkand available sources. The workflow performs no payment or downstream action. HTTP errors, exhausted quota and timeouts stop the step. - For your own key quota, choose Generic Credential Type → Header Auth in the HTTP node: name
Authorization, valueBearerfollowed 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.
- Open Settings → Community nodes → Install and enter
n8n-nodes-ibanforge@0.1.1. - 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.
- Select Validate IBAN, enter the documentation example
DE89370400440532013000, then execute the step. - Inspect the JSON output:
validshould betruefor this example,bank_code_checkreports the register result, andbicidentifies 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.1The 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-odooAdd /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.
- 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). - 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.
- 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-mcpOr 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 workflowCheck 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 auditAvailable bank information varies by country and source. These checks do not confirm the account holder or guarantee that a payment will succeed.