IBANforge

Validate IBANs, lookup BICs, score compliance risk. 121K BICs, 89 countries. Free tier or x402 micropayments. MCP native for AI agents.

TradingLiveeip155:8453Exactvia cdp
IbanBicSepaComplianceBanking
Calls · 30d
1→ 0%
This endpoint's own trailing-30-day call count, as published by the upstream catalog and snapshotted daily. 23 snapshots so far.
$0.17
Verified settled volume
33 settlements proven x402 by their on-chain EIP-3009 marker.
$0.020
Listed price
As published in the catalog. Always read the live 402 before paying.
1
Calls · 30d
Upstream's own call count for this endpoint, not ours.
1
Unique payers · 30d
Last called 2026-08-17 05:18Z
Upstream on-chain volume
Reported by the source catalog.
Paid to
0xD13bD0A4120BA301125290e5cc0c7EFD4CB40a55

The wallet the 402 directs payment to. Its whole payment record — every payer, every chain — is on the merchant page.

Asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913

Provider

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.

0.02USDC≈ $0.02 USD
on Base · exact scheme

Pay 0.02 USDC on Base to 0xD13b…40a55. The signed payment is good for 1 minute.

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
Report

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.

Open skill.md
Show 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.