Authentication
Every call to the validator carries your key as a bearer token. Keys look like ibn_test_… and are shown once, when you create them.
# header on every /api/validate call
Authorization: Bearer ibn_test_9f2a…_4c1b…
Get a key
Sign in at the dashboard: your account starts on the free plan. Create a key there, one per app if you like, and copy it: it is shown only once. Revoke a key from the same page; it stops working at once.
An AI agent gets its key without the dashboard, through the Rose for Agents connector. See For AI agents. Without the connector, an agent can start a trial itself: auth.md.
POST /api/validate
Validate one IBAN. Whitespace and case are normalised for you.
# request curl -X POST https://ibanly.app/api/validate \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"input": {"iban": "GB82 WEST 1234 5698 7654 32"}}' # 200 OK — valid { "output": { "iban": "GB82WEST12345698765432", "valid": true, "country": "GB", "check_digits": "82", "bban": "WEST12345698765432", "formatted": "GB82 WEST 1234 5698 7654 32", "reason": null, "note": null }, "usage": { "used": 1, "limit": 100 } } # 200 OK — invalid (a swapped digit) { "output": { "iban": "GB28WEST12345698765432", "valid": false, "country": "GB", "check_digits": "28", "bban": "WEST12345698765432", "reason": "checksum failed (mod 97)" }, "usage": { "used": 2, "limit": 100 } }
A well-formed IBAN whose country is outside the length table still gets checksum-validated, with a note that the length was not checked.
MCP server
The same validation is a tool, validate_iban, on Ibanly's MCP server: https://ibanly.app/mcp (Streamable HTTP). Add it to Claude Code with claude mcp add --transport http ibanly https://ibanly.app/mcp: your assistant asks you to sign in to Ibanly once and creates its own key, which you can revoke in the dashboard. An API key also works as Authorization: Bearer.
Errors
Errors are JSON with a detail field and a matching HTTP status.
| Status | When |
|---|---|
| 401 | Missing, malformed, or unknown API key. |
| 409 | Account has no active plan. |
| 413 | Request body larger than 4 KB. |
| 422 | Body is not a JSON object, or input.iban / email is missing or invalid. |
| 429 | Rate limit exceeded. Wait a minute. |
Rate limits
Per client IP: 60 validations a minute and 5 sign-ups a minute. Over the limit returns 429. These protect the anonymous doors; your monthly plan allowance is separate.
Privacy
IBANs are validated in memory and discarded. They are never stored and never logged — not even in error responses.
Get a key and make your first call
Free plan, 100 validations a month.