IBAN validation API for AI agents
Catch a bad IBAN before money moves: this endpoint validates any IBAN's structure against ISO 13616 - format, per-country length from the public SWIFT IBAN registry (~85 countries) and the ISO 7064 mod 97-10 checksum - and returns either a pass with country, check digits and BBAN, or a precise failure reason (bad format, unknown country, wrong length, failed checksum). It is a pure offline computation, deterministic and with no upstream dependency; it proves an IBAN is structurally genuine, not that the account exists.
At $0.001 per call in USDC it is the cheapest check in the shop, made for agents that handle payment data: no account, no API key. A 'valid: false' verdict on a well-formed input is a successful answer and is billed - that verdict is the product; only malformed requests (empty or oversized input) return 400 and are never billed.
Endpoint
GET /v1/validate/iban — $0.001 per call (USDC on Base, x402). Also available as the MCP tool validate_iban on https://data.greeneris.io/mcp.
Parameters
| Param | Description |
|---|---|
iban | IBAN to validate, 1-100 chars (required); spaces and dashes are tolerated |
Example
curl -i "https://data.greeneris.io/v1/validate/iban?iban=FR1420041010050500013M02606"
# HTTP/1.1 402 Payment Required + machine-readable quote
# (any x402 client pays the quote and retries automatically)Or pay and read the answer from code (pip install "x402[httpx,evm]"):
import asyncio, os
from eth_account import Account
from x402 import x402Client
from x402.http.clients import x402HttpxClient
from x402.mechanisms.evm.exact import register_exact_evm_client
buyer = Account.from_key(os.environ["BUYER_PRIVATE_KEY"]) # test buyer wallet
async def main():
client = x402Client()
register_exact_evm_client(client, buyer) # gasless USDC on Base (EIP-3009)
async with x402HttpxClient(client, timeout=45) as http:
# reads the 402 quote, signs the USDC payment, retries automatically
r = await http.get("https://data.greeneris.io/v1/validate/iban?iban=FR1420041010050500013M02606")
print(r.status_code, (await r.aread()).decode())
asyncio.run(main())Response after payment:
{"ok": true, "data": {"iban": "FR1420041010050500013M02606", "valid": true, "country": "FR", "check_digits": "14", "bban": "20041010050500013M02606", "source": "offline ISO 13616 / ISO 7064 mod 97-10 validation (SWIFT registry lengths)"}}What agents use it for
- Validate a beneficiary IBAN inside a payment flow before submitting a SEPA transfer
- Clean vendor master data: flag stored IBANs that fail length or checksum
- Guard invoice-processing pipelines against OCR typos in extracted IBANs
How payment works
Call the endpoint: you get HTTP 402 with a signed quote (price, receiving address, network). Your agent pays a few tenths of a cent in USDC on Base (gasless, EIP-3009) and retries - one round trip, no account, no API key. Settlement only happens after a successful answer. Full catalog: llms.txt.