SWIFT MX/CBPR+ enforcement · 14 Nov 2026

Stop writing custom validation for bank-direct payments.

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.

  • Deterministic XML emission — no LLM in the request path
  • Per-bank IG rule packs, versioned and pinnable
  • Hash-chained audit log · 7-year retention
  • Ed25519 + RFC 9421 request signing
api.iso-compliant.com/v1/iso20022/pain.001
POST /v1/iso20022/pain.001
Outbound credit transfer
200 OK
Request
{
  "scope": "pain.001.001.09",
  "profile": "ch_2019",
  "bank_ruleset": "ubs@2026.06",
  "msg_id": "PAY-...",
  "debtor": {…},
  "payments": [
    { "amount": 4250.00,
      "currency": "EUR",
      "creditor_iban": "DE02…" }
  ]
}
XML response
<?xml version="1.0"?>
<Document xmlns="urn:iso:
  std:iso:20022:tech:xsd:
  pain.001.001.09">
  <CstmrCdtTrfInitn>
   <GrpHdr><MsgId>MID-
    20260603-9f2c1a0d</MsgId>
   …
4.2 ms
Latency
42
Rules applied
valid
XSD
POST /v1/iso20022/camt.053/parse
Inbound bank statement
37 entries · 36 matched
EndToEndIdAmountStatus
PAY-2026-06-ANNA-014,250.00MATCHED
PAY-2026-06-KAREN-193,180.50MATCHED
PAY-2026-06-MIRO-0412,790.00MATCHED
INV-Q2-2026-118-CR910.40HITL
PAY-2026-06-ZAHRA-022,100.00MATCHED
97.3%
Match rate
11 ms
Latency
1
HITL
Audit chain · iso-compliant.com/dashboard/audit
Hash-chained attestation log
chain_seq 12,841
#12841
pain.001 · UBS@2026.06hash: a46abb42f463e550fb9d6…
08:27:55
#12840
qr-bill · CHF 199.95hash: b1c97f8e2da311e7c8a02…
08:27:51
#12839
pain.002 · AC01 retryhash: 7e220a4f9bc8d12345abc…
08:27:47
#12838
camt.053 · 37 entrieshash: 3f9abcdef0123456789ab…
08:27:44
12,841
Chain length
0
Tampered
7-year retention

Production-grade by default

< 45 ms
p99 latency
Safe to run inline inside a ledger commit or checkout pipeline.
99.99%
Uptime SLA
Cross-border clearing windows do not negotiate with downtime.
Zero-drift
Schema determinism
Same input ⇒ byte-identical XML, indefinitely. Audited per release.
50+
Bank fixture coverage
UAT-verified rule packs. New bank onboarded every ~3 weeks.

Live validator

Catch the malformed field before the bank does.

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.

Request bodylegacy 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>
Validator response3.1 ms · ruleset ubs@2026.06
HTTP 400 · STRUCTURED_ADDRESS_REQUIRED

AdrLine is not permitted under InitgPty.PstlAdr per the SWIFT MX/CBPR+ structured-address mandate effective 2026-11-14. Replace with the structured fields below.

xpath/Document/CstmrCdtTrfInitn/GrpHdr/InitgPty/PstlAdr/AdrLine
ig_sectionUBS-CH-PAIN001 §4.2.7 (p.84)
rule_idubs-ch-pain001-structadr-001
severityERROR
POST /v1/iso20022/pain.001

Bank fixture matrix

Eliminate the edge case. See the bank coverage.

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.

23 of 23 banks shown · 50+ total in the matrix
BankBICpain.001pain.008camt.053pain.002
CHUBS Switzerland
UBSWCHZH80A2026.062026.062026.062026.06
CHPostFinance
POFICHBEXXX2026.062026.062026.062026.06
CHZürcher Kantonalbank
ZKBKCHZZ80A2026.062026.062026.062026.04
CHRaiffeisen Schweiz
RAIFCH22XXX2026.062026.062026.042026.04
DEDeutsche Bank
DEUTDEFFXXX2026.062026.062026.062026.06
DECommerzbank
COBADEFFXXX2026.062026.062026.042026.04
DESparkassen-Finanzgruppe
HELADEFFXXX2026.042026.042026.042026.03
FRBNP Paribas
BNPAFRPPXXX2026.062026.062026.062026.06
FRCrédit Agricole
AGRIFRPPXXX2026.062026.062026.062026.04
FRSociété Générale
SOGEFRPPXXX2026.062026.042026.04
NLING
INGBNL2AXXX2026.062026.062026.062026.06
NLRabobank
RABONL2UXXX2026.062026.062026.042026.04
BEKBC Bank
KREDBEBBXXX2026.042026.042026.042026.03
ATErste Bank Group
GIBAATWWXXX2026.042026.042026.04
UKHSBC UK
HBUKGB4BXXX2026.062026.042026.062026.04
UKBarclays Bank UK
BUKBGB22XXX2026.042026.042026.04
USJPMorgan Chase
CHASUS33XXX2026.062026.04
USCitibank N.A.
CITIUS33XXX2026.042026.04
JPMitsubishi UFJ
BOTKJPJTXXX2026.04
SGDBS Bank
DBSSSGSGXXX2026.062026.042026.04
AUWestpac Banking
WPACAU2SXXX2026.04
BRItaú Unibanco
ITAUBRSPXXX2026.04
AEEmirates NBD
EBILAEADXXX2026.042026.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

Six endpoints. One contract.

Pure infrastructure — keep your existing corporate bank relationships (EBICS / SFTP / API). iso-compliant ensures the file is accepted on the first attempt.

Credit transfer

POST /v1/iso20022/pain.001

Outbound 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.

SEPA SCTCGI-MP v3ch.03 profile

Direct debit

POST /v1/iso20022/pain.008

CORE / 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.

COREB2Bmandate

Statement parser

POST /v1/iso20022/camt.053/parse

Inbound 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.

camt.053camt.054reconciliation

Rejection classifier

POST /v1/iso20022/pain.002/parse

Classify 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.

AC0xXT* extendedHITL queue

Swiss QR-bill

POST /v1/qr-bill

SPC 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.

SPC 0200QRRSCOR

IBAN validator

POST /v1/iban/validate

Mod-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).

ISO 13616SIX BCEBA

IG → JSON rule packs

Offline AI, runtime pure code.

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.

01

Ingest

Bank IG PDF (200–600 pages) chunked per section. Tables and code blocks extracted with layout-aware OCR.

02

Extract

Offline frontier LLM emits candidate rules as JSON conditionals. Output is human-reviewed before merge.

03

Compile

A TypeScript code-generator turns each JSON rule into a pure function on a typed payload AST. No runtime introspection.

04

Test

Every rule validated against the bank’s UAT samples and our golden fixtures. Failing rules block the merge.

05

Ship

Published as a versioned npm module + Go binding. Pinned per bank per environment; blue/green rollouts at the pack level.

99%
Deterministic
Compiled rule-pack AST. <5ms. ~$0 marginal cost.
0.9%
Small encoder
DistilBERT address restructurer. ~100ms CPU. ~$0.0001 / tx.
0.1%
Frontier — offline only
Unknown rejection codes mined into new rule-pack rules.

MCP server

Inside the IDE prompt that closes the window.

@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.”

Free tools — no key, pure-local

  • isocompliant.validate_ibanISO 13616 mod-97 checksum
  • isocompliant.qrr_checksumSwiss QRR mod-10 (Lührmann)
  • isocompliant.scor_checksumISO-11649 RF mod-97
  • isocompliant.iso20022_schema_docspain.001 / .008 / camt.053 / .002 field reference
  • isocompliant.structured_address_lintSWIFT 2026 hybrid/structured-address check

Gated tools — ISOCOMPLIANT_API_KEY

  • isocompliant.qrbill.generatePDF / PNG / SVG / payload
  • isocompliant.sepa.credit_transferpain.001 XML
  • isocompliant.sepa.direct_debitpain.008 XML
  • isocompliant.camt053.parsereconciled JSON
  • isocompliant.pain002.parseclassified rejections
  • isocompliant.address.restructuresmall-model rescue lane
  • isocompliant.bank_fixture.checkUAT-fixture preflight (enterprise)
~/.cursor/mcp.json
stdio · sse
{
  "mcpServers": {
    "iso-compliant": {
      "command": "npx",
      "args": ["-y", "@iso-compliant/mcp-server"],
      "env": { "ISOCOMPLIANT_API_KEY": "iso_live_..." }
    }
  }
}

Predictable accounting

Per-call pricing vs. percentage of volume.

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.

33k
1001k10k100k1M10M
$0.0250per doc · Volume 10k+
iso-compliant 0.5% of volumelog/log scale
iso-compliant — per call
$812.50
33k docs × $0.0250
Standard processor — 0.5% of volume
$812.5k
33k docs × $5,000 × 0.50%
Monthly savings
$811.7k1000× cheaper

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-document, on a volume curve.

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.

Free
$0no card

100 documents / month. Full validation, no SLA. Attribution footer on the qrpay.app renderer.

Start free
Most teams
Per-call
$0.05 → $0.005per document

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
Enterprise
Annualflat fee

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

The SWIFT window closes
14 November 2026.

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.

Get an API key →Talk to sales

Free tier: 100 docs/mo. No card. Full validation. SDK shape identical to the paid tier.