Credit transfer
POST /v1/iso20022/pain.001Outbound SEPA / cross-border CT — deterministic XML.
pain.001.001.09 default. CH (.ch.03) and CGI-MP variants via ?profile=. Bank rule packs pinned via bank_ruleset; XSD validation before transmission.
Generate, validate, and audit ISO 20022, SEPA, UK Faster Payments, Japan Zengin, Swiss QR-bill, and US ACH NACHA schemas against an active 50-bank fixture matrix. Flat per-call pricing. 0% transaction tax.
api.iso-compliant.com/v1/iso20022/pain.001UBS · 2026.06a46abb42f463…Production-grade by default
Live validator
The same engine that backs POST /v1/iso20022/*. Every error carries the offending XPath, the bank-IG section it violated, and the corrected payload. No generic parser exceptions — every rejection is actionable.
legacy payload — broken<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>PAY-2026-06-001</MsgId>
<CreDtTm>2026-06-03T08:15:00</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<CtrlSum>4250.00</CtrlSum>
<InitgPty>
<Nm>ACME Payroll AG</Nm>
<PstlAdr>
<AdrLine>Bahnhofstrasse 12, 8001 Zürich CH</AdrLine>
</PstlAdr>
</InitgPty>
</GrpHdr>
<PmtInf>…</PmtInf>
</CstmrCdtTrfInitn>
</Document>3.1 ms · ruleset ubs@2026.06AdrLine is not permitted under InitgPty.PstlAdr per the SWIFT MX/CBPR+ structured-address mandate effective 2026-11-14. Replace with the structured fields below.
POST /v1/iso20022/pain.001Bank fixture matrix
Every cell below is a UAT-verified rule pack pinned to a specific ruleset version, across the SEPA zone, UK, US, APAC, LATAM, and MENA. The engine resolves bank-specific IG dialects inline — no manual testing, no per-bank branch in your code. Honest dashes mark coverage we have not shipped yet; new rows land roughly every three weeks on the global rule-pack roadmap.
| Bank | BIC | pain.001 | pain.008 | camt.053 | pain.002 |
|---|---|---|---|---|---|
CHUBS Switzerland | UBSWCHZH80A | 2026.06 | 2026.06 | 2026.06 | 2026.06 |
CHPostFinance | POFICHBEXXX | 2026.06 | 2026.06 | 2026.06 | 2026.06 |
CHZürcher Kantonalbank | ZKBKCHZZ80A | 2026.06 | 2026.06 | 2026.06 | 2026.04 |
CHRaiffeisen Schweiz | RAIFCH22XXX | 2026.06 | 2026.06 | 2026.04 | 2026.04 |
DEDeutsche Bank | DEUTDEFFXXX | 2026.06 | 2026.06 | 2026.06 | 2026.06 |
DECommerzbank | COBADEFFXXX | 2026.06 | 2026.06 | 2026.04 | 2026.04 |
DESparkassen-Finanzgruppe | HELADEFFXXX | 2026.04 | 2026.04 | 2026.04 | 2026.03 |
FRBNP Paribas | BNPAFRPPXXX | 2026.06 | 2026.06 | 2026.06 | 2026.06 |
FRCrédit Agricole | AGRIFRPPXXX | 2026.06 | 2026.06 | 2026.06 | 2026.04 |
FRSociété Générale | SOGEFRPPXXX | 2026.06 | 2026.04 | 2026.04 | — |
NLING | INGBNL2AXXX | 2026.06 | 2026.06 | 2026.06 | 2026.06 |
NLRabobank | RABONL2UXXX | 2026.06 | 2026.06 | 2026.04 | 2026.04 |
BEKBC Bank | KREDBEBBXXX | 2026.04 | 2026.04 | 2026.04 | 2026.03 |
ATErste Bank Group | GIBAATWWXXX | 2026.04 | 2026.04 | 2026.04 | — |
UKHSBC UK | HBUKGB4BXXX | 2026.06 | 2026.04 | 2026.06 | 2026.04 |
UKBarclays Bank UK | BUKBGB22XXX | 2026.04 | 2026.04 | 2026.04 | — |
USJPMorgan Chase | CHASUS33XXX | 2026.06 | — | 2026.04 | — |
USCitibank N.A. | CITIUS33XXX | 2026.04 | — | 2026.04 | — |
JPMitsubishi UFJ | BOTKJPJTXXX | 2026.04 | — | — | — |
SGDBS Bank | DBSSSGSGXXX | 2026.06 | — | 2026.04 | 2026.04 |
AUWestpac Banking | WPACAU2SXXX | 2026.04 | — | — | — |
BRItaú Unibanco | ITAUBRSPXXX | 2026.04 | — | — | — |
AEEmirates NBD | EBILAEADXXX | 2026.04 | — | 2026.03 | — |
Ruleset versions are pinnable per request via the X-Iso-Compliant-Bank-Ruleset header. Blue/green rollouts at the pack level — you control when a new version lands.
API surface
Pure infrastructure — keep your existing corporate bank relationships (EBICS / SFTP / API). iso-compliant ensures the file is accepted on the first attempt.
POST /v1/iso20022/pain.001Outbound SEPA / cross-border CT — deterministic XML.
pain.001.001.09 default. CH (.ch.03) and CGI-MP variants via ?profile=. Bank rule packs pinned via bank_ruleset; XSD validation before transmission.
POST /v1/iso20022/pain.008CORE / B2B with mandate fields and sequence grouping.
Idempotency cache, deterministic MsgId derivation, ISO 13616 IBAN validation, FRST / RCUR / OOFF / FNAL sequence-type grouping, audit attestation per request.
POST /v1/iso20022/camt.053/parseInbound reconciliation, keyed back to your invoice ID.
The perpetual moat: the reconciliation key never standardises across banks. Returns reconciled line items with the EndToEndId or structured remittance preserved.
POST /v1/iso20022/pain.002/parseClassify RJCT codes — auto-retry-safe vs HITL.
AC01 / AC03 / BE05 → corrected retry payload. AC04 / AM05 / XT* / timeouts → human approval queue. Never blind-retry on a non-RJCT response.
POST /v1/qr-billSPC v0200 — PDF / SVG / PNG / payload.
Mod-97 IBAN, mod-10 QRR (Lührmann), QR-IBAN range check, full 31-line payload, 997-byte cap, multilingual labels. Same pdf-lib renderer running in any V8 isolate.
POST /v1/iban/validateMod-97 + BIC + QR-IBAN flag.
Standalone ISO 13616 check against the cached SIX Bank Master (CH/LI) and EBA Clearing participants. Returns bank name, BIC, and qr_iban (IID 30000–31999).
IG → JSON rule packs
The production request path never invokes an LLM. Frontier model calls run batch, against the rejection-event queue, with human review between extraction and shipping.
Bank IG PDF (200–600 pages) chunked per section. Tables and code blocks extracted with layout-aware OCR.
Offline frontier LLM emits candidate rules as JSON conditionals. Output is human-reviewed before merge.
A TypeScript code-generator turns each JSON rule into a pure function on a typed payload AST. No runtime introspection.
Every rule validated against the bank’s UAT samples and our golden fixtures. Failing rules block the merge.
Published as a versioned npm module + Go binding. Pinned per bank per environment; blue/green rollouts at the pack level.
MCP server
@iso-compliant/mcp-server is the distribution lever — MIT-licensed schema, free local tools, gated tools proxying to api.iso-compliant.com under a bearer token. Resolve when a developer in Cursor / Claude Desktop / Continue prompts “Swiss QR-bill” or “SEPA pain.008.”
isocompliant.validate_ibanISO 13616 mod-97 checksumisocompliant.qrr_checksumSwiss QRR mod-10 (Lührmann)isocompliant.scor_checksumISO-11649 RF mod-97isocompliant.iso20022_schema_docspain.001 / .008 / camt.053 / .002 field referenceisocompliant.structured_address_lintSWIFT 2026 hybrid/structured-address checkisocompliant.qrbill.generatePDF / PNG / SVG / payloadisocompliant.sepa.credit_transferpain.001 XMLisocompliant.sepa.direct_debitpain.008 XMLisocompliant.camt053.parsereconciled JSONisocompliant.pain002.parseclassified rejectionsisocompliant.address.restructuresmall-model rescue laneisocompliant.bank_fixture.checkUAT-fixture preflight (enterprise){
"mcpServers": {
"iso-compliant": {
"command": "npx",
"args": ["-y", "@iso-compliant/mcp-server"],
"env": { "ISOCOMPLIANT_API_KEY": "iso_live_..." }
}
}
}Predictable accounting
Drag the slider. Watch what a 0.5% transaction tax does to a payroll processor at scale. iso-compliant prices per document; your costs scale with operations, not with the dollar amount on the wire.
Per-call pricing scales sub-linearly. Percentage-of-volume scales 1-to-1 with your customers' transaction sizes — which is exactly the wrong direction for infrastructure cost.
Pricing
Per-call paid tier scales down to half a cent for high-volume payroll batches. Enterprise customers pay a flat annual fee. Never a percentage of transaction volume — that's a structural commitment, not a campaign.
100 documents / month. Full validation, no SLA. Attribution footer on the qrpay.app renderer.
Start free →Volume curve down to half a cent per doc. Webhooks, idempotency, SLA 99.9%, audit retention 7y. Never a percentage of transaction volume.
Get an API key →Dedicated bank-fixture support (your bank added to the validated matrix). mTLS, custom SLA, on-prem / VPC-private deployment. SOC2 / ISO 27001 evidence pack.
Talk to us →Six-month ship discipline
Get an API key, point your existing SDK at api.iso-compliant.com, and ship a structured-address-compliant pain.001 to your bank's UAT channel today.
Free tier: 100 docs/mo. No card. Full validation. SDK shape identical to the paid tier.