Prove your bank files will be accepted — outbound and inbound.

Generate pain.001 / pain.008, validate structured addresses for the SWIFT Nov 14 mandate, and reconcile the camt.053 statements that come back — keyed to your internal invoice ID. Per-document pricing, never a percentage of the wire.

  • Inbound camt.053 reconciliation, keyed to your invoice ID — evidence for the files you send
  • Structured-address enforcement: fully-unstructured addresses become rejectable on 14 Nov 2026
  • Deterministic XML emission — no LLM in the request path
Built onCloudflareSupabaseStripe
ImplementsISO 20022SEPA SCT/SDDCGI-MPSWIFT CBPR+Swiss QR (SPC v0200)
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>
   …
deterministic
Path
none
LLM in path
valid
XSD
POST /v1/iso20022/camt.053/parse
Inbound bank statement
example statement
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
EndToEndId
Key
→ HITL
Unmatched
hash-chained
Attested
Audit chain · iso-compliant.com/dashboard/audit
Hash-chained attestation log
example entries
#004
pain.001 · UBS@2026.06hash: a46abb42f463e550fb9d6…
08:27:55
#003
qr-bill · CHF 199.95hash: b1c97f8e2da311e7c8a02…
08:27:51
#002
pain.002 · AC01 retryhash: 7e220a4f9bc8d12345abc…
08:27:47
#001
camt.053 · example stmthash: 3f9abcdef0123456789ab…
08:27:44
sha256 prev→next
Linkage
Tamper-evident
7-year retention

Validator

Demo · sample payloads

Catch the malformed field before the bank does.

The same kinds of checks the engine enforces behind POST /v1/iso20022/*, run client-side on these example payloads. 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 responseruleset 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

Coverage matrix

What ships today. What lands next. What is on the roadmap.

Three tiers, no vapor. Tier 1 is the deterministic ISO 20022 primitives wired into apps/api/src/lib/ and exercised by the live endpoints. Tier 2 is the first two banks in active UAT preparation — the goal is a signed bank attestation before either pack is promoted to "shipped." Tier 3 lists the next banks on the roadmap; none have rule-pack code yet. The moat is the flywheel of UAT-accepted fixtures, and that flywheel only compounds after the first signed attestation lands.

Tier 1 — Shipped

Shipped4 capabilities · deterministic, in production
CapabilitySpec / behaviourEvidenceStatus
Swiss QR-billSPC v0200 — deterministic PDF / SVG / payload rendererapps/api/src/lib/spc.tsShipped
SEPA pain.001 credit transferDeterministic XML builder · structured-address enforcementapps/api/src/lib/pain001-builder.tsShipped
camt.053 inbound reconciliationBank-statement parser keyed back to invoice / EndToEndIdapps/api/src/lib/camt053-parser.tsShipped
pain.002 HITL classifierAuto-retry-safe vs HITL-required code tableapps/api/src/lib/pain002-classifier.tsShipped

Tier 2 — In Development

In Development2 bank rule packs · UAT preparation, target 2026-Q3
BankScopeTargetStatus
UBS Switzerlandpain.001.001.09.ch.03 profile + SEPA credit transfer2026-Q3In Development
PostFinance Switzerlandpain.001.001.09.ch.03 profile + SEPA credit transfer2026-Q3In Development

Tier 3 — Planned (Phase 2)

PlannedIndicative roadmap · no rule-pack code yet
BankCountryStatus
Deutsche BankDEPlanned
BNP ParibasFRPlanned
INGNLPlanned
Crédit AgricoleFRPlanned
HSBCUKPlanned
JPMorgan ChaseUSPlanned
CitigroupUSPlanned
Bank of AmericaUSPlanned
DBSSGPlanned
ANZAUPlanned

No rule-pack code ships for the Tier-3 banks yet. The ranking is indicative — drop a request to fixtures@iso-compliant.com to prioritise yours.

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.restructuredeterministic stub; DistilBERT in Phase 2
~/.cursor/mcp.json
stdio · sse
{
  "mcpServers": {
    "iso-compliant": {
      "command": "npx",
      "args": ["-y", "@iso-compliant/mcp-server"],
      "env": { "ISOCOMPLIANT_API_KEY": "iso_live_..." }
    }
  }
}

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 iso-compliant.com/qrbill 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 UAT support to land your bank rule pack. 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.