IBANforge Free API

Free endpoints — no payment required

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/ibanforge-free-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

ibanforge-free-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Ibanforge Free API
  version: 1.4.3
  contact:
    url: https://ibanforge.com
  description: 'Operations tagged Free across 2 of this provider''s published API definitions: ibanforge-free-api-openapi.yml, ibanforge-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.ibanforge.com
  description: Production
- url: http://localhost:3000
  description: Local development
tags:
- name: Free
  description: Free endpoints — no payment required
paths:
  /v1/iban/format:
    get:
      operationId: formatCheckIBAN
      summary: Free IBAN format check (mod-97 + structure)
      description: 'FREE pure-format IBAN check: ISO 13616 mod-97 checksum, country-specific length, and BBAN parsing. No payment, no API key, no quota (global rate limit only). Does NOT touch the BIC, SEPA, VoP, sanctions, or Swiss clearing databases — use POST /v1/iban/validate ($0.005) when you need the full enrichment. Ideal for pre-filtering malformed IBANs before paying for validation.'
      tags:
      - Free
      parameters:
      - name: iban
        in: query
        required: true
        description: IBAN to check (spaces allowed, will be normalized)
        schema:
          type: string
          minLength: 15
          maxLength: 34
          example: CH1000230000000012345
      responses:
        '200':
          description: Format check result. valid=true includes parsed components; valid=false includes error + error_detail. Both include an upgrade_to_full_validation hint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IBANFormatResult'
        '400':
          description: Missing ?iban= query parameter, or IBAN shorter than 15 / longer than 34 characters
    servers:
    - url: https://api.ibanforge.com
      description: Production
    - url: http://localhost:3000
      description: Local development
  /v1/iban/structure:
    get:
      operationId: listIBANStructures
      summary: List all supported IBAN countries (free)
      description: 'FREE metadata endpoint: lists every supported IBAN country with its IBAN length, SEPA membership, and whether a BBAN structure breakdown and example IBAN are available. Use GET /v1/iban/structure/{country} for the full per-country template.'
      tags:
      - Free
      responses:
        '200':
          description: List of supported countries
          content:
            application/json:
              schema:
                type: object
                required:
                - total
                - countries
                properties:
                  total:
                    type: integer
                    description: Number of supported IBAN countries
                  countries:
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                          example: CH
                        name:
                          type: string
                          example: Switzerland
                        iban_length:
                          type: integer
                          example: 21
                        sepa_member:
                          type: boolean
                        has_bban_structure:
                          type: boolean
                        has_example:
                          type: boolean
                  endpoint_per_country:
                    type: string
                    example: GET /v1/iban/structure/:country
                  cost_usdc:
                    type: number
                    example: 0
    servers:
    - url: https://api.ibanforge.com
      description: Production
    - url: http://localhost:3000
      description: Local development
  /v1/iban/structure/{country}:
    get:
      operationId: getIBANStructure
      summary: IBAN structure template for a country (free)
      description: 'FREE metadata endpoint: returns the IBAN structural template for a country — total IBAN length, BBAN field positions (bank code / branch code / account number, 0-indexed within the BBAN), SEPA membership + schemes + VoP obligation, and a canonical example IBAN to copy-paste. Use it when an agent needs to know the IBAN format for a country before crafting a validation call.'
      tags:
      - Free
      parameters:
      - name: country
        in: path
        required: true
        description: ISO 3166-1 alpha-2 country code (case-insensitive)
        schema:
          type: string
          pattern: ^[A-Za-z]{2}$
          example: CH
      responses:
        '200':
          description: IBAN structure template
          content:
            application/json:
              schema:
                type: object
                required:
                - country
                - iban_length
                - bban_length
                - sepa
                - cost_usdc
                properties:
                  country:
                    type: object
                    properties:
                      code:
                        type: string
                        example: CH
                      name:
                        type: string
                        example: Switzerland
                  iban_length:
                    type: integer
                    example: 21
                  bban_length:
                    type: integer
                    example: 17
                  bban:
                    type: object
                    nullable: true
                    description: BBAN field positions, 0-indexed within the BBAN. null when no structure is declared for the country. charset uses SWIFT registry notation (n=digits, a=uppercase letters, c=alphanumeric, e.g. "5!n").
                    properties:
                      bank_code:
                        type: object
                        properties:
                          start:
                            type: integer
                          length:
                            type: integer
                          charset:
                            type: string
                            nullable: true
                      branch_code:
                        type: object
                        properties:
                          start:
                            type: integer
                          length:
                            type: integer
                          charset:
                            type: string
                            nullable: true
                      account_number:
                        type: object
                        properties:
                          start:
                            type: integer
                          length:
                            type: integer
                          charset:
                            type: string
                            nullable: true
                  bban_pattern:
                    type: string
                    nullable: true
                    description: Full BBAN pattern in SWIFT IBAN Registry notation (e.g. "5!n12!c") — what /v1/iban/validate enforces structurally on top of length + mod-97.
                    example: 5!n12!c
                  sepa:
                    type: object
                    properties:
                      member:
                        type: boolean
                      schemes:
                        type: array
                        items:
                          type: string
                          enum:
                          - SCT
                          - SDD
                          - SCT_INST
                      vop_required:
                        type: boolean
                  example_iban:
                    type: string
                    nullable: true
                    example: CH9300762011623852957
                  example_iban_note:
                    type: string
                    nullable: true
                    description: 'Says what example_iban is: an illustration from the SWIFT IBAN Registry whose bank code is not guaranteed to be allocated. 36 of the 89 come back bank_code_check.status not_in_register, which is the example being fictional rather than a gap in our data. LV uses the literal ''BANK'', RO uses ''AAAA'', and the Swiss one is proven unallocated by the SIX BankMaster.'
                  notes:
                    type: string
                  upgrade_hint:
                    type: string
                  cost_usdc:
                    type: number
                    example: 0
        '400':
          description: Invalid country code (must be 2 letters), or literal {country} placeholder sent unsubstituted
        '404':
          description: Country not covered — see GET /v1/iban/structure for the full list
    servers:
    - url: https://api.ibanforge.com
      description: Production
    - url: http://localhost:3000
      description: Local development
  /v1/test-iban:
    get:
      operationId: getTestIban
      summary: Generate test IBANs with REAL bank codes
      description: 'Free. Generates structurally valid test IBANs whose bank codes are drawn from the national registers we serve (CH, DE, AT, BE) — unlike the usual generators, whose checksum-valid IBANs carry arbitrary codes no register allocated. Account digits are random and belong to nobody. Each item ships with the proof: our own bank_code_check answer for that IBAN.'
      tags:
      - Free
      parameters:
      - name: country
        in: query
        required: false
        schema:
          type: string
          enum:
          - CH
          - DE
          - AT
          - BE
        description: Omit for a random supported country
      - name: count
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 10
          default: 1
      responses:
        '200':
          description: Generated test IBANs, each with its register proof
          content:
            application/json:
              schema:
                type: object
                properties:
                  test_ibans:
                    type: array
                    items:
                      type: object
                      properties:
                        iban:
                          type: string
                        formatted:
                          type: string
                        country:
                          type: string
                        proof:
                          type: object
                        note:
                          type: string
                  disclaimer:
                    type: string
                  cost_usdc:
                    type: number
        '400':
          description: Unsupported country
    servers:
    - url: https://api.ibanforge.com
      description: Production
    - url: http://localhost:3000
      description: Local development
  /v1/demo:
    get:
      operationId: getDemo
      summary: Free demo results
      description: Returns example IBAN and BIC validation results. No payment required.
      tags:
      - Free
      responses:
        '200':
          description: Demo results
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  iban_examples:
                    type: array
                    items:
                      $ref: '#/components/schemas/IBANValidationResult'
                  bic_examples:
                    type: array
                    items:
                      type: object
                      properties:
                        label:
                          type: string
                        bic:
                          type: string
                        endpoint:
                          type: string
    servers:
    - url: https://api.ibanforge.com
      description: Production
    - url: http://localhost:3000
      description: Local development
  /health:
    get:
      operationId: getHealth
      summary: Health check
      description: Returns API health status, uptime, and basic statistics.
      tags:
      - Free
      responses:
        '200':
          description: Health status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HealthResponse'
    servers:
    - url: https://api.ibanforge.com
      description: Production
    - url: http://localhost:3000
      description: Local development
components:
  schemas:
    IBANFormatResult:
      type: object
      required:
      - iban
      - valid
      - upgrade_to_full_validation
      properties:
        iban:
          type: string
          description: The IBAN as provided (normalized)
          example: CH1000230000000012345
        valid:
          type: boolean
          description: mod-97 checksum + country structure result
        formatted:
          type: string
          description: IBAN formatted in groups of 4 (only when valid)
          example: CH10 0023 0000 0000 1234 5
        country:
          type: object
          description: Only present when valid
          properties:
            code:
              type: string
              example: CH
            name:
              type: string
              example: Switzerland
        check_digits:
          type: string
          example: '10'
        bban:
          type: object
          description: Parsed BBAN components (only when valid and the country declares a structure)
          properties:
            bank_code:
              type: string
              example: '00230'
            branch_code:
              type: string
            account_number:
              type: string
              example: '000000012345'
        error:
          type: string
          description: Only when valid=false
          enum:
          - invalid_format
          - unsupported_country
          - wrong_length
          - checksum_failed
        error_detail:
          type: string
          description: Only when valid=false
        upgrade_to_full_validation:
          type: string
          description: Pointer to POST /v1/iban/validate for BIC, SEPA, VoP, sanctions and Swiss clearing enrichment
    HealthResponse:
      type: object
      required:
      - status
      - version
      - uptime_seconds
      - bic_database_entries
      properties:
        status:
          type: string
          enum:
          - ok
        version:
          type: string
          example: 1.4.3
        uptime_seconds:
          type: number
        bic_database_entries:
          type: integer
          description: Number of BIC entries currently loaded (refreshed monthly from public sources)
          example: 121716
        bic_data_last_updated:
          type: string
          description: Last update timestamp of BIC data
    IBANValidationResult:
      type: object
      required:
      - iban
      - valid
      - cost_usdc
      properties:
        iban:
          type: string
          description: The IBAN as provided (normalized)
        valid:
          type: boolean
        country:
          type: object
          properties:
            code:
              type: string
              example: GB
            name:
              type: string
              example: United Kingdom
          required:
          - code
          - name
        check_digits:
          type: string
          example: '29'
        bban:
          type: object
          properties:
            bank_code:
              type: string
            branch_code:
              type: string
            account_number:
              type: string
          required:
          - bank_code
          - account_number
        bic:
          type: object
          nullable: true
          properties:
            code:
              type: string
              example: NWBKGB2L
            bank_name:
              type: string
              nullable: true
            city:
              type: string
              nullable: true
          required:
          - code
          - bank_name
          - city
        formatted:
          type: string
          description: IBAN formatted in groups of 4
          example: GB29 NWBK 6016 1331 9268 19
        clearing:
          type: object
          nullable: true
          description: Swiss clearing enrichment from the SIX BankMaster directory — present for CH and LI IBANs only, and included at no extra cost in the 0.005 USDC validation. Full rail participation, not just a name lookup.
          properties:
            iid:
              type: string
              description: Zero-padded 5-digit IID / BC-Nummer
              example: '00230'
            name:
              type: string
              example: UBS Switzerland AG
            type:
              type: string
              enum:
              - bank
              - cantonal_bank
              - postfinance
              - raiffeisen
              - central_bank
              - foreign_participant
            town:
              type: string
              example: Zürich
            sic:
              type: boolean
              description: SIC (Swiss Interbank Clearing) participation
            instant_payments_chf:
              type: boolean
              description: Instant Payments CHF participation
            eurosic:
              type: boolean
              description: euroSIC participation
            qr_iid:
              type: string
              nullable: true
              description: QR-IID allocation for QR-bill reference, null when the institution has none
        error:
          type: string
          enum:
          - invalid_format
          - unsupported_country
          - wrong_length
          - checksum_failed
        error_detail:
          type: string
        cost_usdc:
          type: number
          example: 0.005
        processing_ms:
          type: number
        sepa:
          type: object
          description: SEPA compliance details. Only present when the IBAN is valid and the country participates in SEPA.
          properties:
            member:
              type: boolean
              description: Whether the IBAN country is a SEPA member
            schemes:
              type: array
              description: SEPA schemes the institution supports (SCT = Credit Transfer, SDD = Direct Debit, SCT_INST = Instant Credit Transfer)
              items:
                type: string
                enum:
                - SCT
                - SDD
                - SCT_INST
            vop_required:
              type: boolean
              description: Whether Verification of Payee (VoP) is required under EU Instant Payments Regulation for this institution
            vop_participant:
              type: boolean
              nullable: true
              description: 'Bank-level VoP readiness: true when the resolved institution is listed as "ready" in the EPC Verification of Payee scheme register; false when it is not; null when no institution was resolved. Listing means the bank answers VoP requests — it does not run the name check for you.'
          required:
          - member
          - schemes
          - vop_required
        issuer:
          type: object
          description: Issuer classification for the institution behind the IBAN. Useful for vIBAN detection and KYC enrichment. Only present when the IBAN is valid and the BIC is resolved.
          properties:
            type:
              type: string
              nullable: true
              enum:
              - bank
              - digital_bank
              - emi
              - payment_institution
              - null
              description: 'Type of financial institution (bank = traditional bank, digital_bank = neobank/challenger, emi = Electronic Money Institution, payment_institution = licensed PI). Null when we hold no support for a type: falling back to bank would be an assertion, and a payee pre-flight must not be handed one.'
            name:
              type: string
              description: Name of the institution holding this BIC
            classification:
              type: string
              enum:
              - curated
              - default
              description: Whether the type was established or assumed. curated = the BIC8 is in the issuer set, so this is an identification. default = nothing is on file and 'bank' is the fallback, which covers 42,195 of 43,199 distinct BIC8 (97.7%, recounted 29/07/2026; the count drifts at every monthly refresh). When sizing exposure to virtual IBANs, count only curated.
            iban_issuer:
              type: string
              enum:
              - confirmed
              - not_listed
              description: 'Whether the country''s own list of IBAN-issuing providers names the holder of this bank code. Present only where such a list exists, today NL. confirmed = the identifier belongs to a provider that issues IBANs. not_listed = it resolves to a BIC, but the holder is not among the known issuers, so the account may not exist: measured 29/07/2026, only 90 of our 815 Dutch codes are on that list and the rest resolve to corporate treasuries that hold a Dutch BIC for their own SWIFT traffic. NOT a denial, because the Dutch list is explicitly not exhaustive, which is also why NL keeps bank_code_check.authoritative false.'
          required:
          - type
          - name
          - classification
        risk_indicators:
          type: object
          description: AML/CFT risk indicators derived from the IBAN structure, issuer type, and country. Designed for compliance pre-screening and fraud prevention workflows. Only present when the IBAN is valid.
          properties:
            issuer_type:
              type: string
              nullable: true
              enum:
              - bank
              - digital_bank
              - emi
              - payment_institution
              - null
              description: Type of the issuing institution (mirrors issuer.type for convenience). Null when the bank code resolved no institution — it used to default to "bank", which typed an institution that had not been found. Read bank_code_check to tell an unresolved code from a genuine bank.
            country_risk:
              type: string
              enum:
              - standard
              - elevated
              - high
              description: Country-level risk classification based on FATF grey/black lists and EU high-risk third countries
            test_bic:
              type: boolean
              description: Whether the resolved BIC is a test/sandbox code (position 8 = 0)
            sepa_reachable:
              type: boolean
              description: 'Whether SEPA Credit Transfers reach this COUNTRY. Derived from the country, not from the account: it stays true on an IBAN whose bank code resolved nothing. See sepa_reachable_scope.'
            sepa_reachable_scope:
              type: string
              enum:
              - country
              description: The scope sepa_reachable holds at. Present so the field cannot be read as an account-level assertion.
            vop_coverage:
              type: boolean
              description: Whether the institution is covered by Verification of Payee, reducing payee impersonation risk
          required:
          - issuer_type
          - country_risk
          - test_bic
          - sepa_reachable
          - sepa_reachable_scope
          - vop_coverage
        bank_code_check:
          type: object
          description: Separate verdict on the BBAN bank code. `valid` answers ISO 13616 (structure + mod-97) and says nothing about whether the bank code identifies an institution; this field answers that, and states how much weight the answer carries. Present only when the IBAN is valid.
          properties:
            value:
              type: string
              description: 'The bank code that was actually checked. Normally identical to bban.bank_code. It differs in Finland, where the monetary institution code is 1 to 4 characters depending on its leading digits while bban.bank_code stays the fixed positional slice: a Nordea IBAN carries bban.bank_code "123" and value "1". When they differ, this field is the one the verdict is about.'
            status:
              type: string
              enum:
              - verified
              - not_in_register
              - unavailable
              description: 'verified: resolves to an institution we can name. not_in_register: it does not, in reference data we do hold for this country — actionable as non-existence ONLY when authoritative is true. unavailable: we hold no reference data for this country, so no opinion.'
            match:
              type: string
              nullable: true
              enum:
              - register
              - prefix
              - null
              description: 'register: exact key in the reference set, deterministic. prefix: the bic8 LIKE fallback, reachable only in the 30 countries whose bank code may open on a letter (a BIC8 always does) — check candidates.'
            register:
              type: string
              nullable: true
              description: Name of the reference set consulted.
            authoritative:
              type: boolean
              description: 'True only where that reference set is the national register: today CH and LI against the SIX BankMaster, DE against the Bundesbank Bankleitzahlendatei, FI against the Finance Finland monetary institution list, AT against the Oesterreichische Nationalbank SEPA-Zahlungsverkehrs-Verzeichnis, and BE against the Banque nationale de Belgique bank identification codes. This is the flag to branch on: everywhere else an absence is evidence of absence from our data, not of non-existence. One asymmetry worth knowing: CH, LI, DE, AT and BE allocate codes to individual institutions, while FI allocates prefixes to banking groups, so a Finnish verified confirms the group and its BIC rather than one specific bank. The negative direction carries full weight in all six.'
            candidates:
              type: integer
              description: BIC8 the prefix search matched. Present only for match=prefix. Greater than 1 means the returned BIC is one of several and may belong to a different institution than the account does.
            retired:
              type: boolean
              description: 'Present and true when an authoritative register marks the code for deletion: the institution is being retired. The code WAS allocated, so this is a verified result, not a denial. See superseded_by.'
            superseded_by:
              type: string
              description: The bank code that takes over, when the register names one. Re-paper the beneficiary against it.
            institution:
              type: object
              description: 'What the national register publishes about the allocated institution. Present only on an authoritative answer — composite-map hits stay bare (naming a BIC holder is the bic block, and its address would imply a register that was not consulted). Depth varies by register: SIX (CH/LI) and the OeNB (AT) publish the full seat address, the Bundesbank (DE) publishes postal code and town only, the BNB (BE) publishes names alone; Finland stays without this block, its codes belong to banking groups. Absent fields are null, never guessed. This is the institution allocated the BANK CODE — not a branch, and not proof of any account.'
              properties:
                name:
                  type: string
                street:
                  type: string
                  nullable: true
                  description: One line, house number included, matching the GLEIF shape. Null where the register publishes none (DE, BE).
                post_code:
                  type: string
                  nullable: true
                town:
                  type: string
                  nullable: true
                country:
                  type: string
                lei:
                  type: string
                  nullable: true
                  description: Legal Entity Identifier, where the register publishes one (the OeNB does, 99% of entries).
              required:
              - name
              - street
              - post_code
              - town
              - country
            as_of:
              type: string
              description: Year-month the consulted reference set was last refreshed.
          required:
          - value
          - status
          - match
          - register
          - authoritative
          - as_of
        next_steps:
          type: array
          description: 'Ordered advice derived from THIS result: what blocks a payment first, what merely enriches it after. Branch on `code`, never on the prose. Absent or empty for an IBAN that failed validation, since the error already says what to do.'
          items:
            type: object
            properties:
              code:
                type: string
                description: 'Stable identifier. Today: bank_code_not_allocated (the national register denies the code, do not send), bank_code_retired (allocated but being withdrawn, re-paper against superseded_by), verify_payee_name (we cannot confirm it, treat as unavailable and let a name check decide), bic_is_advisory (the BIC was picked from several candidates), issuer_not_a_known_iban_issuer (the code resolves to a BIC, but its holder is not among the providers known to issue IBANs in that country), test_bic, expect_virtual_iban (curated non-bank issuer, account holder and IBAN holder often differ), screen_compliance.'
              do:
                type: string
                description: The instruction, in one sentence an agent can relay to a person.
              because:
                type: string
                description: The field of this response that produced the step, so the advice is auditable.
              action:
                type: string
                description: An IBANforge call that performs the step, when one exists.
            required:
            - code
            - do
            - because
    IBANValidationResult_2:
      type: object
      required:
      - iban
      - valid
      - cost_usdc
      properties:
        iban:
          type: string
          description: The IBAN as provided (normalized)
        valid:
          type: boolean
        country:
          type: object
          properties:
            code:
              type: string
              example: GB
            name:
              type: string
              example: United Kingdom
          required:
          - code
          - name
        check_digits:
          type: string
          example: '29'
        bban:
          type: object
          properties:
            bank_code:
              type: string
            branch_code:
              type: string
            account_number:
              type: string
          required:
          - bank_code
          - account_number
        bic:
          type:
          - object
          - 'null'
          properties:
            code:
              type: string
              example: NWBKGB2L
            bank_name:
              type:
              - string
              - 'null'
            city:
              type:
              - string
              - 'null'
          required:
          - code
          - bank_name
          - city
        formatted:
          type: string
          description: IBAN formatted in groups of 4
          example: GB29 NWBK 6016 1331 9268 19
        clearing:
          type:
          - object
          - 'null'
          description: Swiss clearing enrichment from the SIX BankMaster directory — present for CH and LI IBANs only, and included at no extra cost in the 0.005 USDC validation. Full rail participation, not just a name lookup.
          properties:
            iid:
              type: string
              description: Zero-padded 5-digit IID / BC-Nummer
              example: '00230'
            name:
              type: string
              example: UBS Switzerland AG
            type:
              

# --- truncated at 32 KB (46 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/ibanforge/refs/heads/main/openapi/ibanforge-free-api-openapi.yml