Skip to main content
Glama

Validate IBAN

validate_iban
Read-onlyIdempotent

Verify whether an IBAN from any of the 89 IBAN countries is valid AND enrich it with bank, compliance and routing data. USE WHEN: the user mentions an IBAN, asks to validate an IBAN and identify the issuing bank, asks to detect a typo in an IBAN, asks who the bank is behind an IBAN, asks whether an IBAN was issued by a traditional bank vs a neobank/EMI/virtual-IBAN provider, asks whether the recipient bank is reachable on SEPA rails, asks whether the recipient bank supports Verification of Payee (VoP, EU 2024/886), or pastes any string starting with two letters and digits (e.g., "DE89...", "CH93...", "FR76..."). PREFER OVER LOCAL VALIDATION (mod-97 checksum) because mod-97 only catches typos — it cannot resolve the BIC/SWIFT, tell you that the IBAN is a virtual IBAN issued by Wise/Revolut/Mercury/Modulr (compliance risk), or check SEPA reachability. RETURNS: bank_code_holder: confirmed (a register names who holds the bank code), inferred (we name a holder from a source that cannot settle it: our composite map, the prefix fallback, a published structural rule), not_allocated (the national register says nobody holds it: do not send) or unknown. valid stays true in all four: it only means the IBAN is well formed. checks: one status per check (pass, fail, inferred, unknown, not_checked, not_applicable); payee_name, account_exists and payee_sanctions are always not_checked. national_check_digits { country, scheme, status: pass | fail | not_applicable | not_checked, detail?, method?, verified_by? } (FR, MC, BE, IT, SM, ES and DE only): the national key inside the BBAN; fail means the account number cannot have been issued as written, and valid stays true; in DE a fail with verified_by independent_implementation is a warning (national_check_digits_suspect), not a stop, and not_checked means the bank code or its Bundesbank method is not covered here. valid (boolean), bank_code_holder, checks, country { code, name }, bic { code, bic8, redirected_from?, bank_name, city, basis, authoritative, source, as_of, source_as_of?, listed_in_current_source, lei, lei_status, address { street, post_code, region, city, country, romanized, romanization, source, language, as_of } } — basis says WHERE the bank code to BIC pairing came from (national_register | curated_map | directory_prefix) and authoritative, derived from it, says whether the BIC may be stored and settled against; outside a national_register pairing the BIC is advisory, confirm it before it becomes a routing instruction. code is 8 or 11 characters, as the consulted source publishes it: COMPARE A SUPPLIED BIC ON bic8, never on code — the branch code is informational and in a cooperative network it names the LOCAL bank while the first eight name its clearing institution (Swiss IID 30020 is RBABCH22180, Crédit Mutuel de la Vallée SA, while RBABCH22 alone is Entris Banking AG). redirected_from is present when the register answered for the bank code that took over the one you asked about (CH/LI: SIX redirects a concatenated IID, which does not make the IBAN invalid) — lei and address are read from the same directory row /v1/bic/:code serves, so this call already carries them; both are null when GLEIF publishes nothing for that BIC, which means "no LEI on file", not "the institution has none". bic.address is the LEGAL ENTITY seat, so bic.address.city may legitimately differ from bic.city (the register city for THIS bank code), and bic.address.as_of dates the entity last filing, usually much older than bic.as_of. issuer { type: bank | digital_bank | emi | payment_institution, name }, sepa { member, schemes, vop_required, vop_participant — is the resolved bank listed as ready in the EPC VoP register, bank_reachability, bank_schemes, vop_register_status: the bank itself in the EPC registers, never the country }, risk_indicators { issuer_type (null when no institution resolved), country_risk, test_bic, sepa_reachable, sepa_reachable_scope, vop_coverage }, and for CH/LI: clearing { iid, name, type, sic, qr_iid }. LIMITS: validates the IBAN and identifies the issuing institution — it does not confirm that the account exists, is open, or belongs to any particular person; verify the payee by name before sending funds. IMPORTANT — bic: null does not mean the bank code is wrong. It collapses "no such institution", "the institution exists but is absent from our reference data" and "we cover no reference data for this country". Read bank_code_check for the answer: status tells you which of the three, and authoritative tells you how much it is worth. Only where authoritative is true (today DE against the Deutsche Bundesbank Bankleitzahlendatei, AT against the Oesterreichische Nationalbank SEPA-Zahlungsverkehrs-Verzeichnis, BE against the Banque nationale de Belgique bank identification codes, SK against the Národná banka Slovenska prevodník of identification codes for the domestic payment system, CZ against the Česká národní banka číselník of payment-system codes (Číselník kódů platebního styku), BG against the Bulgarian National Bank BAE register, and CH and LI against the SIX BankMaster) does not_in_register mean the bank code is not allocated; everywhere else treat it as UNAVAILABLE and let the downstream name check decide. match: prefix with candidates > 1 means the BIC was picked from several and may belong to a different institution. COST: $0.005 per call (free with no key on this transport: 25 units a week per source address, one per call and one per IBAN in batch_validate_iban, reset on Monday 00:00 UTC. Or an ifk_ key with no e-mail at all: POST https://api.ibanforge.com/v1/keys/generate with no body for 25 calls/month, on the REST API or on this transport, and POST /v1/keys/claim lifts that same key to 200 a month. Send the key here as Authorization: Bearer ifk_… (or X-API-Key) and each call counts against it exactly as on the REST API).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
ibanYesIBAN to validate (spaces/hyphens stripped automatically)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
bicNo
bbanNo
ibanYesNormalized IBAN (uppercase, no spaces).
sepaNo
errorNo
validYes
checksNoOne status per check: pass (checked against a source that settles it), fail (checked, and wrong), inferred (answered from a source that does not settle it), unknown (attempted, no conclusion), not_checked (IBANforge does not make this check here), not_applicable (the check has no object for this IBAN). payee_name: never checked here; the name check is made by the payee's bank through Verification of Payee (VoP), and sepa.vop_register_status says whether that bank answers VoP requests. account_exists: never checked here; only the payee's bank knows whether the account is open. payee_sanctions: never checked; the sanctions screen of POST /v1/iban/compliance is made on the payee's bank (BIC8) and country only. institution_sanctions and country_sanctions are filled by POST /v1/iban/compliance and not_checked on a validation. national_check_digits: the check key a country keeps inside the BBAN, a second check independent of mod-97. Checked for FR and MC (RIB key), BE (the last two digits, modulo 97), IT and SM (CIN), ES (DC) and DE (the account-number check digit, by the method the Bundesbank lists for the bank code), with the proof in the national_check_digits block, and for GB (Vocalink modulus), with the proof in modulus_check; not_checked elsewhere. In DE it is not_checked when the bank code is not in the Bundesbank file or its method is not checked here, and not_applicable when the bank uses no check digit (method 09); national_check_digits.verified_by says whether a German verdict rests on the Bundesbank test numbers or on an independent implementation only. pass means the account number is well formed, never that the account exists; fail means it cannot have been issued as written, and valid stays true. A key may be added later; a key is never removed. Present only when valid is true.
issuerNo
countryNo
clearingNoSwiss clearing data when country is CH or LI.
cost_usdcYesWhat THIS call was billed. Zero on the free MCP tier.
formattedNoIBAN with 4-char groups for display.
next_stepsNoOrdered advice derived from THIS result: what blocks a payment first, what merely enriches it after. Branch on `code`, never on the prose. `because` names the field that produced the step so the advice is auditable. Empty for an IBAN that failed validation.
check_digitsNo
error_detailNo
modulus_checkNo
processing_msNo
bank_code_checkNo
list_price_usdcNoCatalogue price of the same call on the paid REST/x402 route.
risk_indicatorsNo
bank_code_holderNoconfirmed | inferred | not_allocated | unknown. Who holds the bank code. confirmed: a register that publishes holders names the holder of this code (a national register that settles the code space, or a partial register on a hit). inferred: we name a holder from a source that cannot settle it (our composite map, the prefix fallback, a published structural rule), so read it as our inference. not_allocated: the national register says nobody holds this code, so do not send. unknown: no conclusion. valid stays true in all four: it only means the IBAN is well formed. bank_code_check.status verified means resolved; this field says whether a source settles it.
psd_registrationNo
official_identityNoWho a central bank says holds the resolved code (ECB by LEI and for FR bank codes, Banco de Espana for ES). Present only on a match — absence is not a negative. INFORMATIONAL ONLY: it never changes valid or bank_code_check, because both publishers relay rather than allocate.
pra_authorisationNo
national_check_digitsNoThe check key a country keeps inside the BBAN, recomputed from the IBAN alone. Present only on a valid IBAN of FR, MC, BE, IT, SM, ES or DE (GB has modulus_check instead); absent elsewhere, where checks.national_check_digits is not_checked. country is the IBAN country. scheme names the algorithm: fr_rib_key (FR and MC: the RIB key, the last two digits of the BBAN, over the bank code, branch code and account number), be_mod97 (BE: the last two digits, the first ten digits modulo 97, or 97 when the remainder is 0), it_cin (IT and SM: the CIN, the control letter at the start of the BBAN, over the ABI, CAB and account number), es_dc (ES: the two DC digits, positions 9 and 10 of the BBAN), de_pruefziffer (DE: the check digit of the 10-digit account number, computed by the method the Deutsche Bundesbank lists for the bank code in its Bankleitzahlendatei, named in method; the IBAN check digits already cover the whole BBAN, this says whether that bank could have issued the account number). status: pass (the key matches, so the account number is well formed; it does not prove the account exists or is open) or fail (the key does not match: this account number cannot have been issued as written, a typo or a made-up number). A fail never makes valid false, because the IBAN check digits are right: read the two separately, and confirm the details with the beneficiary before paying. not_applicable: a BBAN without the national layout, which a valid IBAN never has, or in DE a bank that uses no check digit (method 09) or a method that defines none for that range of account numbers. not_checked (DE only): the check did not run on our side, because the bank code is not in the Bundesbank file or its method is not checked here (method 44, and methods no bank uses); it says nothing about the beneficiary. verified_by (DE only, whenever the method ran): bundesbank_test_numbers (the method gives the expected answer on every test number and worked example the Bundesbank publishes; a fail adds the blocking step national_check_digits_failed) or independent_implementation (the Bundesbank publishes no test number for the method, which was verified against an independent implementation only; a fail adds the warning step national_check_digits_suspect and never stops a payment). detail, present on fail, not_applicable and not_checked, says which digits disagree or why nothing was checked; it never gives the expected key. In DE the block also carries method (the Bundesbank method code), verified_by, source (with the credit line the Bundesbank asks for) and table_fetched_on (the day the method table was read). checks.national_check_digits repeats status.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changed
    • changedOutput schema / properties / checks / description
      Previous value: -"One status per check: pass (checked against a source that settles it), fail (checked, and wrong), inferred (answered from a source that does not settle it), unknown (attempted, no conclusion), not_checked (IBANforge does not make this check here), not_applicable (the check has no object for this IBAN). payee_name: never checked here; the name check is made by the payee's bank through Verification of Payee (VoP), and sepa.vop_register_status says whether that bank answers VoP requests. account_exists: never checked here; only the payee's bank knows whether the account is open. payee_sanctions: never checked; the sanctions screen of POST /v1/iban/compliance is made on the payee's bank (BIC8) and country only. institution_sanctions and country_sanctions are filled by POST /v1/iban/compliance and not_checked on a validation. national_check_digits: the check key a country keeps inside the BBAN, a second check independent of mod-97. Checked for FR and MC (RIB key), BE (the last two digits, modulo 97), IT and SM (CIN) and ES (DC), with the proof in the national_check_digits block, and for GB (Vocalink modulus), with the proof in modulus_check; not_checked elsewhere (the German account-number methods are not checked yet). pass means the account number is well formed, never that the account exists; fail means it cannot have been issued as written, and valid stays true. A key may be added later; a key is never removed. Present only when valid is true."New value: +"One status per check: pass (checked against a source that settles it), fail (checked, and wrong), inferred (answered from a source that does not settle it), unknown (attempted, no conclusion), not_checked (IBANforge does not make this check here), not_applicable (the check has no object for this IBAN). payee_name: never checked here; the name check is made by the payee's bank through Verification of Payee (VoP), and sepa.vop_register_status says whether that bank answers VoP requests. account_exists: never checked here; only the payee's bank knows whether the account is open. payee_sanctions: never checked; the sanctions screen of POST /v1/iban/compliance is made on the payee's bank (BIC8) and country only. institution_sanctions and country_sanctions are filled by POST /v1/iban/compliance and not_checked on a validation. national_check_digits: the check key a country keeps inside the BBAN, a second check independent of mod-97. Checked for FR and MC (RIB key), BE (the last two digits, modulo 97), IT and SM (CIN), ES (DC) and DE (the account-number check digit, by the method the Bundesbank lists for the bank code), with the proof in the national_check_digits block, and for GB (Vocalink modulus), with the proof in modulus_check; not_checked elsewhere. In DE it is not_checked when the bank code is not in the Bundesbank file or its method is not checked here, and not_applicable when the bank uses no check digit (method 09); national_check_digits.verified_by says whether a German verdict rests on the Bundesbank test numbers or on an independent implementation only. pass means the account number is well formed, never that the account exists; fail means it cannot have been issued as written, and valid stays true. A key may be added later; a key is never removed. Present only when valid is true."
    • changedOutput schema / properties / national_check_digits / description
      Previous value: -"The check key a country keeps inside the BBAN, recomputed from the IBAN alone. Present only on a valid IBAN of FR, MC, BE, IT, SM or ES (GB has modulus_check instead); absent elsewhere, where checks.national_check_digits is not_checked. country is the IBAN country. scheme names the algorithm: fr_rib_key (FR and MC: the RIB key, the last two digits of the BBAN, over the bank code, branch code and account number), be_mod97 (BE: the last two digits, the first ten digits modulo 97, or 97 when the remainder is 0), it_cin (IT and SM: the CIN, the control letter at the start of the BBAN, over the ABI, CAB and account number), es_dc (ES: the two DC digits, positions 9 and 10 of the BBAN). status: pass (the key matches, so the account number is well formed; it does not prove the account exists or is open) or fail (the key does not match: this account number cannot have been issued as written, a typo or a made-up number). A fail never makes valid false, because the IBAN check digits are right: read the two separately, and confirm the details with the beneficiary before paying. not_applicable is reserved for a BBAN without the national layout, which a valid IBAN never has. detail, present on fail and not_applicable only, says which digits disagree; it never gives the expected key. checks.national_check_digits repeats status."New value: +"The check key a country keeps inside the BBAN, recomputed from the IBAN alone. Present only on a valid IBAN of FR, MC, BE, IT, SM, ES or DE (GB has modulus_check instead); absent elsewhere, where checks.national_check_digits is not_checked. country is the IBAN country. scheme names the algorithm: fr_rib_key (FR and MC: the RIB key, the last two digits of the BBAN, over the bank code, branch code and account number), be_mod97 (BE: the last two digits, the first ten digits modulo 97, or 97 when the remainder is 0), it_cin (IT and SM: the CIN, the control letter at the start of the BBAN, over the ABI, CAB and account number), es_dc (ES: the two DC digits, positions 9 and 10 of the BBAN), de_pruefziffer (DE: the check digit of the 10-digit account number, computed by the method the Deutsche Bundesbank lists for the bank code in its Bankleitzahlendatei, named in method; the IBAN check digits already cover the whole BBAN, this says whether that bank could have issued the account number). status: pass (the key matches, so the account number is well formed; it does not prove the account exists or is open) or fail (the key does not match: this account number cannot have been issued as written, a typo or a made-up number). A fail never makes valid false, because the IBAN check digits are right: read the two separately, and confirm the details with the beneficiary before paying. not_applicable: a BBAN without the national layout, which a valid IBAN never has, or in DE a bank that uses no check digit (method 09) or a method that defines none for that range of account numbers. not_checked (DE only): the check did not run on our side, because the bank code is not in the Bundesbank file or its method is not checked here (method 44, and methods no bank uses); it says nothing about the beneficiary. verified_by (DE only, whenever the method ran): bundesbank_test_numbers (the method gives the expected answer on every test number and worked example the Bundesbank publishes; a fail adds the blocking step national_check_digits_failed) or independent_implementation (the Bundesbank publishes no test number for the method, which was verified against an independent implementation only; a fail adds the warning step national_check_digits_suspect and never stops a payment). detail, present on fail, not_applicable and not_checked, says which digits disagree or why nothing was checked; it never gives the expected key. In DE the block also carries method (the Bundesbank method code), verified_by, source (with the credit line the Bundesbank asks for) and table_fetched_on (the day the method table was read). checks.national_check_digits repeats status."
    • changedOutput schema / properties / national_check_digits / properties / detail / description
      Previous value: -"Present on fail and not_applicable only."New value: +"Present on fail, not_applicable and not_checked."
    • addedOutput schema / properties / national_check_digits / properties / method
      Added value: +{
      +  "description": "DE only: the Bundesbank check-digit method code of the bank code.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / national_check_digits / properties / scheme / description
      Previous value: -"fr_rib_key | be_mod97 | it_cin | es_dc"New value: +"fr_rib_key | be_mod97 | it_cin | es_dc | de_pruefziffer"
    • addedOutput schema / properties / national_check_digits / properties / source
      Added value: +{
      +  "description": "DE only: the source, with the credit line the Bundesbank asks for.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / national_check_digits / properties / status / description
      Previous value: -"pass | fail | not_applicable"New value: +"pass | fail | not_applicable | not_checked"
    • addedOutput schema / properties / national_check_digits / properties / table_fetched_on
      Added value: +{
      +  "description": "DE only: the day the method table was read (YYYY-MM-DD).",
      +  "type": "string"
      +}
    • addedOutput schema / properties / national_check_digits / properties / verified_by
      Added value: +{
      +  "description": "DE only: bundesbank_test_numbers (a fail is blocking) | independent_implementation (a fail is a warning, national_check_digits_suspect).",
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedOutput schema / properties / sepa / properties / bank_reachability / description
      Previous value: -"listed | not_listed | no_bank | bank_code_not_allocated, or null. Whether the EPC scheme registers list the resolved BANK, never borrowed from the country (member, schemes and basis still describe the country and are unchanged). listed: the bank has rows in the SCT, SCT Inst or SDD register. not_listed: it has none (an absence from the register is not an exclusion from the scheme). no_bank: no BIC resolved for this bank code, so no bank could be looked up in the EPC registers (a register may still name the holder: see bank_code_holder and bank_code_check). bank_code_not_allocated: the national register says nobody holds the bank code. null: the registers are not loaded on this deployment (not consulted, never read as not_listed). Absent outside SEPA."New value: +"listed | not_listed | no_bank | bank_code_not_allocated, or null. Whether the EPC scheme registers list the resolved BANK, never borrowed from the country (member, schemes and basis still describe the country and are unchanged). listed: the bank has rows in the SCT, SCT Inst or SDD register. not_listed: it has none (an absence from the register is not an exclusion from the scheme). no_bank: no BIC resolved for this bank code, so no bank could be looked up in the EPC registers (a register may still name the holder: see bank_code_holder and bank_code_check). bank_code_not_allocated: the national register says nobody holds the bank code. null: the registers are not loaded on this deployment, or no bank was resolved because the bank-code check itself is unavailable (not consulted, never read as not_listed or no_bank). Absent outside SEPA."
  3. Changed3 schema fields changed
    • changedOutput schema / properties / bank_code_check / properties / retired / description
      Previous value: -"True when an authoritative register is withdrawing the code. Still a verified result: it WAS allocated."New value: +"True when a register says the code is leaving (DE, authoritative) or has been struck off (IT, authoritative false, with retired_on). Still a verified result: it WAS allocated. Never a refusal."
    • addedOutput schema / properties / bank_code_check / properties / retired_on
      Added value: +{
      +  "description": "YYYY-MM-DD, with retired where the register dates it (IT): the last day it lists this code for its last holder.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / bank_code_check / properties / superseded_by / description
      Previous value: -"The bank code that takes over. Re-paper the beneficiary against it."New value: +"The bank code that takes over. DE: the successor the register designates, re-paper against it. IT: the legal successor by merger or incorporation, not necessarily the bank now holding the account."
  4. Changed2 schema fields changed
    • changedOutput schema / properties / checks / description
      Previous value: -"One status per check: pass (checked against a source that settles it), fail (checked, and wrong), inferred (answered from a source that does not settle it), unknown (attempted, no conclusion), not_checked (IBANforge does not make this check here), not_applicable (the check has no object for this IBAN). payee_name: never checked here; the name check is made by the payee's bank through Verification of Payee (VoP), and sepa.vop_register_status says whether that bank answers VoP requests. account_exists: never checked here; only the payee's bank knows whether the account is open. payee_sanctions: never checked; the sanctions screen of POST /v1/iban/compliance is made on the payee's bank (BIC8) and country only. institution_sanctions and country_sanctions are filled by POST /v1/iban/compliance and not_checked on a validation. national_check_digits: checked for GB (Vocalink modulus); other countries are being added. A key may be added later; a key is never removed. Present only when valid is true."New value: +"One status per check: pass (checked against a source that settles it), fail (checked, and wrong), inferred (answered from a source that does not settle it), unknown (attempted, no conclusion), not_checked (IBANforge does not make this check here), not_applicable (the check has no object for this IBAN). payee_name: never checked here; the name check is made by the payee's bank through Verification of Payee (VoP), and sepa.vop_register_status says whether that bank answers VoP requests. account_exists: never checked here; only the payee's bank knows whether the account is open. payee_sanctions: never checked; the sanctions screen of POST /v1/iban/compliance is made on the payee's bank (BIC8) and country only. institution_sanctions and country_sanctions are filled by POST /v1/iban/compliance and not_checked on a validation. national_check_digits: the check key a country keeps inside the BBAN, a second check independent of mod-97. Checked for FR and MC (RIB key), BE (the last two digits, modulo 97), IT and SM (CIN) and ES (DC), with the proof in the national_check_digits block, and for GB (Vocalink modulus), with the proof in modulus_check; not_checked elsewhere (the German account-number methods are not checked yet). pass means the account number is well formed, never that the account exists; fail means it cannot have been issued as written, and valid stays true. A key may be added later; a key is never removed. Present only when valid is true."
    • addedOutput schema / properties / national_check_digits
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The check key a country keeps inside the BBAN, recomputed from the IBAN alone. Present only on a valid IBAN of FR, MC, BE, IT, SM or ES (GB has modulus_check instead); absent elsewhere, where checks.national_check_digits is not_checked. country is the IBAN country. scheme names the algorithm: fr_rib_key (FR and MC: the RIB key, the last two digits of the BBAN, over the bank code, branch code and account number), be_mod97 (BE: the last two digits, the first ten digits modulo 97, or 97 when the remainder is 0), it_cin (IT and SM: the CIN, the control letter at the start of the BBAN, over the ABI, CAB and account number), es_dc (ES: the two DC digits, positions 9 and 10 of the BBAN). status: pass (the key matches, so the account number is well formed; it does not prove the account exists or is open) or fail (the key does not match: this account number cannot have been issued as written, a typo or a made-up number). A fail never makes valid false, because the IBAN check digits are right: read the two separately, and confirm the details with the beneficiary before paying. not_applicable is reserved for a BBAN without the national layout, which a valid IBAN never has. detail, present on fail and not_applicable only, says which digits disagree; it never gives the expected key. checks.national_check_digits repeats status.",
      +  "properties": {
      +    "country": {
      +      "description": "The IBAN country (MC stays MC, SM stays SM).",
      +      "type": "string"
      +    },
      +    "detail": {
      +      "description": "Present on fail and not_applicable only.",
      +      "type": "string"
      +    },
      +    "scheme": {
      +      "description": "fr_rib_key | be_mod97 | it_cin | es_dc",
      +      "type": "string"
      +    },
      +    "status": {
      +      "description": "pass | fail | not_applicable",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "country",
      +    "scheme",
      +    "status"
      +  ],
      +  "type": "object"
      +}
  5. Changed6 schema fields changed
    • addedOutput schema / properties / bank_code_holder
      Added value: +{
      +  "description": "confirmed | inferred | not_allocated | unknown. Who holds the bank code. confirmed: a register that publishes holders names the holder of this code (a national register that settles the code space, or a partial register on a hit). inferred: we name a holder from a source that cannot settle it (our composite map, the prefix fallback, a published structural rule), so read it as our inference. not_allocated: the national register says nobody holds this code, so do not send. unknown: no conclusion. valid stays true in all four: it only means the IBAN is well formed. bank_code_check.status verified means resolved; this field says whether a source settles it.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / bic / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "address": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "as_of": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "city": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "country": {
      -                "type": "string"
      -              },
      -              "language": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "post_code": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "region": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "romanization": {
      -                "enum": [
      -                  "original_latin",
      -                  "gleif_english",
      -                  "unavailable"
      -                ],
      -                "type": "string"
      -              },
      -              "romanized": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "source": {
      -                "type": "string"
      -              },
      -              "street": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "type": {
      -                "const": "registered",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "type",
      -              "street",
      -              "post_code",
      -              "region",
      -              "city",
      -              "country",
      -              "romanized",
      -              "romanization",
      -              "source",
      -              "language",
      -              "as_of"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "as_of": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "authoritative": {
      -        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. San Marino is where the two part: the pairing is the supervisor’s, the code space is not its to settle.",
      -        "type": "boolean"
      -      },
      -      "bank_name": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "basis": {
      -        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE, SK, CZ, BG, CH, LI and SM; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      -        "type": "string"
      -      },
      -      "bic8": {
      -        "description": "The eight characters of the institution — the field to compare a supplied BIC against. code is served as the consulted source publishes it, so it is 8 or 11 characters; this one never moves. The branch code (last three characters) is informational: in a cooperative network it names the LOCAL bank and the first eight its clearing institution.",
      -        "type": "string"
      -      },
      -      "city": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "code": {
      -        "type": "string"
      -      },
      -      "lei": {
      -        "description": "GLEIF identity of the resolved BIC holder, not necessarily the bank-code holder.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "lei_status": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "postal_address": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "adr_line": {
      -                "items": {
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              },
      -              "as_of": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "bldg_nb": {
      -                "type": "string"
      -              },
      -              "ctry": {
      -                "type": "string"
      -              },
      -              "format": {
      -                "enum": [
      -                  "structured",
      -                  "hybrid"
      -                ],
      -                "type": "string"
      -              },
      -              "pst_cd": {
      -                "type": "string"
      -              },
      -              "source": {
      -                "type": "string"
      -              },
      -              "strt_nm": {
      -                "type": "string"
      -              },
      -              "twn_nm": {
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "twn_nm",
      -              "ctry",
      -              "format",
      -              "source",
      -              "as_of"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "redirected_from": {
      -        "description": "The bank code asked about, when the register answered for the one that took over its clearing (CH/LI only today: SIX marks an IID concatenated and publishes its successor). The IBAN stays valid — a redirect is not a retirement.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "Source of the bank-code/BIC pairing; keep its provenance.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "source_as_of": {
      -        "description": "Year-month the SOURCE DATA is from, present only when it differs from as_of. as_of dates the import; for the redistributed SWIFT directory the upstream stopped publishing years ago, so as_of alone presents an old bank name as last month's. Absent means no gap has been established, never \"this is current\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "code",
      -      "bank_name",
      -      "city"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "address": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "as_of": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "city": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "country": {
      +                "type": "string"
      +              },
      +              "language": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "post_code": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "region": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "romanization": {
      +                "enum": [
      +                  "original_latin",
      +                  "gleif_english",
      +                  "unavailable"
      +                ],
      +                "type": "string"
      +              },
      +              "romanized": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "street": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "type": {
      +                "const": "registered",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "type",
      +              "street",
      +              "post_code",
      +              "region",
      +              "city",
      +              "country",
      +              "romanized",
      +              "romanization",
      +              "source",
      +              "language",
      +              "as_of"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "as_of": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "authoritative": {
      +        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. San Marino is where the two part: the pairing is the supervisor’s, the code space is not its to settle.",
      +        "type": "boolean"
      +      },
      +      "bank_name": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "basis": {
      +        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE, SK, CZ, BG, CH, LI and SM; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      +        "type": "string"
      +      },
      +      "bic8": {
      +        "description": "The eight characters of the institution — the field to compare a supplied BIC against. code is served as the consulted source publishes it, so it is 8 or 11 characters; this one never moves. The branch code (last three characters) is informational: in a cooperative network it names the LOCAL bank and the first eight its clearing institution.",
      +        "type": "string"
      +      },
      +      "city": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "code": {
      +        "type": "string"
      +      },
      +      "lei": {
      +        "description": "GLEIF identity of the resolved BIC holder, not necessarily the bank-code holder.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "lei_status": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "listed_in_current_source": {
      +        "description": "Whether this BIC8 still appears in a list refreshed this cycle: GLEIF, the directory sources that carry no vintage, a national register, the EPC scheme registers. true when one of them carries it; null when it was not found in what could be read in full (never false by default). false is reserved for an index built from every list read in full, which is not the case today: the EBA STEP2 and NBP lists are only read through our deduplicated directory, so this field answers true or null. It does NOT prove the bank still exists under this name: a clearing list can keep the name of a bank that was absorbed.",
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      },
      +      "postal_address": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "adr_line": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "as_of": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "bldg_nb": {
      +                "type": "string"
      +              },
      +              "ctry": {
      +                "type": "string"
      +              },
      +              "format": {
      +                "enum": [
      +                  "structured",
      +                  "hybrid"
      +                ],
      +                "type": "string"
      +              },
      +              "pst_cd": {
      +                "type": "string"
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "strt_nm": {
      +                "type": "string"
      +              },
      +              "twn_nm": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "twn_nm",
      +              "ctry",
      +              "format",
      +              "source",
      +              "as_of"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "redirected_from": {
      +        "description": "The bank code asked about, when the register answered for the one that took over its clearing (CH/LI only today: SIX marks an IID concatenated and publishes its successor). The IBAN stays valid — a redirect is not a retirement.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Source of the bank-code/BIC pairing; keep its provenance.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "source_as_of": {
      +        "description": "Year-month the source DATA is from, present ONLY when it differs from as_of. On a curated_map or directory_prefix answer it dates the directory row that supplied the name, the city, the LEI or the address when that row comes from a frozen public copy; never present on a national_register answer, whose name comes from the register and is dated by as_of. Absent means no gap has been established, never 'this is current'.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "bank_name",
      +      "city"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / checks
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "One status per check: pass (checked against a source that settles it), fail (checked, and wrong), inferred (answered from a source that does not settle it), unknown (attempted, no conclusion), not_checked (IBANforge does not make this check here), not_applicable (the check has no object for this IBAN). payee_name: never checked here; the name check is made by the payee's bank through Verification of Payee (VoP), and sepa.vop_register_status says whether that bank answers VoP requests. account_exists: never checked here; only the payee's bank knows whether the account is open. payee_sanctions: never checked; the sanctions screen of POST /v1/iban/compliance is made on the payee's bank (BIC8) and country only. institution_sanctions and country_sanctions are filled by POST /v1/iban/compliance and not_checked on a validation. national_check_digits: checked for GB (Vocalink modulus); other countries are being added. A key may be added later; a key is never removed. Present only when valid is true.",
      +  "properties": {
      +    "account_exists": {
      +      "description": "pass | fail | inferred | unknown | not_checked | not_applicable",
      +      "type": "string"
      +    },
      +    "bank_code": {
      +      "description": "pass | fail | inferred | unknown | not_checked | not_applicable",
      +      "type": "string"
      +    },
      +    "bic": {
      +      "description": "pass | fail | inferred | unknown | not_checked | not_applicable",
      +      "type": "string"
      +    },
      +    "country_sanctions": {
      +      "description": "pass | fail | inferred | unknown | not_checked | not_applicable",
      +      "type": "string"
      +    },
      +    "iban_checksum": {
      +      "description": "pass | fail | inferred | unknown | not_checked | not_applicable",
      +      "type": "string"
      +    },
      +    "iban_structure": {
      +      "description": "pass | fail | inferred | unknown | not_checked | not_applicable",
      +      "type": "string"
      +    },
      +    "institution_sanctions": {
      +      "description": "pass | fail | inferred | unknown | not_checked | not_applicable",
      +      "type": "string"
      +    },
      +    "national_check_digits": {
      +      "description": "pass | fail | inferred | unknown | not_checked | not_applicable",
      +      "type": "string"
      +    },
      +    "payee_name": {
      +      "description": "pass | fail | inferred | unknown | not_checked | not_applicable",
      +      "type": "string"
      +    },
      +    "payee_sanctions": {
      +      "description": "pass | fail | inferred | unknown | not_checked | not_applicable",
      +      "type": "string"
      +    },
      +    "sepa_reachability": {
      +      "description": "pass | fail | inferred | unknown | not_checked | not_applicable",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "iban_structure",
      +    "iban_checksum",
      +    "bank_code",
      +    "bic",
      +    "sepa_reachability",
      +    "national_check_digits",
      +    "account_exists",
      +    "payee_name",
      +    "institution_sanctions",
      +    "country_sanctions",
      +    "payee_sanctions"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / sepa / properties / bank_reachability
      Added value: +{
      +  "description": "listed | not_listed | no_bank | bank_code_not_allocated, or null. Whether the EPC scheme registers list the resolved BANK, never borrowed from the country (member, schemes and basis still describe the country and are unchanged). listed: the bank has rows in the SCT, SCT Inst or SDD register. not_listed: it has none (an absence from the register is not an exclusion from the scheme). no_bank: no BIC resolved for this bank code, so no bank could be looked up in the EPC registers (a register may still name the holder: see bank_code_holder and bank_code_check). bank_code_not_allocated: the national register says nobody holds the bank code. null: the registers are not loaded on this deployment (not consulted, never read as not_listed). Absent outside SEPA.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / sepa / properties / bank_schemes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The bank's own schemes from the EPC registers when bank_reachability is listed; [] for an unallocated bank code; null otherwise."
      +}
    • addedOutput schema / properties / sepa / properties / vop_register_status
      Added value: +{
      +  "description": "active | pending | inactive | not_listed, or null. The bank's status in the EPC Verification of Payee register: active (the same as vop_participant true), pending, inactive, or not_listed when the register has no row for it; null when no BIC resolved or the register was not consulted (screened false). Outside the SEPA area the country answers instead of the register (not_listed on POST /v1/iban/compliance) whether or not the register is loaded; the validation carries no sepa.vop_register_status there. It says whether the payee's bank answers VoP requests; IBANforge never runs the name check itself.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  6. Changed2 schema fields changed
    • changedOutput schema / properties / bic / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "address": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "as_of": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "city": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "country": {
      -                "type": "string"
      -              },
      -              "language": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "post_code": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "region": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "romanization": {
      -                "enum": [
      -                  "original_latin",
      -                  "gleif_english",
      -                  "unavailable"
      -                ],
      -                "type": "string"
      -              },
      -              "romanized": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "source": {
      -                "type": "string"
      -              },
      -              "street": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "type": {
      -                "const": "registered",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "type",
      -              "street",
      -              "post_code",
      -              "region",
      -              "city",
      -              "country",
      -              "romanized",
      -              "romanization",
      -              "source",
      -              "language",
      -              "as_of"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "as_of": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "authoritative": {
      -        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. San Marino is where the two part: the pairing is the supervisor’s, the code space is not its to settle.",
      -        "type": "boolean"
      -      },
      -      "bank_name": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "basis": {
      -        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today CH, LI, DE, AT, BE, BG, SK and SM; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      -        "type": "string"
      -      },
      -      "bic8": {
      -        "description": "The eight characters of the institution — the field to compare a supplied BIC against. code is served as the consulted source publishes it, so it is 8 or 11 characters; this one never moves. The branch code (last three characters) is informational: in a cooperative network it names the LOCAL bank and the first eight its clearing institution.",
      -        "type": "string"
      -      },
      -      "city": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "code": {
      -        "type": "string"
      -      },
      -      "lei": {
      -        "description": "GLEIF identity of the resolved BIC holder, not necessarily the bank-code holder.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "lei_status": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "postal_address": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "adr_line": {
      -                "items": {
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              },
      -              "as_of": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "bldg_nb": {
      -                "type": "string"
      -              },
      -              "ctry": {
      -                "type": "string"
      -              },
      -              "format": {
      -                "enum": [
      -                  "structured",
      -                  "hybrid"
      -                ],
      -                "type": "string"
      -              },
      -              "pst_cd": {
      -                "type": "string"
      -              },
      -              "source": {
      -                "type": "string"
      -              },
      -              "strt_nm": {
      -                "type": "string"
      -              },
      -              "twn_nm": {
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "twn_nm",
      -              "ctry",
      -              "format",
      -              "source",
      -              "as_of"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "redirected_from": {
      -        "description": "The bank code asked about, when the register answered for the one that took over its clearing (CH/LI only today: SIX marks an IID concatenated and publishes its successor). The IBAN stays valid — a redirect is not a retirement.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "Source of the bank-code/BIC pairing; keep its provenance.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "source_as_of": {
      -        "description": "Year-month the SOURCE DATA is from, present only when it differs from as_of. as_of dates the import; for the redistributed SWIFT directory the upstream stopped publishing years ago, so as_of alone presents an old bank name as last month's. Absent means no gap has been established, never \"this is current\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "code",
      -      "bank_name",
      -      "city"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "address": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "as_of": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "city": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "country": {
      +                "type": "string"
      +              },
      +              "language": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "post_code": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "region": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "romanization": {
      +                "enum": [
      +                  "original_latin",
      +                  "gleif_english",
      +                  "unavailable"
      +                ],
      +                "type": "string"
      +              },
      +              "romanized": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "street": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "type": {
      +                "const": "registered",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "type",
      +              "street",
      +              "post_code",
      +              "region",
      +              "city",
      +              "country",
      +              "romanized",
      +              "romanization",
      +              "source",
      +              "language",
      +              "as_of"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "as_of": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "authoritative": {
      +        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. San Marino is where the two part: the pairing is the supervisor’s, the code space is not its to settle.",
      +        "type": "boolean"
      +      },
      +      "bank_name": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "basis": {
      +        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE, SK, CZ, BG, CH, LI and SM; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      +        "type": "string"
      +      },
      +      "bic8": {
      +        "description": "The eight characters of the institution — the field to compare a supplied BIC against. code is served as the consulted source publishes it, so it is 8 or 11 characters; this one never moves. The branch code (last three characters) is informational: in a cooperative network it names the LOCAL bank and the first eight its clearing institution.",
      +        "type": "string"
      +      },
      +      "city": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "code": {
      +        "type": "string"
      +      },
      +      "lei": {
      +        "description": "GLEIF identity of the resolved BIC holder, not necessarily the bank-code holder.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "lei_status": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "postal_address": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "adr_line": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "as_of": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "bldg_nb": {
      +                "type": "string"
      +              },
      +              "ctry": {
      +                "type": "string"
      +              },
      +              "format": {
      +                "enum": [
      +                  "structured",
      +                  "hybrid"
      +                ],
      +                "type": "string"
      +              },
      +              "pst_cd": {
      +                "type": "string"
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "strt_nm": {
      +                "type": "string"
      +              },
      +              "twn_nm": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "twn_nm",
      +              "ctry",
      +              "format",
      +              "source",
      +              "as_of"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "redirected_from": {
      +        "description": "The bank code asked about, when the register answered for the one that took over its clearing (CH/LI only today: SIX marks an IID concatenated and publishes its successor). The IBAN stays valid — a redirect is not a retirement.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Source of the bank-code/BIC pairing; keep its provenance.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "source_as_of": {
      +        "description": "Year-month the SOURCE DATA is from, present only when it differs from as_of. as_of dates the import; for the redistributed SWIFT directory the upstream stopped publishing years ago, so as_of alone presents an old bank name as last month's. Absent means no gap has been established, never \"this is current\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "bank_name",
      +      "city"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / sepa / properties / vop_participant / description
      Previous value: -"true = resolved bank is listed as ready in the EPC VoP scheme register; null = no institution resolved."New value: +"true = resolved bank is listed as ready in the EPC VoP scheme register; null = no institution resolved, or the VoP register is not loaded (not consulted); a resolved bank outside the SEPA area is answered false from the country either way."
  7. Changed1 schema field changed
    • changedOutput schema / properties / bic / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "address": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "as_of": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "city": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "country": {
      -                "type": "string"
      -              },
      -              "language": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "post_code": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "region": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "romanization": {
      -                "enum": [
      -                  "original_latin",
      -                  "gleif_english",
      -                  "unavailable"
      -                ],
      -                "type": "string"
      -              },
      -              "romanized": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "source": {
      -                "type": "string"
      -              },
      -              "street": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "type": {
      -                "const": "registered",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "type",
      -              "street",
      -              "post_code",
      -              "region",
      -              "city",
      -              "country",
      -              "romanized",
      -              "romanization",
      -              "source",
      -              "language",
      -              "as_of"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "as_of": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "authoritative": {
      -        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. San Marino is where the two part: the pairing is the supervisor’s, the code space is not its to settle.",
      -        "type": "boolean"
      -      },
      -      "bank_name": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "basis": {
      -        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today CH, LI, DE, AT, BE, BG, SK and SM; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      -        "type": "string"
      -      },
      -      "bic8": {
      -        "description": "The eight characters of the institution — the field to compare a supplied BIC against. code is served as the consulted source publishes it, so it is 8 or 11 characters; this one never moves. The branch code (last three characters) is informational: in a cooperative network it names the LOCAL bank and the first eight its clearing institution.",
      -        "type": "string"
      -      },
      -      "city": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "code": {
      -        "type": "string"
      -      },
      -      "lei": {
      -        "description": "GLEIF identity of the resolved BIC holder, not necessarily the bank-code holder.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "lei_status": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "postal_address": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "adr_line": {
      -                "items": {
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              },
      -              "as_of": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "bldg_nb": {
      -                "type": "string"
      -              },
      -              "ctry": {
      -                "type": "string"
      -              },
      -              "format": {
      -                "enum": [
      -                  "structured",
      -                  "hybrid"
      -                ],
      -                "type": "string"
      -              },
      -              "pst_cd": {
      -                "type": "string"
      -              },
      -              "source": {
      -                "type": "string"
      -              },
      -              "strt_nm": {
      -                "type": "string"
      -              },
      -              "twn_nm": {
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "twn_nm",
      -              "ctry",
      -              "format",
      -              "source",
      -              "as_of"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "redirected_from": {
      -        "description": "The bank code asked about, when the register answered for the one that took over its clearing (CH/LI only today: SIX marks an IID concatenated and publishes its successor). The IBAN stays valid — a redirect is not a retirement.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "Source of the bank-code/BIC pairing; keep its provenance.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "code",
      -      "bank_name",
      -      "city"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "address": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "as_of": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "city": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "country": {
      +                "type": "string"
      +              },
      +              "language": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "post_code": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "region": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "romanization": {
      +                "enum": [
      +                  "original_latin",
      +                  "gleif_english",
      +                  "unavailable"
      +                ],
      +                "type": "string"
      +              },
      +              "romanized": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "street": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "type": {
      +                "const": "registered",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "type",
      +              "street",
      +              "post_code",
      +              "region",
      +              "city",
      +              "country",
      +              "romanized",
      +              "romanization",
      +              "source",
      +              "language",
      +              "as_of"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "as_of": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "authoritative": {
      +        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. San Marino is where the two part: the pairing is the supervisor’s, the code space is not its to settle.",
      +        "type": "boolean"
      +      },
      +      "bank_name": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "basis": {
      +        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today CH, LI, DE, AT, BE, BG, SK and SM; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      +        "type": "string"
      +      },
      +      "bic8": {
      +        "description": "The eight characters of the institution — the field to compare a supplied BIC against. code is served as the consulted source publishes it, so it is 8 or 11 characters; this one never moves. The branch code (last three characters) is informational: in a cooperative network it names the LOCAL bank and the first eight its clearing institution.",
      +        "type": "string"
      +      },
      +      "city": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "code": {
      +        "type": "string"
      +      },
      +      "lei": {
      +        "description": "GLEIF identity of the resolved BIC holder, not necessarily the bank-code holder.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "lei_status": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "postal_address": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "adr_line": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "as_of": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "bldg_nb": {
      +                "type": "string"
      +              },
      +              "ctry": {
      +                "type": "string"
      +              },
      +              "format": {
      +                "enum": [
      +                  "structured",
      +                  "hybrid"
      +                ],
      +                "type": "string"
      +              },
      +              "pst_cd": {
      +                "type": "string"
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "strt_nm": {
      +                "type": "string"
      +              },
      +              "twn_nm": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "twn_nm",
      +              "ctry",
      +              "format",
      +              "source",
      +              "as_of"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "redirected_from": {
      +        "description": "The bank code asked about, when the register answered for the one that took over its clearing (CH/LI only today: SIX marks an IID concatenated and publishes its successor). The IBAN stays valid — a redirect is not a retirement.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Source of the bank-code/BIC pairing; keep its provenance.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "source_as_of": {
      +        "description": "Year-month the SOURCE DATA is from, present only when it differs from as_of. as_of dates the import; for the redistributed SWIFT directory the upstream stopped publishing years ago, so as_of alone presents an old bank name as last month's. Absent means no gap has been established, never \"this is current\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "bank_name",
      +      "city"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  8. Changed1 schema field changed
    • changedOutput schema / properties / bic / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "address": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "as_of": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "city": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "country": {
      -                "type": "string"
      -              },
      -              "language": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "post_code": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "region": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "romanization": {
      -                "enum": [
      -                  "original_latin",
      -                  "gleif_english",
      -                  "unavailable"
      -                ],
      -                "type": "string"
      -              },
      -              "romanized": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "source": {
      -                "type": "string"
      -              },
      -              "street": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "type": {
      -                "const": "registered",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "type",
      -              "street",
      -              "post_code",
      -              "region",
      -              "city",
      -              "country",
      -              "romanized",
      -              "romanization",
      -              "source",
      -              "language",
      -              "as_of"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "as_of": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "authoritative": {
      -        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. In Switzerland the register confirms the code while the BIC still comes from our curated map.",
      -        "type": "boolean"
      -      },
      -      "bank_name": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "basis": {
      -        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE, BG, SK and SM; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      -        "type": "string"
      -      },
      -      "city": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "code": {
      -        "type": "string"
      -      },
      -      "lei": {
      -        "description": "GLEIF identity of the resolved BIC holder, not necessarily the bank-code holder.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "lei_status": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "postal_address": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "adr_line": {
      -                "items": {
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              },
      -              "as_of": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "bldg_nb": {
      -                "type": "string"
      -              },
      -              "ctry": {
      -                "type": "string"
      -              },
      -              "format": {
      -                "enum": [
      -                  "structured",
      -                  "hybrid"
      -                ],
      -                "type": "string"
      -              },
      -              "pst_cd": {
      -                "type": "string"
      -              },
      -              "source": {
      -                "type": "string"
      -              },
      -              "strt_nm": {
      -                "type": "string"
      -              },
      -              "twn_nm": {
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "twn_nm",
      -              "ctry",
      -              "format",
      -              "source",
      -              "as_of"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "source": {
      -        "description": "Source of the bank-code/BIC pairing; keep its provenance.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "code",
      -      "bank_name",
      -      "city"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "address": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "as_of": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "city": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "country": {
      +                "type": "string"
      +              },
      +              "language": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "post_code": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "region": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "romanization": {
      +                "enum": [
      +                  "original_latin",
      +                  "gleif_english",
      +                  "unavailable"
      +                ],
      +                "type": "string"
      +              },
      +              "romanized": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "street": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "type": {
      +                "const": "registered",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "type",
      +              "street",
      +              "post_code",
      +              "region",
      +              "city",
      +              "country",
      +              "romanized",
      +              "romanization",
      +              "source",
      +              "language",
      +              "as_of"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "as_of": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "authoritative": {
      +        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. San Marino is where the two part: the pairing is the supervisor’s, the code space is not its to settle.",
      +        "type": "boolean"
      +      },
      +      "bank_name": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "basis": {
      +        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today CH, LI, DE, AT, BE, BG, SK and SM; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      +        "type": "string"
      +      },
      +      "bic8": {
      +        "description": "The eight characters of the institution — the field to compare a supplied BIC against. code is served as the consulted source publishes it, so it is 8 or 11 characters; this one never moves. The branch code (last three characters) is informational: in a cooperative network it names the LOCAL bank and the first eight its clearing institution.",
      +        "type": "string"
      +      },
      +      "city": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "code": {
      +        "type": "string"
      +      },
      +      "lei": {
      +        "description": "GLEIF identity of the resolved BIC holder, not necessarily the bank-code holder.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "lei_status": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "postal_address": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "adr_line": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "as_of": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "bldg_nb": {
      +                "type": "string"
      +              },
      +              "ctry": {
      +                "type": "string"
      +              },
      +              "format": {
      +                "enum": [
      +                  "structured",
      +                  "hybrid"
      +                ],
      +                "type": "string"
      +              },
      +              "pst_cd": {
      +                "type": "string"
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "strt_nm": {
      +                "type": "string"
      +              },
      +              "twn_nm": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "twn_nm",
      +              "ctry",
      +              "format",
      +              "source",
      +              "as_of"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "redirected_from": {
      +        "description": "The bank code asked about, when the register answered for the one that took over its clearing (CH/LI only today: SIX marks an IID concatenated and publishes its successor). The IBAN stays valid — a redirect is not a retirement.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Source of the bank-code/BIC pairing; keep its provenance.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "bank_name",
      +      "city"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  9. Changed11 schema fields changed
    • addedOutput schema / properties / bank_code_check / properties / check_digit
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "algorithm": {
      +      "type": "string"
      +    },
      +    "valid": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "valid",
      +    "algorithm"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / bank_code_check / properties / institution
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "country": {
      +      "type": "string"
      +    },
      +    "lei": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "name": {
      +      "type": "string"
      +    },
      +    "post_code": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "street": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "town": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "name",
      +    "street",
      +    "post_code",
      +    "town",
      +    "country"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / bic / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "authoritative": {
      -        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. In Switzerland the register confirms the code while the BIC still comes from our curated map.",
      -        "type": "boolean"
      -      },
      -      "bank_name": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "basis": {
      -        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE, BG, SK and SM; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      -        "type": "string"
      -      },
      -      "city": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "code": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "code",
      -      "bank_name",
      -      "city"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "address": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "as_of": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "city": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "country": {
      +                "type": "string"
      +              },
      +              "language": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "post_code": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "region": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "romanization": {
      +                "enum": [
      +                  "original_latin",
      +                  "gleif_english",
      +                  "unavailable"
      +                ],
      +                "type": "string"
      +              },
      +              "romanized": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "street": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "type": {
      +                "const": "registered",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "type",
      +              "street",
      +              "post_code",
      +              "region",
      +              "city",
      +              "country",
      +              "romanized",
      +              "romanization",
      +              "source",
      +              "language",
      +              "as_of"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "as_of": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "authoritative": {
      +        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. In Switzerland the register confirms the code while the BIC still comes from our curated map.",
      +        "type": "boolean"
      +      },
      +      "bank_name": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "basis": {
      +        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE, BG, SK and SM; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      +        "type": "string"
      +      },
      +      "city": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "code": {
      +        "type": "string"
      +      },
      +      "lei": {
      +        "description": "GLEIF identity of the resolved BIC holder, not necessarily the bank-code holder.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "lei_status": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "postal_address": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "adr_line": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "as_of": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "bldg_nb": {
      +                "type": "string"
      +              },
      +              "ctry": {
      +                "type": "string"
      +              },
      +              "format": {
      +                "enum": [
      +                  "structured",
      +                  "hybrid"
      +                ],
      +                "type": "string"
      +              },
      +              "pst_cd": {
      +                "type": "string"
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "strt_nm": {
      +                "type": "string"
      +              },
      +              "twn_nm": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "twn_nm",
      +              "ctry",
      +              "format",
      +              "source",
      +              "as_of"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "source": {
      +        "description": "Source of the bank-code/BIC pairing; keep its provenance.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "bank_name",
      +      "city"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / bic / description
      Removed value: -"Resolved BIC/SWIFT when BBAN→BIC mapping exists. Read basis before storing it as a routing instruction: only a national_register pairing is settlement-grade."
    • changedOutput schema / properties / clearing / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "eurosic": {
      -        "type": "boolean"
      -      },
      -      "iid": {
      -        "type": "string"
      -      },
      -      "instant_payments_chf": {
      -        "type": "boolean"
      -      },
      -      "name": {
      -        "type": "string"
      -      },
      -      "qr_iid": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "sic": {
      -        "type": "boolean"
      -      },
      -      "town": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "type": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "iid",
      -      "name",
      -      "type",
      -      "town",
      -      "sic",
      -      "instant_payments_chf",
      -      "eurosic",
      -      "qr_iid"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "eurosic": {
      +        "type": "boolean"
      +      },
      +      "iid": {
      +        "type": "string"
      +      },
      +      "instant_payments_chf": {
      +        "type": "boolean"
      +      },
      +      "is_qr_iid": {
      +        "type": "boolean"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "qr_iid": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "qr_iid_source": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "register",
      +              "headquarters"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "qr_iids": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "sic": {
      +        "type": "boolean"
      +      },
      +      "town": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "iid",
      +      "name",
      +      "type",
      +      "town",
      +      "sic",
      +      "instant_payments_chf",
      +      "eurosic",
      +      "qr_iid",
      +      "qr_iid_source"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / issuer / properties / iban_issuer
      Added value: +{
      +  "enum": [
      +    "confirmed",
      +    "not_listed"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / issuer / properties / type / description
      Previous value: -"bank | digital_bank | emi | payment_institution"New value: +"bank | digital_bank | emi | payment_institution; null when unsubstantiated"
    • changedOutput schema / properties / issuer / properties / type / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / modulus_check
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "checked": {
      +      "type": "boolean"
      +    },
      +    "passed": {
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "table_fetched_on": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "checked",
      +    "passed",
      +    "source",
      +    "table_fetched_on"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / pra_authorisation
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "authorised": {
      +      "const": true,
      +      "type": "boolean"
      +    },
      +    "basis": {
      +      "type": "string"
      +    },
      +    "firm_name": {
      +      "type": "string"
      +    },
      +    "frn": {
      +      "type": "string"
      +    },
      +    "list_month": {
      +      "type": "string"
      +    },
      +    "section": {
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "authorised",
      +    "firm_name",
      +    "frn",
      +    "section",
      +    "basis",
      +    "source",
      +    "list_month"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / psd_registration
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "as_of": {
      +      "type": "string"
      +    },
      +    "competent_authority": {
      +      "type": "string"
      +    },
      +    "country": {
      +      "type": "string"
      +    },
      +    "entity_type": {
      +      "type": "string"
      +    },
      +    "name": {
      +      "type": "string"
      +    },
      +    "registered": {
      +      "const": true,
      +      "type": "boolean"
      +    },
      +    "source": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "registered",
      +    "entity_type",
      +    "name",
      +    "country",
      +    "competent_authority",
      +    "source",
      +    "as_of"
      +  ],
      +  "type": "object"
      +}
  10. Changed1 schema field changed
    • changedOutput schema / properties / bic / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "authoritative": {
      -        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. In Switzerland the register confirms the code while the BIC still comes from our curated map.",
      -        "type": "boolean"
      -      },
      -      "bank_name": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "basis": {
      -        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE and BG; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      -        "type": "string"
      -      },
      -      "city": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "code": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "code",
      -      "bank_name",
      -      "city"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "authoritative": {
      +        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. In Switzerland the register confirms the code while the BIC still comes from our curated map.",
      +        "type": "boolean"
      +      },
      +      "bank_name": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "basis": {
      +        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE, BG, SK and SM; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      +        "type": "string"
      +      },
      +      "city": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "code": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "bank_name",
      +      "city"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  11. Changed14 schema fields changed
    • removedOutput schema / properties / bank_code_check / properties / match / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / bank_code_check / properties / match / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / bank_code_check / properties / register / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / bank_code_check / properties / register / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / bic / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "authoritative": {
      -        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. In Switzerland the register confirms the code while the BIC still comes from our curated map.",
      -        "type": "boolean"
      -      },
      -      "bank_name": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "basis": {
      -        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE and BG; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      -        "type": "string"
      -      },
      -      "city": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "code": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "code",
      -      "bank_name",
      -      "city"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "authoritative": {
      +        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. In Switzerland the register confirms the code while the BIC still comes from our curated map.",
      +        "type": "boolean"
      +      },
      +      "bank_name": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "basis": {
      +        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE and BG; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      +        "type": "string"
      +      },
      +      "city": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "code": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "bank_name",
      +      "city"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / clearing / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "eurosic": {
      -        "type": "boolean"
      -      },
      -      "iid": {
      -        "type": "string"
      -      },
      -      "instant_payments_chf": {
      -        "type": "boolean"
      -      },
      -      "name": {
      -        "type": "string"
      -      },
      -      "qr_iid": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "sic": {
      -        "type": "boolean"
      -      },
      -      "town": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "type": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "iid",
      -      "name",
      -      "type",
      -      "town",
      -      "sic",
      -      "instant_payments_chf",
      -      "eurosic",
      -      "qr_iid"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "eurosic": {
      +        "type": "boolean"
      +      },
      +      "iid": {
      +        "type": "string"
      +      },
      +      "instant_payments_chf": {
      +        "type": "boolean"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "qr_iid": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "sic": {
      +        "type": "boolean"
      +      },
      +      "town": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "iid",
      +      "name",
      +      "type",
      +      "town",
      +      "sic",
      +      "instant_payments_chf",
      +      "eurosic",
      +      "qr_iid"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / official_identity / properties / address / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / official_identity / properties / address / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / official_identity / properties / lei / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / official_identity / properties / lei / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / risk_indicators / properties / issuer_type / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / risk_indicators / properties / issuer_type / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / sepa / properties / vop_participant / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / sepa / properties / vop_participant / type
      Added value: +[
      +  "boolean",
      +  "null"
      +]
  12. Changed3 schema fields changed
    • addedOutput schema / properties / cost_usdc / description
      Added value: +"What THIS call was billed. Zero on the free MCP tier."
    • addedOutput schema / properties / list_price_usdc
      Added value: +{
      +  "description": "Catalogue price of the same call on the paid REST/x402 route.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / sepa / properties / basis
      Added value: +{
      +  "description": "Where `schemes` came from: read at the EPC register for this bank, or defaulted from the country.",
      +  "enum": [
      +    "country_default",
      +    "epc_register"
      +  ],
      +  "type": "string"
      +}
  13. Changed3 schema fields changed
    • addedOutput schema / properties / bank_code_check / properties / reason
      Added value: +{
      +  "description": "WHY the verdict is not verified, as one token to branch on. Absent when status is verified. not_allocated (a national register denies the code — the only value that licenses \"do not send\") | absent_from_reference_data (our composite map does not carry it; the country register was not consulted) | no_reference_data_for_country | register_names_no_holder (the register defines the code space and publishes no holder — silence, not a denial) | national_register_unavailable (the register this country is normally decided against could not be consulted) | lookup_failed (the lookup could not run: timeout, unreadable database). The last two describe IBANforge, never the beneficiary. Never escalate either into a refusal.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / bic / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "bank_name": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "city": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "code": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "code",
      -      "bank_name",
      -      "city"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "authoritative": {
      +        "description": "Whether this BIC may be stored and settled against. Derived from basis, so the two cannot disagree. NOT bank_code_check.authoritative, which answers a different question — whether a national register was consulted about the BANK CODE. In Switzerland the register confirms the code while the BIC still comes from our curated map.",
      +        "type": "boolean"
      +      },
      +      "bank_name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "basis": {
      +        "description": "Where the bank code to BIC pairing came from, and therefore what may be done with the BIC. national_register (the country register publishes this BIC for this bank code — today DE, AT, BE and BG; settlement-grade) | curated_map (our maintained bank-code map, exact key, usually right and not an allocation record) | directory_prefix (the bic8 LIKE fallback, which can match several institutions — read bank_code_check.candidates). Outside a national_register basis the BIC is ADVISORY: confirm it with the beneficiary or the bank before storing it as a routing instruction.",
      +        "type": "string"
      +      },
      +      "city": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "code": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "bank_name",
      +      "city"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / bic / description
      Previous value: -"Resolved BIC/SWIFT when BBAN→BIC mapping exists."New value: +"Resolved BIC/SWIFT when BBAN→BIC mapping exists. Read basis before storing it as a routing instruction: only a national_register pairing is settlement-grade."
  14. Changed2 schema fields changed
    • changedOutput schema / properties / issuer / properties / classification / description
      Previous value: -"curated | default. 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 97.9% of BIC8 (measured 29/07/2026). Count only curated when sizing virtual-IBAN exposure."New value: +"curated | register | default. Whether the type was established or assumed. curated = the BIC8 is in the issuer set, so this is an identification. register = an official register names the holder of this bank code and says what it is; it carries a date and an authority in psd_registration, and it only ever replaces a default. default = nothing is on file and \"bank\" is the fallback, which covers 97.9% of BIC8 (measured 29/07/2026). Count curated and register when sizing virtual-IBAN exposure, never default."
    • addedOutput schema / properties / official_identity
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Who a central bank says holds the resolved code (ECB by LEI and for FR bank codes, Banco de Espana for ES). Present only on a match — absence is not a negative. INFORMATIONAL ONLY: it never changes valid or bank_code_check, because both publishers relay rather than allocate.",
      +  "properties": {
      +    "address": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "One-line registered address as published."
      +    },
      +    "as_of": {
      +      "description": "Date of the list this row came from. Both lists are republished every business day.",
      +      "type": "string"
      +    },
      +    "attribution": {
      +      "description": "The Banco de Espana citation formula, verbatim. Spanish blocks only.",
      +      "type": "string"
      +    },
      +    "authoritative": {
      +      "description": "Always false. Neither publisher allocates bank codes.",
      +      "type": "boolean"
      +    },
      +    "category": {
      +      "type": "string"
      +    },
      +    "free_of_charge": {
      +      "description": "Both publishers require buyers to be told, on every access, that the data is available free of charge from their own website. Relay it with the answer; do not strip it.",
      +      "type": "string"
      +    },
      +    "lei": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "matched_by": {
      +      "description": "lei | national_code",
      +      "type": "string"
      +    },
      +    "name": {
      +      "description": "The institution's name as the publisher writes it.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "description": "The publisher, cited as their licence requires. Relay it.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "name",
      +    "lei",
      +    "address",
      +    "category",
      +    "matched_by",
      +    "source",
      +    "free_of_charge",
      +    "as_of",
      +    "authoritative"
      +  ],
      +  "type": "object"
      +}
  15. Changed1 schema field changed
    • addedOutput schema / properties / sepa / properties / vop_participant
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "true = resolved bank is listed as ready in the EPC VoP scheme register; null = no institution resolved."
      +}
  16. Changed3 schema fields changed
    • changedOutput schema / properties / bank_code_check / properties / authoritative / description
      Previous value: -"True only where the reference set is the national register (CH, LI). Only then does not_in_register mean the code is not allocated."New value: +"True only where the reference set is the national register (CH, LI, DE). Only then does not_in_register mean the code is not allocated."
    • addedOutput schema / properties / bank_code_check / properties / retired
      Added value: +{
      +  "description": "True when an authoritative register is withdrawing the code. Still a verified result: it WAS allocated.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / bank_code_check / properties / superseded_by
      Added value: +{
      +  "description": "The bank code that takes over. Re-paper the beneficiary against it.",
      +  "type": "string"
      +}
  17. Changed1 schema field changed
    • addedOutput schema / properties / next_steps
      Added value: +{
      +  "description": "Ordered advice derived from THIS result: what blocks a payment first, what merely enriches it after. Branch on `code`, never on the prose. `because` names the field that produced the step so the advice is auditable. Empty for an IBAN that failed validation.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "description": "An IBANforge call that performs the step, when one exists.",
      +        "type": "string"
      +      },
      +      "because": {
      +        "description": "The response field that produced this step.",
      +        "type": "string"
      +      },
      +      "code": {
      +        "description": "Stable identifier. Branch on this.",
      +        "type": "string"
      +      },
      +      "do": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "do",
      +      "because"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  18. Changed8 schema fields changed
    • addedOutput schema / properties / bank_code_check
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "as_of": {
      +      "type": "string"
      +    },
      +    "authoritative": {
      +      "description": "True only where the reference set is the national register (CH, LI). Only then does not_in_register mean the code is not allocated.",
      +      "type": "boolean"
      +    },
      +    "candidates": {
      +      "description": "BIC8 the prefix matched; >1 means the BIC may belong to another institution.",
      +      "type": "number"
      +    },
      +    "match": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "register (exact key) | prefix (bic8 LIKE heuristic) | null"
      +    },
      +    "register": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "status": {
      +      "description": "verified | not_in_register | unavailable. A separate verdict on the bank code, so bic:null stops meaning three different things.",
      +      "type": "string"
      +    },
      +    "value": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "value",
      +    "status",
      +    "match",
      +    "register",
      +    "authoritative",
      +    "as_of"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / issuer / properties / classification
      Added value: +{
      +  "description": "curated | default. 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 97.9% of BIC8 (measured 29/07/2026). Count only curated when sizing virtual-IBAN exposure.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / issuer / required
      Previous value: -[
      -  "type",
      -  "name"
      -]New value: +[
      +  "type",
      +  "name",
      +  "classification"
      +]
    • addedOutput schema / properties / risk_indicators / properties / issuer_type / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / risk_indicators / properties / issuer_type / description
      Added value: +"Null when no institution resolved — it no longer defaults to \"bank\"."
    • removedOutput schema / properties / risk_indicators / properties / issuer_type / type
      Removed value: -"string"
    • addedOutput schema / properties / risk_indicators / properties / sepa_reachable_scope
      Added value: +{
      +  "description": "Scope the reachability holds at. Country-derived, not account-derived.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / risk_indicators / required
      Previous value: -[
      -  "issuer_type",
      -  "country_risk",
      -  "test_bic",
      -  "sepa_reachable",
      -  "vop_coverage"
      -]New value: +[
      +  "issuer_type",
      +  "country_risk",
      +  "test_bic",
      +  "sepa_reachable",
      +  "sepa_reachable_scope",
      +  "vop_coverage"
      +]
  19. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "bban": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "account_number": {
      +          "type": "string"
      +        },
      +        "bank_code": {
      +          "type": "string"
      +        },
      +        "branch_code": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "bank_code",
      +        "account_number"
      +      ],
      +      "type": "object"
      +    },
      +    "bic": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "bank_name": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "city": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "code": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "code",
      +            "bank_name",
      +            "city"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Resolved BIC/SWIFT when BBAN→BIC mapping exists."
      +    },
      +    "check_digits": {
      +      "type": "string"
      +    },
      +    "clearing": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "eurosic": {
      +              "type": "boolean"
      +            },
      +            "iid": {
      +              "type": "string"
      +            },
      +            "instant_payments_chf": {
      +              "type": "boolean"
      +            },
      +            "name": {
      +              "type": "string"
      +            },
      +            "qr_iid": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "sic": {
      +              "type": "boolean"
      +            },
      +            "town": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "type": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "iid",
      +            "name",
      +            "type",
      +            "town",
      +            "sic",
      +            "instant_payments_chf",
      +            "eurosic",
      +            "qr_iid"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Swiss clearing data when country is CH or LI."
      +    },
      +    "cost_usdc": {
      +      "type": "number"
      +    },
      +    "country": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "code": {
      +          "description": "ISO 3166-1 alpha-2 country code.",
      +          "type": "string"
      +        },
      +        "name": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "code",
      +        "name"
      +      ],
      +      "type": "object"
      +    },
      +    "error": {
      +      "type": "string"
      +    },
      +    "error_detail": {
      +      "type": "string"
      +    },
      +    "formatted": {
      +      "description": "IBAN with 4-char groups for display.",
      +      "type": "string"
      +    },
      +    "iban": {
      +      "description": "Normalized IBAN (uppercase, no spaces).",
      +      "type": "string"
      +    },
      +    "issuer": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "name": {
      +          "type": "string"
      +        },
      +        "type": {
      +          "description": "bank | digital_bank | emi | payment_institution",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "type",
      +        "name"
      +      ],
      +      "type": "object"
      +    },
      +    "processing_ms": {
      +      "type": "number"
      +    },
      +    "risk_indicators": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "country_risk": {
      +          "type": "string"
      +        },
      +        "issuer_type": {
      +          "type": "string"
      +        },
      +        "sepa_reachable": {
      +          "type": "boolean"
      +        },
      +        "test_bic": {
      +          "type": "boolean"
      +        },
      +        "vop_coverage": {
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "issuer_type",
      +        "country_risk",
      +        "test_bic",
      +        "sepa_reachable",
      +        "vop_coverage"
      +      ],
      +      "type": "object"
      +    },
      +    "sepa": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "member": {
      +          "type": "boolean"
      +        },
      +        "schemes": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "vop_required": {
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "member",
      +        "schemes",
      +        "vop_required"
      +      ],
      +      "type": "object"
      +    },
      +    "valid": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "iban",
      +    "valid",
      +    "cost_usdc"
      +  ],
      +  "type": "object"
      +}
  20. First observed

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint, idempotentHint, destructiveHint=false) already establish a safe read, yet the description goes far beyond them: it explains that valid revnum only means well-formed, defines bank_code_holder states, discloses that bic: null conflates three causes, names the registers where not_in_register is authoritative, warns that non-register BICs are advisory, and lists cost/rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Headings (USE WHEN, RETURNS, LIMITS, COST) give it structure and it is front-loaded, but for a one-parameter tool it is very long and packs dense parentheticals (Swiss IID example, LEI/address as_of explanation) that a reader must wade through. Much earns its place, but trimming would improve scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite a rich output schema already existing, the description supplies the interpretive layer an agent needs: meanings of valid vs bank_code_holder, status vocabulary for checks and national_check_digits, the DE warning nuance, and explicit LIMITS about account existence and payee verification. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter and schema description coverage is 100%, so the schema already documents iban and its whitespace/hyphen stripping. The prose adds no new syntax or format semantics for the input itself, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening states a specific verb and resource (verify an IBAN, in 89 countries) plus the enrichment scope (bank, compliance, routing data). It is immediately distinguishable from siblings like lookup_bic or validate_payment_reference without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The USE WHEN block enumerates concrete triggering situations (IBAN present, typo detection, issuing-bank identification, neobank/EMI determination, SEPA reachability, VoP support, pasted two-letter-plus-digits strings). It also explicitly names the alternative to avoid (local mod-97 checksum) and says why this tool supersedes it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.