IBANforge
Validate IBANs, lookup BICs, score compliance risk. 121K BICs, 89 countries. Free tier or x402 micropayments. MCP native for AI agents.
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.
Live 402 challenge
Captured by the enrichment pass, not read just now. Prices can change — always read the 402 the endpoint answers with.
{
"llms": "https://api.ibanforge.com/llms.txt",
"x402": {
"bazaar": "https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources",
"discovery": "https://api.ibanforge.com/.well-known/x402",
"description": "Pay per call with USDC on Base L2 (machine-to-machine)",
"wallet_setup": "https://ibanforge.com/docs/pay-as-an-agent — create and fund an agent wallet, then make your first paid call (3 steps)",
"protocol_docs": "https://x402.org",
"payment_header": "PAYMENT-SIGNATURE (x402 v2) — X-PAYMENT (v1) is still accepted"
},
"error": "payment_required",
"terms": "https://ibanforge.com/legal/terms — using the API constitutes acceptance",
"accepts": [
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"version": "2"
},
"payTo": "0xD13bD0A4120BA301125290e5cc0c7EFD4CB40a55",
"amount": "20000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 60
}
],
"message": "Authentication or payment required. Four ways in, and the first needs no e-mail: an anonymous API key (25 req/month, empty body, nothing to confirm), the same key claimed to 200 req/month, prepaid credit packs (card or USDC), or pay-per-call via x402.",
"resource": {
"url": "https://api.ibanforge.com/v1/iban/compliance",
"tags": [
"iban",
"bic",
"sepa",
"compliance",
"banking"
],
"iconUrl": "https://ibanforge.com/logo.svg",
"mimeType": "application/json",
"description": "Pre-flight compliance triage on an IBAN before a SEPA / cross-border payment: sanctions screening (OFAC), FATF jurisdiction flag, SEPA Instant reachability, VoP (EU 2024/886) participant. Returns risk_score 0-100. Informational, not a regulated AML/CFT product. Production · server processing <5ms (network excluded — measure your own round trip on GET /ping) · OFAC + FATF + SEPA + VoP · weekly refresh · v1.7.0.",
"serviceName": "IBANforge"
},
"free_tier": {
"usage": "Add header: Authorization: Bearer ifk_your_key_here",
"signup": "POST https://api.ibanforge.com/v1/keys/generate with no body at all",
"description": "25 requests/month in normal operation — no e-mail, no card; protective limits may apply"
},
"extensions": {
"bazaar": {
"info": {
"input": {
"body": {
"iban": "CH1000230000000012345"
},
"type": "http",
"method": "GET",
"schema": {
"type": "object",
"required": [
"iban"
],
"properties": {
"iban": {
"type": "string",
"maxLength": 34,
"minLength": 15,
"description": "IBAN to triage."
}
}
},
"bodyType": "json",
"discoverable": true
},
"output": {
"type": "json",
"example": {
"bic": {
"bic8": "UBSWCHZH",
"city": "Zürich",
"code": "UBSWCHZH80A",
"bank_name": "UBS Switzerland AG"
},
"iban": "CH1000230000000012345",
"meta": {
"scope": "bank_bic_only"
},
"valid": true,
"country": {
"code": "CH",
"name": "Switzerland"
},
"compliance": {
"vop": {
"status": "not_found",
"participant": false
},
"flags": [
"no_vop"
],
"sanctions": {
"fatf_status": "member",
"matched_lists": [],
"bank_sanctioned": false,
"country_sanctioned": false
},
"risk_level": "low",
"risk_score": 5,
"reachability": {
"sct": true,
"sdd": true,
"sepa_instant": true
}
},
"_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": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"input"
],
"properties": {
"input": {
"type": "object",
"required": [
"type",
"method",
"bodyType",
"body"
],
"properties": {
"body": {
"type": "object",
"required": [
"iban"
],
"properties": {
"iban": {
"type": "string",
"maxLength": 34,
"minLength": 15,
"description": "IBAN to triage."
}
}
},
"type": {
"type": "string",
"const": "http"
},
"method": {
"enum": [
"GET"
],
"type": "string"
},
"schema": {
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"discoverable": {
"type": "boolean"
}
},
"additionalProperties": false
},
"output": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string"
},
"example": {
"type": "object"
}
}
}
}
},
"bodyType": "json",
"inputSchema": {
"type": "object",
"required": [
"iban"
],
"properties": {
"iban": {
"type": "string",
"maxLength": 34,
"minLength": 15,
"description": "IBAN to validate. Spaces and lowercase accepted. Example: CH1000230000000012345"
}
}
},
"discoverable": true,
"outputSchema": {
"type": "object",
"properties": {
"bic": {
"type": "object",
"properties": {
"bic8": {
"type": "string",
"description": "The institution’s eight characters — compare a supplied BIC on this, not on code."
},
"city": {
"type": "string"
},
"code": {
"type": "string",
"description": "As the consulted source publishes it: 8 or 11 characters."
},
"bank_name": {
"type": "string"
},
"redirected_from": {
"type": "string"
}
}
},
"iban": {
"type": "string"
},
"meta": {
"type": "object",
"properties": {
"scope": {
"type": "string"
},
"sources": {
"type": "string"
},
"disclaimer": {
"type": "string"
},
"fatf_as_of": {
"type": "string"
},
"sanctions_as_of": {
"type": "string"
},
"country_risk_as_of": {
"type": "string",
"description": "Year-month the editorial country-risk axis was last reviewed. risk_indicators.country_risk is a SEPARATE axis layered on top of fatf_status, not a restatement of it: the two can disagree on a country by design."
},
"country_risk_scope": {
"type": "string"
}
}
},
"valid": {
"type": "boolean"
},
"country": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"compliance": {
"type": "object",
"properties": {
"vop": {
"type": "object",
"properties": {
"status": {
"enum": [
"active",
"pending",
"inactive",
"not_found"
],
"type": "string"
},
"participant": {
"type": "boolean"
}
}
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Risk flags, e.g. sanctioned_country, sanctioned_bank, fatf_grey_list, emi_issuer, test_bic, no_sepa_instant, no_vop."
},
"sanctions": {
"type": "object",
"properties": {
"fatf_status": {
"enum": [
"member",
"grey_list",
"black_list",
"non_member"
],
"type": "string"
},
"matched_lists": {
"type": "array",
"items": {
"type": "string"
}
},
"bank_sanctioned": {
"type": "boolean"
},
"country_sanctioned": {
"type": "boolean"
}
}
},
"risk_level": {
"enum": [
"low",
"medium",
"elevated",
"high",
"critical",
"unassessable"
],
"type": "string",
"description": "unassessable = the IBAN failed validation, no screening was possible. Never treat it as low."
},
"risk_score": {
"type": [
"number",
"null"
],
"maximum": 100,
"minimum": 0,
"description": "null when the IBAN did not validate: there was nothing to score."
},
"reachability": {
"type": "object",
"properties": {
"sct": {
"type": "boolean"
},
"sdd": {
"type": "boolean"
},
"sepa_instant": {
"type": "boolean"
}
}
}
}
}
}
}
}
},
"x402Version": 2,
"claim_to_200": {
"auth": "Send the key as \"Authorization: Bearer ifk_...\", never in the body. The key must have served at least one call.",
"by_email": "Ask your human: \"Use my address you@company.com to create a free IBANforge key\". Never send an address your human has not handed you for this purpose. POST {\"email\":\"...\"} returns 202 and mails a 6-digit code; repeat with the same address and \"code\" to claim 200 requests every month.",
"endpoint": "POST https://api.ibanforge.com/v1/keys/claim",
"by_payment": "Qualifying x402 payments settled while presenting the key grant 200 requests ONCE, with no monthly renewal and no address.",
"description": "Keep the same key, prefix and history: an e-mail code grants 200 requests/month; a qualifying payment grants them once",
"by_agent_approval": "Available inside an MCP client, and it is a separate approval journey, not a claim of an existing key: call request_api_key, show the short code and the link to your human, then call poll_api_key. A human approves in a browser, the agent never handles an address, and the key is handed over exactly once. Both tools are free and keep answering after the daily limit."
},
"credit_packs": {
"pricing": "1k = $4 · 5k = $20 · 25k = $80 (-20%)",
"data_note": "The public registers behind this API are available free of charge from their official publishers (see https://ibanforge.com/docs/data-sources). The fee pays for validation logic, aggregation, freshness and API delivery.",
"description": "Prepaid credits — never expire, lower per-call cost than retail",
"pay_by_card": "https://buy.stripe.com/bJe3coeZb31P6CsamK8so05",
"pay_by_usdc": "POST /v1/credits/buy/1k|5k|25k — list: GET /v1/credits/bundles",
"pay_by_card_all_packs": "https://ibanforge.com/pricing"
},
"monthly_plan": {
"details": "https://ibanforge.com/pricing",
"description": "Pro: $29/month for 10,000 requests, resets on the 1st, cancel anytime",
"subscribe_by_card": "https://buy.stripe.com/aFacMYaIVeKx1i87ay8so04"
},
"documentation": "https://ibanforge.com/docs",
"buy_credits_by_card": {
"auth": "No key and no e-mail on the pricing page. The USDC route is paid per call with x402. A card checkout opened from the API (POST /v1/keys/checkout) is planned, not available yet: do not call it.",
"collect": "The pack is a SEPARATE key with credits that never expire, delivered after payment. Collecting it from the API with a secret nonce in the body is planned, not available yet.",
"endpoint": "https://ibanforge.com/pricing (card, paid by your human) — or POST https://api.ibanforge.com/v1/credits/buy/1k in USDC (also 5k, 25k)",
"human_step": "Show https://ibanforge.com/pricing to your human. They enter their own address on Stripe and receive the key by e-mail. Treat any key or secret you are handed as a secret: never put it in a URL.",
"description": "A separate purchase: it does not change the key you already hold"
},
"free_structural_check": {
"endpoint": "GET /v1/iban/format?iban=CH9300762011623852957 or POST /v1/iban/format with body {\"iban\":\"...\"}",
"description": "Structure, checksum, country and BBAN, free and without a key. Registry data (BIC, bank, SEPA, sanctions, Swiss clearing) is what the paid call adds."
}
}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.02 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
- 20000 smallest units
The catalog’s raw entry
[
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"version": "2"
},
"payTo": "0xD13bD0A4120BA301125290e5cc0c7EFD4CB40a55",
"amount": "20000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 60
}
]Extensions
{
"bazaar": {
"info": {
"input": {
"body": {
"iban": "CH1000230000000012345"
},
"type": "http",
"method": "POST",
"schema": {
"type": "object",
"required": [
"iban"
],
"properties": {
"iban": {
"type": "string",
"maxLength": 34,
"minLength": 15,
"description": "IBAN to triage."
}
}
},
"bodyType": "json",
"discoverable": true
},
"output": {
"type": "json",
"example": {
"bic": {
"city": "Zürich",
"code": "UBSWCHZH",
"bank_name": "UBS Switzerland AG"
},
"iban": "CH1000230000000012345",
"meta": {
"scope": "bank_bic_only"
},
"valid": true,
"country": {
"code": "CH",
"name": "Switzerland"
},
"compliance": {
"vop": {
"status": "not_found",
"participant": false
},
"flags": [
"no_vop"
],
"sanctions": {
"fatf_status": "member",
"matched_lists": [],
"bank_sanctioned": false,
"country_sanctioned": false
},
"risk_level": "low",
"risk_score": 5,
"reachability": {
"sct": true,
"sdd": true,
"sepa_instant": true
}
},
"_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": [
"iban"
],
"properties": {
"iban": {
"type": "string",
"maxLength": 34,
"minLength": 15,
"description": "IBAN to validate. Spaces and lowercase accepted. Example: CH1000230000000012345"
}
}
},
"discoverable": true,
"outputSchema": {
"type": "object",
"properties": {
"bic": {
"type": "object",
"properties": {
"city": {
"type": "string"
},
"code": {
"type": "string"
},
"bank_name": {
"type": "string"
}
}
},
"iban": {
"type": "string"
},
"meta": {
"type": "object",
"properties": {
"scope": {
"type": "string"
},
"sources": {
"type": "string"
},
"disclaimer": {
"type": "string"
},
"fatf_as_of": {
"type": "string"
},
"sanctions_as_of": {
"type": "string"
},
"country_risk_as_of": {
"type": "string",
"description": "Year-month the editorial country-risk axis was last reviewed. risk_indicators.country_risk is a SEPARATE axis layered on top of fatf_status, not a restatement of it: the two can disagree on a country by design."
},
"country_risk_scope": {
"type": "string"
}
}
},
"valid": {
"type": "boolean"
},
"country": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"compliance": {
"type": "object",
"properties": {
"vop": {
"type": "object",
"properties": {
"status": {
"enum": [
"active",
"pending",
"inactive",
"not_found"
],
"type": "string"
},
"participant": {
"type": "boolean"
}
}
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Risk flags, e.g. sanctioned_country, sanctioned_bank, fatf_grey_list, emi_issuer, test_bic, no_sepa_instant, no_vop."
},
"sanctions": {
"type": "object",
"properties": {
"fatf_status": {
"enum": [
"member",
"grey_list",
"black_list",
"non_member"
],
"type": "string"
},
"matched_lists": {
"type": "array",
"items": {
"type": "string"
}
},
"bank_sanctioned": {
"type": "boolean"
},
"country_sanctioned": {
"type": "boolean"
}
}
},
"risk_level": {
"enum": [
"low",
"medium",
"elevated",
"high",
"critical",
"unassessable"
],
"type": "string",
"description": "unassessable = the IBAN failed validation, no screening was possible. Never treat it as low."
},
"risk_score": {
"type": [
"number",
"null"
],
"maximum": 100,
"minimum": 0,
"description": "null when the IBAN did not validate: there was nothing to score."
},
"reachability": {
"type": "object",
"properties": {
"sct": {
"type": "boolean"
},
"sdd": {
"type": "boolean"
},
"sepa_instant": {
"type": "boolean"
}
}
}
}
}
}
}
}
}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-24 00: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/compliance, 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.