IBANforge BIC API

BIC/SWIFT lookup endpoints (paid via x402)

Operations 1

GET /v1/bic/{code} Lookup a BIC/SWIFT code #

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-bic-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 form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

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

OpenAPI Specification

ibanforge-bic-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: IBANforge BIC API
  version: 1.8.0
  description: IBANforge checks the bank behind an IBAN before you pay.
  contact:
    name: IBANforge support
    url: https://github.com/cammac-creator/ibanforge/issues
    email: support@ibanforge.com
servers:
- url: https://api.ibanforge.com
  description: Production
- url: http://localhost:3000
  description: Local development
tags:
- name: BIC
  description: BIC/SWIFT lookup endpoints (paid via x402)
paths:
  /v1/bic/{code}:
    get:
      operationId: lookupBIC
      summary: Lookup a BIC/SWIFT code
      description: Returns institution details for a BIC/SWIFT code (8 or 11 characters). Costs 0.003 USDC via x402.
      tags:
      - BIC
      security:
      - x402Payment: []
      - apiKey: []
      parameters:
      - name: code
        in: path
        required: true
        description: BIC/SWIFT code (8 or 11 characters)
        schema:
          type: string
          minLength: 8
          maxLength: 11
          example: UBSWCHZH
      responses:
        '200':
          description: BIC lookup result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BICLookupResult'
        '400':
          description: Invalid BIC format
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '402':
          description: Payment required (x402)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '429':
          description: Rate limit exceeded. Applied globally by the server, so any operation can answer it. Honour the Retry-After header; see https://api.ibanforge.com/rate-limits.yml
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
components:
  schemas:
    BICLookupResult:
      type: object
      required:
      - bic
      - bic8
      - bic11
      - found
      - valid_format
      - institution
      - country
      - city
      - branch_code
      - branch_info
      - lei
      - lei_status
      - is_test_bic
      - source
      - cost_usdc
      properties:
        attribution:
          type: object
          description: Free tier only. When these results are shown to people, display `text` with a link to `url`; backend-only use owes nothing. Absent on paid plans and on x402 calls.
          required:
          - required
          - text
          - url
          - note
          properties:
            required:
              type: boolean
              enum:
              - true
            text:
              type: string
              example: Powered by IBANforge
            url:
              type: string
              format: uri
            note:
              type: string
        bic:
          type: string
          example: UBSWCHZH
        bic8:
          type: string
          example: UBSWCHZH
        bic11:
          type: string
          example: UBSWCHZHXXX
        found:
          type: boolean
          description: 'True only when the directory row names an institution: a record is complete or not found.'
        valid_format:
          type: boolean
        institution:
          type:
          - string
          - 'null'
          example: UBS AG
        country:
          type: object
          required:
          - code
          - name
          properties:
            code:
              type: string
              example: CH
              description: Always characters 5-6 of the BIC.
            name:
              type: string
              example: Switzerland
              description: The row's country name, then the ISO name, and the code only when neither exists. Named on a BIC we do not hold as well.
        city:
          type:
          - string
          - 'null'
          description: Null, never an empty string, when the source leaves the town blank.
        address:
          type:
          - object
          - 'null'
          description: Registered head-office address (present when available, GLEIF or directory sourced). null when no registered address is on file, found or not; address_available says the same.
          properties:
            type:
              type: string
              example: registered
            street:
              type:
              - string
              - 'null'
              example: Bahnhofstrasse 45
            post_code:
              type:
              - string
              - 'null'
              example: '8001'
            region:
              type:
              - string
              - 'null'
              example: CH-ZH
            city:
              type:
              - string
              - 'null'
              example: Zurich
            country:
              type: string
              example: CH
            romanized:
              type:
              - string
              - 'null'
            romanization:
              type: string
              example: original_latin
            source:
              type: string
              example: GLEIF
            language:
              type: string
              example: en
            as_of:
              type: string
              format: date
        address_available:
          type: boolean
        postal_address:
          type: object
          description: The institution seat expressed as an ISO 20022 PostalAddress, for the November 2026 structured-address rules (SPS 2026 in force 14 Nov 2026, Fedwire production 16 Nov 2026, T2 R2026.NOV). Purely additive — the `address` block beside it is unchanged and keeps the full untruncated street. Present only when TwnNm and Ctry can both be filled; absent fields are absent, never guessed.
          properties:
            strt_nm:
              type: string
              description: StrtNm. Present ONLY when the source really separates street from number — in practice the SIX BankMaster register for Swiss and Liechtenstein institutions. Its absence means the source published one concatenated line (which is then served as adr_line), NOT that the institution has no street.
            bldg_nb:
              type: string
              description: BldgNb. Same condition as strt_nm — never split out of a joined line.
            pst_cd:
              type: string
              description: PstCd.
            twn_nm:
              type: string
              description: TwnNm. Mandatory in SPS and Fedwire; always present when this block is.
            ctry:
              type: string
              description: Ctry, ISO 3166-1 alpha-2.
              example: CH
            adr_line:
              type: array
              items:
                type: string
                maxLength: 70
              maxItems: 2
              description: AdrLine, at most 2 lines of at most 70 characters, never repeating a value already served in a structured element above. A concatenated street line goes here rather than into strt_nm. Omitted rather than truncated when the line cannot fit in two lines — the full line stays in the `address` block.
            format:
              type: string
              enum:
              - structured
              - hybrid
              description: 'structured: every element served has its own ISO 20022 element, no AdrLine. hybrid: structured elements plus at most two AdrLine. Derived from the block, so it cannot disagree with the fields it labels.'
            source:
              type: string
              description: 'The dataset this address came from, named as its publisher names it. It can differ from `address.source`: a Swiss institution is served from the SIX register while `address` stays GLEIF.'
              example: SIX BankMaster (Swiss IID register)
            as_of:
              type:
              - string
              - 'null'
              description: When the SOURCE last stated this address (a SIX validity date, a GLEIF filing date). Null when the dataset publishes none — never a clock read, and never the date our database was refreshed.
          required:
          - twn_nm
          - ctry
          - format
          - source
          - as_of
        branch_code:
          type: string
          example: XXX
        branch_info:
          type:
          - string
          - 'null'
        lei:
          type:
          - string
          - 'null'
        lei_status:
          type:
          - string
          - 'null'
        is_test_bic:
          type: boolean
        source:
          type:
          - string
          - 'null'
          description: Code of the dataset this row comes from; source_name spells it out.
        source_name:
          type:
          - string
          - 'null'
          example: GLEIF LEI-to-BIC mapping
          description: Human name of the dataset this row comes from. Null when nothing was found.
        source_as_of:
          type: string
          example: 2018-01
          description: Year-month the source DATA is from, present ONLY when the row's dataset is a frozen public copy re-imported unchanged. Absent means no gap has been established, never 'this is current'.
        listed_in_current_source:
          type:
          - boolean
          - 'null'
          description: 'Whether the BIC8 asked about still appears in a list refreshed this cycle (GLEIF, the directory sources that carry no vintage, a national register, the EPC scheme registers), on every answer of valid format, found or not: a BIC absent from the directory can still be listed by an EPC register. true when one of them carries it; null when it was not found in what could be read in full (never false by default). It answers true or null today: the EBA STEP2 and NBP lists are only read through our deduplicated directory, so an absence is not proven. It does not prove the bank still exists under this name.'
        official_identity:
          type: object
          description: 'Present ONLY when a central bank publishes the holder of the code we resolved: reached by LEI on any BIC lookup, and by the national bank code for FR and ES. Absent rather than negative on a miss, and never able to change `valid` or `bank_code_check` — the publishers relay codes, they do not allocate them.'
          properties:
            name:
              type: string
              description: The institution's name as the publisher writes it. May differ from `institution` / `bic.bank_name`, which come from the BIC directory — both are served so the two can be compared rather than one silently overwriting the other.
              example: Alpha Bank Example, S.A.
            lei:
              type:
              - string
              - 'null'
              description: Null where the publisher lists none, which is common for money market funds and branches.
            address:
              type:
              - string
              - 'null'
              description: One-line registered address as published. Null when the publisher gives none.
            category:
              type: string
              description: The publisher's classification.
              example: Credit Institution
            matched_by:
              type: string
              enum:
              - lei
              - national_code
              description: 'lei: joined on the LEI the resolved BIC row carries — exact, and unscoped by country because a legal identity does not change with which of an entity''s BICs was asked about. national_code: joined on the bank code the publisher itself publishes (FR five digits, ES four digits).'
            source:
              type: string
              description: The publisher, cited as both licences require.
              example: European Central Bank, list of monetary financial institutions (free at ecb.europa.eu)
            free_of_charge:
              type: string
              description: Both publishers require that buyers of a product incorporating their data be told, on EVERY access, that the information is available free of charge from the publisher's own website. This API is sold, so that notice ships inside every block rather than living on a documentation page.
            attribution:
              type: string
              description: The citation formula the Banco de España requires, reproduced verbatim. Spanish blocks only — the ECB asks to be cited as the source, which `source` does.
              example: Own elaboration based on data from the Banco de España website (www.bde.es)
            as_of:
              type: string
              format: date
              description: Date of the list this row came from, read from the published file and never from a clock. Both lists are republished every business day.
            authoritative:
              type: boolean
              enum:
              - false
              description: Always false. Both publishers relay; neither allocates bank codes, and the attribution of a code remains the national authority's. Read `bank_code_check.authoritative` for the verdict that can be branched on.
          required:
          - name
          - lei
          - address
          - category
          - matched_by
          - source
          - free_of_charge
          - as_of
          - authoritative
        note:
          type: string
          description: Present only when the lookup has something to qualify, typically that coverage may be partial for an unresolved code. Absent on a plain hit.
        sanctions:
          type: object
          description: 'Bank-level sanctions screen, run on every answer including a "found: false" one. `listed` is null, never false, when the database could not be read: a check that did not happen must not look like a check that passed. Screens the institution behind the BIC8, never a beneficiary name.'
          required:
          - screened
          - listed
          properties:
            screened:
              type: boolean
              description: Whether the screen ran.
            listed:
              type:
              - boolean
              - 'null'
              description: 'true when the institution appears on a screened list, false when it does not, null when the screen could not run, or when nothing matched while one of the lists this service names is not loaded on this deployment (see unscreened_lists): a no on the lists read is not a no on the missing one.'
            unscreened_lists:
              type: array
              items:
                type: string
              description: 'Present only when one of the lists this service names is not loaded on this deployment: those lists were not consulted. Absent when every named list was read.'
            matched_lists:
              type: array
              items:
                type: string
              example:
              - OFAC
              description: The lists that matched. Empty when none did.
        cost_usdc:
          type: number
          example: 0.003
        processing_ms:
          type: number
    ApiError:
      type: object
      required:
      - error
      - message
      additionalProperties: true
      properties:
        error:
          type: string
          description: 'Stable machine-readable token in snake_case, e.g. "invalid_json", "invalid_request", "batch_too_large", "payment_required", "payload_too_large", "rate_limit_exceeded". Branch on this, never on `message`. An invalid IBAN is not an ApiError: validation answers 200 with `valid: false`.'
          example: batch_too_large
        message:
          type: string
          description: Human-readable sentence explaining the failure. Wording may change; the token above will not.
          example: Maximum 100 IBANs per batch request
  securitySchemes:
    x402Payment:
      type: apiKey
      in: header
      name: PAYMENT-SIGNATURE
      description: x402 USDC micropayment signature (protocol v2). Clients holding v1 payment requirements may send the same signature as X-Payment; both are accepted.
    apiKey:
      type: http
      scheme: bearer
      description: API key (Bearer ifk_xxx) — 25 free requests/month without an email address, 200 a month once claimed, or a custom quota for paid keys
    accountSession:
      type: apiKey
      in: cookie
      name: ibanforge_account
      description: 'Session of the account page, set by POST /v1/account/session: HttpOnly, Secure, SameSite=Strict, Path=/v1/account, 7 days from sign-in. Read-only: it opens no paid route and no route that acts on a key.'
externalDocs:
  description: Agent-oriented overview (llms.txt) with copy-paste examples
  url: https://api.ibanforge.com/llms.txt