---
title: "IBAN generator: build an IBAN from country and BBAN or bank/branch/account, computing check digits"
method: GET
path: "/v1/id/iban-build"
tags: ["deterministic", "no-api-key", "id", "identifiers", "banking", "checksum"]
---

# IBAN generator: build an IBAN from country and BBAN or bank/branch/account, computing check digits

`GET /v1/id/iban-build`

## Request

- Base URL: `https://api.duoleads.com`
- URL: `https://api.duoleads.com/v1/id/iban-build`
- Auth: none declared

IBAN generator: construct an IBAN from a country code and the domestic account parts, computing the ISO 7064 mod-97-10 check digits. Takes a single BBAN string or named parts (bank code, branch code, account number); digit fields are left-padded with zeros to the country's registered widths. Returns the IBAN in electronic and print formats with its bank, branch and account parts. Covers the 89 SWIFT registry countries. Named parts work only where they span the whole BBAN; else pass the BBAN.

**Output (`data`):** iban (electronic format, no spaces), iban_print (grouped in fours), country, check_digits, bban, parts ({bank, branch, account} as parsed by the registry layout, each string|null: null where the country's registry layout defines no such field, e.g. branch for most countries and all three for HN), length, valid (always true on success: a built IBAN is valid by construction). Named parts are accepted only for countries where bank, branch and account together cover the whole BBAN (56 of 89); for the others (e.g. FR, ES, IT, BE with national check digits) pass bban. Digit fields shorter than their width are left-padded with zeros; letter fields must be exact.

Deterministic: identical input returns identical output, so the response is served with `Cache-Control: private, max-age=31536000, immutable` (the paying client may cache it indefinitely; shared caches must not, because the response is paid).

Sources: iban-registry ibantools 4.5.4, field layout schwifty 2026.7.3 (published 2026-04-10, MIT). Echoed in `meta.sources`.

Price: $0.05 USDC per call (x402, Base). Route contract version 1.0.0. Docs: https://api.duoleads.com/docs#id-iban-build

## Query parameters

- `country` string, required
- `bban` string
- `bank` string
- `branch` string
- `account` string

## Response `200`

Paid and settled. `data` is route-specific; a route that judges its input returns 200 with `data.valid: false` for a bad value.

- object
  - `ok` unknown, required
  - `route` '/v1/id/iban-build', required
  - `version` '1.0.0', required
  - `data` object, required: iban (electronic format, no spaces), iban_print (grouped in fours), country, check_digits, bban, parts ({bank, branch, account} as parsed by the registry layout, each string|null: null where the country's registry layout defines no such field, e.g. branch for most countries and all three for HN), length, valid (always true on success: a built IBAN is valid by construction). Named parts are accepted only for countries where bank, branch and account together cover the whole BBAN (56 of 89); for the others (e.g. FR, ES, IT, BE with national check digits) pass bban. Digit fields shorter than their width are left-padded with zeros; letter fields must be exact.
    - `iban` string, required
    - `iban_print` string, required
    - `country` string, required
    - `check_digits` string, required
    - `bban` string, required
    - `parts` object, required
      - `bank` string, nullable, required
      - `branch` string, nullable, required
      - `account` string, nullable, required
    - `length` integer, required
    - `valid` boolean, required
  - `meta` Meta, required
    - `disclaimer` string, required: Legal short disclaimer, identical on every response.
    - `request_id` string, required: ULID.
    - `computed_at` string, date-time, required: RFC 3339 UTC with milliseconds.
    - `price_usd` string, required: Decimal string, "0.05".
    - `deterministic` boolean, required
    - `sources` object[]: Present only on routes that read a vendored dataset: the exact edition that answered.
      - `id` string, required
      - `version` string, required
      - `published` string, required
      - `attribution` string
      - `licence` string

## Other responses

- `400`: MISSING_PARAM, INVALID_PARAM or UNSUPPORTED_VALUE. Not charged: validation runs before the paywall.
- `402`: Payment required. No valid PAYMENT-SIGNATURE was supplied: read the base64 PAYMENT-REQUIRED header (or this body) for the price ($0.05 = 50000 atomic USDC on eip155:8453), sign an EIP-3009 authorization and retry. Also returned when settlement is declined (PAYMENT_FAILED). Nothing is charged on a 402.
- `404`: NOT_FOUND: unknown path. Not charged.
- `405`: METHOD_NOT_ALLOWED: only GET and HEAD are served. Not charged.
- `413`: INPUT_TOO_LARGE: a parameter exceeded its documented maximum length. Not charged.
- `500`: INTERNAL: a server bug. Not charged.

---

[API](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo.md) · [All operations](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo/llms.txt) · [OpenAPI document](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo/revisions/18790d59615e?raw)
