Skip to content
IBANforge

Batch Validate

Validate up to 100 IBANs in a single API call. Each IBAN is processed independently — one invalid IBAN does not affect the others. Paid per call in USDC via x402, an IBAN costs $0.002 in a batch instead of $0.005 on its own; on an API key or a credit pack, each IBAN uses one request or credit, the same as a single validation.

Endpoint

POST https://api.ibanforge.com/v1/iban/batch

Cost: $0.002 USDC per IBAN via x402 (e.g. 10 IBANs = $0.020, 100 IBANs = $0.200). On an API key, a batch debits 1 request / 1 prepaid credit per IBAN — free tier and credit packs alike. If the batch exceeds your remaining allowance, the API refuses it all-or-nothing with a 402 naming the shortfall (X-Credits-Required / X-Quota-Required headers); nothing is consumed.

Request

Headers

HeaderValueRequired
Content-Typeapplication/jsonYes
AuthorizationBearer ifk_... (free API key)One of the two
X-PAYMENTx402 payment tokenOne of the two

Body

{
  "ibans": [
    "CH10 0023 0000 0000 1234 5",
    "DE89 3704 0044 0532 0130 00",
    "INVALID123"
  ]
}
FieldTypeDescription
ibansstring[]Array of IBANs to validate. 1 to 100 items.

Response

Success (200)

{
  "results": [
    {
      "iban": "CH1000230000000012345",
      "valid": true,
      "country": { "code": "CH", "name": "Switzerland" },
      "check_digits": "10",
      "bban": { "bank_code": "00230", "account_number": "000000012345" },
      "bic": { "code": "UBSWCHZH80A", "bic8": "UBSWCHZH", "bank_name": "UBS Switzerland AG", "city": "Zürich" },
      "sepa": { "member": true, "schemes": ["SCT", "SDD"], "vop_required": false },
      "issuer": { "type": "bank", "name": "UBS Switzerland AG" },
      "risk_indicators": {
        "issuer_type": "bank",
        "country_risk": "standard",
        "test_bic": false,
        "sepa_reachable": true,
        "vop_coverage": false
      },
      "clearing": {
        "iid": "00230",
        "name": "UBS Switzerland AG",
        "type": "bank",
        "town": "Zürich",
        "sic": true,
        "instant_payments_chf": true,
        "eurosic": true,
        "qr_iid": null
      },
      "formatted": "CH10 0023 0000 0000 1234 5",
      "cost_usdc": 0.002
    },
    {
      "iban": "DE89370400440532013000",
      "valid": true,
      "country": { "code": "DE", "name": "Germany" },
      "check_digits": "89",
      "bban": { "bank_code": "37040044", "account_number": "0532013000" },
      "bic": { "code": "COBADEFFXXX", "bank_name": "Commerzbank", "city": "Köln" },
      "sepa": { "member": true, "schemes": ["SCT", "SDD", "SCT_INST"], "vop_required": true },
      "issuer": { "type": "bank", "name": "Commerzbank" },
      "risk_indicators": {
        "issuer_type": "bank",
        "country_risk": "standard",
        "test_bic": false,
        "sepa_reachable": true,
        "vop_coverage": true
      },
      "formatted": "DE89 3704 0044 0532 0130 00",
      "cost_usdc": 0.002
    },
    {
      "iban": "INVALID123",
      "valid": false,
      "error": "unsupported_country",
      "error_detail": "Country code 'IN' is not a recognized IBAN country.",
      "cost_usdc": 0.002
    }
  ],
  "count": 3,
  "valid_count": 2,
  "cost_usdc": 0.006,
  "processing_ms": 1.05
}

Response fields

Top-level:

FieldTypeDescription
resultsarrayArray of validation results, same order as input
countnumberTotal IBANs processed
valid_countnumberCount of valid IBANs
cost_usdcnumberTotal cost for this batch
processing_msnumberTotal processing time

Each item in results has the same structure as the single validation response, including sepa, issuer, and risk_indicators for valid IBANs.

Errors

StatusCodeDescription
400empty_batchThe ibans array is empty
400batch_too_largeMore than 100 IBANs submitted
400invalid_requestRequest body is not valid JSON or missing ibans field

Code examples

cURL

curl -X POST https://api.ibanforge.com/v1/iban/batch \
  -H "Content-Type: application/json" \
  -d '{
    "ibans": [
      "CH1000230000000012345",
      "DE89370400440532013000",
      "FR7630006000011234567890189"
    ]
  }'

Python

import requests
 
response = requests.post(
    "https://api.ibanforge.com/v1/iban/batch",
    json={
        "ibans": [
            "CH1000230000000012345",
            "DE89370400440532013000",
            "FR7630006000011234567890189",
        ]
    },
)
 
data = response.json()
print(f"Valid: {data['valid_count']}/{data['count']}")
 
for result in data["results"]:
    if result["valid"]:
        risk = result["risk_indicators"]["country_risk"]
        issuer = result["issuer"]["type"]
        print(f"  {result['iban']} — {result['country']['name']} ({issuer}, risk: {risk})")
    else:
        print(f"  INVALID — {result['error_detail']}")

TypeScript

const response = await fetch(
  "https://api.ibanforge.com/v1/iban/batch",
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      ibans: [
        "CH1000230000000012345",
        "DE89370400440532013000",
        "FR7630006000011234567890189",
      ],
    }),
  }
);
 
const data = await response.json();
console.log(`Valid: ${data.valid_count}/${data.count}`);
 
for (const result of data.results) {
  if (result.valid) {
    console.log(`  ${result.iban} — ${result.issuer.type}, risk: ${result.risk_indicators.country_risk}`);
  } else {
    console.log(`  INVALID — ${result.error_detail}`);
  }
}

Put these checks to work

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

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

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

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