API reference

Two endpoints. One of them is the product.

Create an account to get a key, then POST an IBAN to validate it. JSON in, JSON out. Base URL https://ibanly.app.

Authentication

Every call to the validator carries your key as a bearer token. Keys look like ibn_test_… and are shown once, at sign-up.

# header on every /api/validate call
Authorization: Bearer ibn_test_9f2a…_4c1b…

POST /api/signup

Create a free-plan account and receive its id and API key. The key is returned only in this response, so store it now.

# request
curl -X POST https://ibanly.app/api/signup \
  -H "Content-Type: application/json" \
  -d '{"email": "you@company.com"}'

# 201 Created
{
  "account_id": "acct_9f2a3b…",
  "plan": "free",
  "api_key": "ibn_test_9f2a3b…_4c1bde…"
}

A second sign-up with the same email returns 409: the account already exists and the key is not shown again.

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.

Errors

Errors are JSON with a detail field and a matching HTTP status.

StatusWhen
401Missing, malformed, or unknown API key.
409Account has no active plan, or the email already has an account.
413Request body larger than 4 KB.
422Body is not a JSON object, or input.iban / email is missing or invalid.
429Rate 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.

Create a free account