"Free SEPA Compliance Validator API — IBAN, BIC, SCT Inst, EPC QR"

EU payment integrations have a recurring problem: they're painful to validate. IBAN checksums, BIC formats, SCT Instant eligibility, EPC QR payloads — every EU payments developer has written some version of this validator, usually right before a demo fails because of a typo in an IBAN.

We just shipped a free SEPA compliance validator API at c.pixeldev.eu/sepa. No auth, no rate-card, just useful.

What it validates

IBAN (MOD-97 checksum)

Full ISO 13616 validation — rearranges the IBAN, converts letters to digits, and computes MOD-97 using BigInt to avoid floating-point drift on long numbers. Also checks the expected length per country (22 chars for DE, 27 for FR, etc. — all 37 SEPA countries covered).

curl "https://c.pixeldev.eu/sepa/v1/validate/iban?iban=DE89370400440532013000"
{
  "valid": true,
  "iban": "DE89370400440532013000",
  "country": "DE",
  "countryName": "Germany",
  "length": 22,
  "sepa": true,
  "sctInst": true,
  "formatted": "DE89 3704 0044 0532 0130 00"
}

BIC (ISO 9362)

Validates the 8 or 11-character format (AAAA BB CC [DDD]) and parses it into institution code, country, location, and branch. Returns SEPA and SCT Inst flags for the country.

curl "https://c.pixeldev.eu/sepa/v1/validate/bic?bic=COBADEFFXXX"
{
  "valid": true,
  "bic": "COBADEFFXXX",
  "institution": "COBA",
  "country": "DE",
  "location": "FF",
  "branch": "XXX",
  "isPrimary": true,
  "sepa": true,
  "sctInst": true
}

SCT Instant eligibility

Given an IBAN, tells you whether the country participates in the SCT Inst scheme — including max transfer amount (€100,000), settlement time (< 10 seconds), and a link to the EPC participant register for BIC-level verification.

curl "https://c.pixeldev.eu/sepa/v1/check/sct-inst?iban=DE89370400440532013000"
{
  "eligible": true,
  "confidence": "country-level",
  "maxAmount": 100000,
  "currency": "EUR",
  "settlementTime": "< 10 seconds"
}

EPC QR payload validation

Validates the full 11/12-line EPC v001/v002 QR code payload format — service tag, version, charset, identification code, BIC, beneficiary name (≤70 chars), IBAN (full MOD-97 check), amount format (EURn.nn), purpose code (≤4 chars), remittance info (structured ≤35 chars or unstructured ≤140 chars, mutually exclusive), and beneficiary info (≤70 chars in v002).

curl -X POST https://c.pixeldev.eu/sepa/v1/validate/epc-qr \
  -H 'Content-Type: application/json' \
  -d '{"payload":"BCD\n002\n1\nSCT\nCOBADEFFXXX\nAcme GmbH\nDE89370400440532013000\nEUR123.45\n\nInvoice 2024-001\n"}'
{
  "valid": true,
  "errors": [],
  "warnings": [],
  "parsed": {
    "serviceTag": "BCD",
    "version": "002",
    "name": "Acme GmbH",
    "iban": "DE89370400440532013000",
    "amount": "EUR123.45",
    "remittanceRef": "Invoice 2024-001"
  }
}

Endpoints

Method Path Description
GET /sepa/v1/validate/iban?iban= IBAN checksum + country validation
GET /sepa/v1/validate/bic?bic= BIC/SWIFT format validation
GET /sepa/v1/check/sct-inst?iban= SCT Instant eligibility by IBAN
POST/GET /sepa/v1/validate/epc-qr EPC QR payload validation
GET /sepa/v1/countries List 37 SEPA countries with IBAN lengths

All endpoints return JSON, support CORS (*), and include rate limit headers. Free tier: 100 requests / 15 minutes per IP.

Try it

Interactive playground at c.pixeldev.eu/sepa — no sign-up, paste and go.

The remaining work: an API key system for higher rate limits and a pricing page. That's for the next build session. For now, it's fully functional and free.

← All posts