IBANforge
Validate up to 100 IBANs in one call at $0.002 per IBAN (2.5x cheaper per IBAN than single calls at $0.005, and one settlement instead of N). Use for CSV cleanup, customer DB dedup, or pre-flight payout list triage. Production · server processing <5ms (network excluded — measure your own round trip on GET /ping) for a 100-IBAN batch · 121,000+ BICs · v1.4.3.
The wallet the 402 directs payment to. Its whole payment record — every payer, every chain — is on the merchant page.
Asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
The payTo wallet does not resolve to a registered ERC-8004 agent. That is not a verdict on the service — most of the catalog is unregistered.
Accepts
The payment requirements as published to the catalog. Read the live 402 before paying — a price here is a claim, not a quote.
Pay 0.004 USDC on Base to 0xD13b…40a55. The signed payment is good for 1 minute.
- Paid to
- 0xD13b…40a55
- USD Coin contract
- 0x8335…02913
- Payment window
- 1 minute
- As published
- 4000 smallest units
The catalog’s raw entry
[
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"version": "2"
},
"payTo": "0xD13bD0A4120BA301125290e5cc0c7EFD4CB40a55",
"amount": "4000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 60
}
]Extensions
{
"bazaar": {
"info": {
"input": {
"body": {
"ibans": [
"CH1000230000000012345",
"DE89370400440532013000"
]
},
"type": "http",
"method": "POST",
"schema": {
"type": "object",
"required": [
"ibans"
],
"properties": {
"ibans": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"description": "Array of 1 to 100 IBAN strings."
}
}
},
"bodyType": "json",
"discoverable": true
},
"output": {
"type": "json",
"example": {
"count": 2,
"results": [
{
"bic": {
"city": "Zürich",
"code": "UBSWCHZH",
"bank_name": "UBS Switzerland AG"
},
"iban": "CH1000230000000012345",
"valid": true,
"country": {
"code": "CH",
"name": "Switzerland"
}
},
{
"bic": {
"city": "Köln",
"code": "COBADEFFXXX",
"bank_name": "Commerzbank"
},
"iban": "DE89370400440532013000",
"valid": true,
"country": {
"code": "DE",
"name": "Germany"
}
}
],
"cost_usdc": 0.004,
"valid_count": 2,
"_example_notice": "ILLUSTRATIVE SAMPLE — these are demo values for a fixed record, NOT the data for the resource you requested. Do not report them to a user. Authenticate (Authorization: Bearer ifk_...) or pay via x402 to get the real response."
}
}
},
"schema": {
"properties": {
"input": {
"required": [
"method"
],
"properties": {
"method": {
"enum": [
"POST"
],
"type": "string"
}
}
}
}
},
"bodyType": "json",
"inputSchema": {
"type": "object",
"required": [
"ibans"
],
"properties": {
"ibans": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"description": "Array of 1 to 100 IBAN strings."
}
}
},
"discoverable": true,
"outputSchema": {
"type": "object",
"properties": {
"count": {
"type": "number",
"description": "Total IBANs processed."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"bic": {
"type": "object",
"properties": {
"city": {
"type": "string"
},
"code": {
"type": "string"
},
"bank_name": {
"type": "string"
}
},
"description": "Resolved BIC/SWIFT (when BBAN→BIC mapping exists). Null when unresolved."
},
"bban": {
"type": "object",
"properties": {
"bank_code": {
"type": "string"
},
"branch_code": {
"type": "string"
},
"account_number": {
"type": "string"
}
}
},
"iban": {
"type": "string",
"description": "Normalized IBAN (uppercase, no spaces)."
},
"sepa": {
"type": "object",
"properties": {
"member": {
"type": "boolean"
},
"schemes": {
"type": "array",
"items": {
"enum": [
"SCT",
"SDD",
"SCT_INST"
],
"type": "string"
}
},
"vop_required": {
"type": "boolean",
"description": "Verification of Payee (EU 2024/886) obligation for this country."
}
}
},
"valid": {
"type": "boolean"
},
"issuer": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"type": {
"enum": [
"bank",
"digital_bank",
"emi",
"payment_institution"
],
"type": "string"
},
"classification": {
"enum": [
"curated",
"default"
],
"type": "string",
"description": "curated = identified from the issuer set; default = 'bank' fallback, 97.9% of BIC8."
}
}
},
"country": {
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "ISO 3166-1 alpha-2."
},
"name": {
"type": "string"
}
}
},
"clearing": {
"type": "object",
"properties": {
"iid": {
"type": "string",
"description": "5-digit zero-padded BC-Nummer."
},
"sic": {
"type": "boolean"
},
"name": {
"type": "string"
},
"town": {
"type": "string"
},
"type": {
"enum": [
"bank",
"cantonal_bank",
"postfinance",
"raiffeisen",
"central_bank",
"foreign_participant"
],
"type": "string"
},
"qr_iid": {
"type": "string",
"description": "QR-IID allocation, null when none."
},
"eurosic": {
"type": "boolean"
},
"instant_payments_chf": {
"type": "boolean"
}
},
"description": "Swiss clearing data when country is CH or LI and the IID is in the SIX BankMaster. Null otherwise."
},
"cost_usdc": {
"type": "number"
},
"formatted": {
"type": "string",
"description": "IBAN with 4-char groups, e.g. CH10 0023 0000 0000 1234 5."
},
"next_steps": {
"type": "array",
"items": {
"type": "object",
"required": [
"code",
"do",
"because"
],
"properties": {
"do": {
"type": "string",
"description": "The instruction, in one sentence an agent can relay to a person."
},
"code": {
"type": "string",
"description": "Stable identifier. Today: bank_code_not_allocated (the national register denies the code, do not send), bank_code_retired (allocated but being withdrawn, re-paper against superseded_by), verify_payee_name (we cannot confirm it, treat as unavailable and let a name check decide), bic_is_advisory (the BIC was picked from several candidates), issuer_not_a_known_iban_issuer (the code resolves to a BIC, but its holder is not among the providers known to issue IBANs in that country), test_bic, expect_virtual_iban (curated non-bank issuer, account holder and IBAN holder often differ), screen_compliance, generate_payment_qr (partner handoff to PayQR on a register-confirmed SEPA account: generate and self-check a SPAYD or EPC/GiroCode payment QR)."
},
"action": {
"type": "string",
"description": "The call that performs the step, when one exists: an IBANforge endpoint, or the partner site for a partner handoff."
},
"because": {
"type": "string",
"description": "The field of this response that produced the step, so the advice is auditable."
}
}
},
"description": "Ordered advice derived from THIS result: what blocks a payment first, what merely enriches it after. Branch on `code`, never on the prose. Absent or empty for an IBAN that failed validation, since the error already says what to do."
},
"check_digits": {
"type": "string"
},
"processing_ms": {
"type": "number"
},
"bank_code_check": {
"type": "object",
"required": [
"value",
"status",
"match",
"register",
"authoritative",
"as_of"
],
"properties": {
"as_of": {
"type": "string",
"description": "Year-month the consulted reference set was last refreshed."
},
"match": {
"enum": [
"register",
"prefix",
null
],
"type": [
"string",
"null"
],
"description": "register: exact key in the reference set, deterministic. prefix: the bic8 LIKE fallback, reachable only in the 30 countries whose bank code may open on a letter (a BIC8 always does) — check candidates."
},
"value": {
"type": "string",
"description": "The bank code that was actually checked. Normally identical to bban.bank_code. It differs in Finland, where the monetary institution code is 1 to 4 characters depending on its leading digits while bban.bank_code stays the fixed positional slice: a Nordea IBAN carries bban.bank_code \"123\" and value \"1\". When they differ, this field is the one the verdict is about."
},
"status": {
"enum": [
"verified",
"not_in_register",
"unavailable"
],
"type": "string",
"description": "verified: resolves to an institution we can name. not_in_register: it does not, in reference data we do hold for this country — actionable as non-existence ONLY when authoritative is true. unavailable: we hold no reference data for this country, so no opinion."
},
"retired": {
"type": "boolean",
"description": "Present and true when an authoritative register marks the code for deletion: the institution is being retired. The code WAS allocated, so this is a verified result, not a denial. See superseded_by."
},
"register": {
"type": [
"string",
"null"
],
"description": "Name of the reference set consulted."
},
"candidates": {
"type": "integer",
"description": "BIC8 the prefix search matched. Present only for match=prefix. Greater than 1 means the returned BIC is one of several and may belong to a different institution than the account does."
},
"institution": {
"type": "object",
"required": [
"name",
"street",
"post_code",
"town",
"country"
],
"properties": {
"lei": {
"type": [
"string",
"null"
],
"description": "Legal Entity Identifier, where the register publishes one (the OeNB does, 99% of entries)."
},
"name": {
"type": "string"
},
"town": {
"type": [
"string",
"null"
]
},
"street": {
"type": [
"string",
"null"
],
"description": "One line, house number included, matching the GLEIF shape. Null where the register publishes none (DE, BE)."
},
"country": {
"type": "string"
},
"post_code": {
"type": [
"string",
"null"
]
}
},
"description": "What the national register publishes about the allocated institution. Present only on an authoritative answer — composite-map hits stay bare (naming a BIC holder is the bic block, and its address would imply a register that was not consulted). Depth varies by register: SIX (CH/LI) and the OeNB (AT) publish the full seat address, the Bundesbank (DE) publishes postal code and town only, the BNB (BE) publishes names alone; Finland stays without this block, its codes belong to banking groups. Absent fields are null, never guessed. This is the institution allocated the BANK CODE — not a branch, and not proof of any account."
},
"authoritative": {
"type": "boolean",
"description": "True only where that reference set is the national register: today CH and LI against the SIX BankMaster, DE against the Bundesbank Bankleitzahlendatei, FI against the Finance Finland monetary institution list, AT against the Oesterreichische Nationalbank SEPA-Zahlungsverkehrs-Verzeichnis, and BE against the Banque nationale de Belgique bank identification codes. This is the flag to branch on: everywhere else an absence is evidence of absence from our data, not of non-existence. One asymmetry worth knowing: CH, LI, DE, AT and BE allocate codes to individual institutions, while FI allocates prefixes to banking groups, so a Finnish verified confirms the group and its BIC rather than one specific bank. The negative direction carries full weight in all six."
},
"superseded_by": {
"type": "string",
"description": "The bank code that takes over, when the register names one. Re-paper the beneficiary against it."
}
},
"description": "Separate verdict on the BBAN bank code. `valid` answers ISO 13616 (structure + mod-97) and says nothing about whether the bank code identifies an institution; this field answers that, and states how much weight the answer carries. Present only when the IBAN is valid."
},
"risk_indicators": {
"type": "object",
"properties": {
"test_bic": {
"type": "boolean"
},
"issuer_type": {
"enum": [
"bank",
"digital_bank",
"emi",
"payment_institution",
null
],
"type": [
"string",
"null"
],
"description": "Null when no institution resolved. It no longer defaults to \"bank\" for an institution we did not find."
},
"country_risk": {
"enum": [
"standard",
"elevated",
"high"
],
"type": "string"
},
"vop_coverage": {
"type": "boolean"
},
"sepa_reachable": {
"type": "boolean"
},
"sepa_reachable_scope": {
"enum": [
"country"
],
"type": "string",
"description": "Scope sepa_reachable holds at. Derived from the country, never from the account."
}
},
"description": "AML/CFT pre-screening indicators."
}
}
}
},
"cost_usdc": {
"type": "number",
"description": "Actual USDC charged for this call."
},
"valid_count": {
"type": "number",
"description": "Number of valid IBANs."
}
}
}
}
}Provenance
- Seen in the source catalog
- 2026-08-17 05:18Z
- Last indexed by Roundhouse
- 2026-09-16 05:20Z
- Last enriched (probe, favicon, geo)
- 2026-09-10 03:45Z
- x402 version
- 2
- Max timeout
- 60s
- Liveness probe
- HTTP 402
Hand this page to an agent
Copy the prompt and paste it into Claude, an MCP client or your own agent — it will vet this service and call it over the free read API. No key, no account.
GET api.roundhouseai.io/v0/endpoints
This endpoint's own trailing-30-day call count, as published by the upstream catalog and snapshotted daily. 23 snapshots so far. Verified volume counts only settlements with an on-chain EIP-3009 marker.
Show the promptHide the prompt
Using Roundhouse, look up the x402 service IBANforge and tell me whether it is worth paying: what a call costs, whether the endpoint answered when last probed, and what its payment record actually shows. curl -s 'https://api.roundhouseai.io/v0/endpoints?q=IBANforge' curl -s 'https://api.roundhouseai.io/v0/merchants/<the payTo wallet returned above>' Then call it: read the price from the live 402 at https://api.ibanforge.com/v1/iban/batch, never from a cached figure, and pay with an x402 client. The /v0 API needs an API key (`authorization: Bearer rh_live_…`) on everything except /v0/unified* and /v0/endpoints. Mint a personal key for $0.01 at GET https://api.roundhouseai.io/v0/test/x402, or use an organization key from https://roundhouseai.io/dashboard/team. If you do not have Roundhouse tools or skills installed, read https://roundhouseai.io/skill.md first — it is the whole procedure.