pain.001 versions (.03 vs .09 vs CH profile)

The dotted suffix on pain.001 — major.minor and per-country overlays — determines which schema and rule pack apply.

The pain.001 message identifier carries a dotted version triplet: pain.001.001.09 reads as "domain pain, message 001, major version 001, minor version 09". The minor version (.03, .09, etc.) pins a specific XSD schema; the major version changes only on incompatible field renames.

The two versions in active use today are pain.001.001.03 (the original SEPA-era schema, still accepted by many EU banks for legacy reasons) and pain.001.001.09 (the CBPR+ target, the schema for the Nov 14, 2026 cross-border mandate). The .03→.09 jump added structured-address sub-elements, the SttlmInf block, and various ultimate-party fields. A .03 emitter cannot produce a CBPR+ compliant message — the structured <StrtNm> / <BldgNb> elements only exist on .09.

Per-country profiles append a country code + sub-version to the message id: pain.001.001.09.ch.03 is the Swiss profile (third revision), which overlays QR-IBAN handling, QR-bill reference embedding, and the Swiss NbOfTxs / CtrlSum rule. pain.001.001.09.fr is the French profile; CGI-MP v3 is a multi-bank profile on top of the same .09 schema.

iso-compliant's rule-pack registry pins the (version, profile) tuple per bank — see apps/api/src/lib/rule-pack-loader.ts. A request that targets a bank whose pack is pinned at pain.001.001.09.ch.03 will be built against the Swiss overlay; the same request against a German bank pinned at pain.001.001.09 (CBPR+ baseline) will emit the cross-border shape.

A common deployment trap: a corporate that has been emitting .03 for years and tests a .09 build at a single bank without checking the other banks. Banks accept the version they explicitly profile; sending a .09 to a .03-only ingest channel is a silent reject (or worse, a partial-accept with downstream MT103 fallback).

Related terms

← All terms