Ohmyfin

HomeDraftersMT → MX translator (CBPR+)

MT → MX translator (CBPR+)

Paste an MT FIN block on the left and get a deterministic CBPR+ pacs.008 or pacs.009 XML on the right. Field-by-field mapping is highlighted below. Lossy conversions (value-date, charge codes) raise warnings — no data is silently dropped.

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 APIMT → MX 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/mt-to-mx
Content-Type: application/json

{ "source": "{1:F01DEUTDEFFAXXX0000000000}{2:I103NWBKGB2LAXXXN}{3:{121:...}}{4:...-}" }

Frequently asked questions

Which MT messages can I translate?

MT103 → pacs.008.001.08, MT202 → pacs.009.001.08 (core), MT202COV → pacs.009.001.08 with the underlying customer credit transfer sequence (COV), and MT199 → pacs.009.001.08 as a best-effort wrapper (MT199 is free-format, so the translator emits a minimal envelope with a `best-effort` warning and stages narrative as remittance info).

What gets lost?

The MT 32A value-date is not preserved on the wire in pacs.008/pacs.009 (it travels in head.001 application header or out of band). Free-text 50/59 lines are split into Dbtr/Cdtr Nm + IBAN heuristically. Both produce machine-readable warnings.

Is the output CBPR+ compliant?

The XML is wrapped in BizMsgEnvlp + head.001.001.02 AppHdr and uses the .08 schemas required for the November 2025 migration. Mandatory CBPR+ fields like UETR are checked; missing values raise validation errors.

Do you log my message?

No. The endpoint is rate-limited per IP but does not persist source or target content. For full off-grid use, self-host the open-source @ohmyfin/swift-draft package.

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