Ohmyfin

HomeDraftersMX → MT translator (CBPR+)

MX → MT translator (CBPR+)

Paste an ISO 20022 MX XML on the left and get a deterministic MT FIN message on the right. Field-by-field mapping is shown below. Lossy reverses (value-date defaulted, charge codes collapsed) raise warnings.

Paste a message and press Translate (or just start typing).

Why CBPR+ matters

CBPR+ ("Cross-Border Payments and Reporting Plus") is SWIFT's usage guideline that pins ISO 20022 to a single, interoperable subset of pacs.008, pacs.009, pacs.002, camt.054 and camt.053 for cross-border wire payments. From November 2025, every FIN participant must be able to send and receive these MX messages — MT/MX coexistence is the steady-state until the legacy MT format is retired. The big practical consequence: a payment that originates as MT103 may arrive at the beneficiary as pacs.008.001.08, and vice versa. A bank that translates these wrong introduces reconciliation breaks, sanctions-screening misses, and GPI tracking holes. This translator is a sanity check, not a production engine — but it implements the same field map your engine should.

Lossy vs lossless translation

CBPR+ is not a lossless format pair. Three structural mismatches force warnings on every real translation:

Round-trip stability is a hard contract here: the canonical samples in the engine round-trip MT103 → pacs.008 → MT103 cleanly. The warning channel exists so silent data loss is impossible.

Common MT103 → pacs.008 gotchas

  1. Missing UETR. CBPR+ pacs.008 / pacs.009 require CdtTrfTxInf/PmtId/UETR. If your MT envelope did not carry {121:}, the translator emits uetr-missing and you must mint one (UUID v4) before sending.
  2. Amount decimal separator. MT 32A uses comma (1234,56); MX IntrBkSttlmAmt uses dot (1234.56). The translator flips automatically, but a manual paste often forgets this.
  3. BIC padding. MT block-1 LT is BIC8 + LT-code (1 char) + branch (3 chars) = 12 chars. ISO 20022 BICFI is 8 or 11 characters. The translator strips the LT-code, which is correct, but means the BIC may shorten by one character — check against your CBPR+ enrichment.
  4. Field 70 length. MT 70 is up to 4×35 = 140 chars across multiple lines. MX RmtInf/Ustrd is also 140 chars but on a single line. Multi-line MT 70 collapses with a single space.
  5. Charge bearer "OUR" with deductions. Real-world MT103 sometimes carries OUR + 71F deduction codes. CBPR+ requires structured ChrgsInf if you express deducted charges. The translator drops 71F silently — fill it manually if your flow uses it.
  6. 50F structured party. MT 50F encodes a structured ordering customer with line tags (1/ name, 2/ address, 3/ country code). The translator only reads the name component; structured address pass-through is on the roadmap.

Field-by-field reference

Each of the three CBPR+ pairs (plus the MT199 best-effort wrapper) has a mapping table below. Rows highlight in real time when the current translation produces a warning that involves that field — click any row to see which engine rule it links to.

Field mapping (CBPR+)

All four mapping tables below are sourced from the open-source engine. Rows highlight when the current translation produces a warning that involves them.

MT103 ↔ pacs.008.001.08
SourceTargetNotes
Block 3 {121:} UETRCdtTrfTxInf/PmtId/UETREnd-to-end unique transaction reference. Required on both sides.
MT 20 Sender's ReferenceGrpHdr/MsgId + PmtId/InstrId + EndToEndIdMT 20 is a single 16-char ref; on MX it splits into MsgId, InstrId, EndToEndId. The translator copies it to all three by default.
MT 23B Bank Operation Code(implicit CRED)MT 103 distinguishes CRED/SPRI/SSTD/SPAY; pacs.008 only encodes CRED via element semantics.
MT 32A amount (1234,56)IntrBkSttlmAmt (1234.56)Decimal separator flips from comma to dot. Currency code copied verbatim.
MT 32A value-date (YYMMDD)(not on wire — defaulted to today on reverse)pacs.008 does not carry the value-date on the FI-to-FI message; reverse translation defaults to today.
MT 50K/F/A Ordering CustomerDbtr (Nm + Id/IBAN [+ BIC])Free-text party block parsed into structured Dbtr. First /-prefixed line treated as IBAN.
MT 52A Ordering InstitutionDbtrAgt/FinInstnId/BICFIFalls back to the block-1 sender BIC if 52A is absent.
MT 56A IntermediaryIntrmyAgt1/FinInstnId/BICFIOptional. Mapped 1:1.
MT 57A Account With InstitutionCdtrAgt/FinInstnId/BICFIFalls back to the block-1 receiver BIC if 57A is absent.
MT 59 BeneficiaryCdtr (Nm + Id/IBAN [+ BIC])Same parsing rules as MT 50.
MT 70 Remittance InformationRmtInf/UstrdMulti-line MT 70 collapsed to a single Ustrd line; truncated to 140 chars on reverse.
MT 71A Details of Charges (OUR/BEN/SHA)ChrgBr (DEBT/CRED/SHAR)Direct mapping. MX SLEV collapses to MT SHA with a warning.
MT202 ↔ pacs.009.001.08
SourceTargetNotes
Block 3 {121:} UETRCdtTrfTxInf/PmtId/UETRRequired on both sides.
MT 20 Sender's ReferenceMsgId + InstrIdTranslator copies to both fields.
MT 21 Related ReferenceEndToEndId1:1 mapping; defaults to MT 20 if 21 is absent.
MT 32A amountIntrBkSttlmAmtComma → dot, currency copied.
MT 32A value-date(not on wire)Same caveat as MT103/pacs.008.
MT 52A Ordering InstitutionDbtrAgt/FinInstnId/BICFIDefaults to block-1 sender BIC.
MT 56A IntermediaryIntrmyAgt1/FinInstnId/BICFIOptional.
MT 58A Beneficiary InstitutionCdtrAgt/FinInstnId/BICFIDefaults to block-1 receiver BIC on reverse.
MT202COV ↔ pacs.009.001.08.COV
SourceTargetNotes
All MT202 FI fieldsCover (top-level) pacs.009 blockSame as MT202 ↔ pacs.009 above.
MT 50A/K Underlying Ordering CustomerUndrlygCstmrCdtTrf/DbtrParsed into structured Dbtr.
MT 59 Underlying BeneficiaryUndrlygCstmrCdtTrf/CdtrParsed into structured Cdtr.
MT 70 Underlying Remittance InfoUndrlygCstmrCdtTrf/RmtInf/UstrdTruncated to 140 chars on reverse.
(missing underlying sequence)(translator warning)COV without underlying is a malformed message.
MT199 ↔ pacs.009.001.08 (best-effort)
SourceTargetNotes
(entire MT199 free-format)(minimal pacs.009 envelope)MT199 is a free-format narrative message with no native ISO 20022 counterpart. The translator produces a syntactically-valid envelope and stages the narrative as remittance info — manual review required.
MT 20 Sender's ReferenceMsgId + InstrIdCopied to both.
MT 21 Related ReferenceEndToEndIdDefaults to MT 20 if 21 is absent.
MT 79 NarrativeRmtInf/Ustrd (truncated 140)Free-text narrative lines joined with spaces, then capped at 140 chars.
(no amount in MT199)IntrBkSttlmAmt (defaulted XXX 0.00)MT199 carries no amount; you must fill IntrBkSttlmAmt manually.

Free REST APIMX → MT translator (CBPR+) API

100 translations per IP per day. No auth. CORS open. Returns { ok, sourceKind, targetKind, target, mapping, validation, warnings }.

POST https://ohmyfin.org/api/draft/mx-to-mt
Content-Type: application/json

{ "source": "<BizMsgEnvlp ...>...</BizMsgEnvlp>" }

Frequently asked questions

Which MX messages can I translate back?

pacs.008.001.08 → MT103, pacs.009.001.08 → MT202, pacs.009.001.08.COV → MT202COV, and pacs.002.001.10 → MT199 best-effort (status report wrapped as free-format narrative). camt.05x have no direct MT counterpart.

Why does my value-date default to today?

ISO 20022 IntrBkSttlmAmt has no inline value-date — the date lives elsewhere (group header or head.001). When translating back to MT 32A, the translator defaults to today and raises a `valuedate-default` warning so you can override it.

How are charge codes mapped?

DEBT → OUR, CRED → BEN, SHAR → SHA. The CBPR+ SLEV code has no MT equivalent and is collapsed to SHA with a warning.

Will the round-trip be lossless?

For the canonical samples shipped here, yes. Round-tripping arbitrary production XML can be lossy when the source uses structured postal addresses or non-IBAN account identifiers — warnings are emitted on every lossy step.

Other tools: MT → MX translator (CBPR+) All drafters