Message Families
How transmute groups SWIFT MT and ISO 20022 messages into families, why a conversion never crosses from one family to another, and which formats only normalize.
What a family is
A family is a set of message formats that describe the same kind of business event. An MT103 and a pacs.008 are both a customer credit transfer, so they share the payment family; an MT940 and a camt.053 are both an account statement, so they share the statement family.
Inside the engine every family has one canonical model: a format-neutral JSON shape that every member parses into and renders out of. A conversion is always two steps, source to canonical and canonical to target, and it only exists when both formats belong to the same family. The canonical shape is what /v1/normalize returns, so the result.type of a normalize response tells you which model a message lives in.
Terms used on these pages:
| Term | Meaning |
|---|---|
| MT | A SWIFT FIN message, written as tagged text lines such as :20: or :32A: |
| MX | An ISO 20022 XML message, such as pacs.008.001.08 |
| Canonical | transmute's own JSON model of a message; also accepted as a conversion source (from=canonical) in some families |
| Pair | One registered from → to conversion |
The families
| Family | Formats | Normalized result.type | Canonical source |
|---|---|---|---|
| Statements | mt940, mt950, mt942, mt900, mt910, camt.052, camt.053, camt.054, bai2, plus file targets | statement | Yes |
| Customer payments | mt103, pacs.008 | payment | Yes |
| Payment initiations | mt101, pain.001, csv-payments, xlsx-payments | initiation | Yes |
| Direct debits | mt104, pain.008 | initiation | Yes |
| FI transfers | mt202, mt205, pacs.009 | payment | No |
| Returns | mt103-retn, mt202-retn, pacs.004 | return | No |
| Rejects and status reports | mt103-rejt, mt202-rejt, pacs.002, pain.002 (target only) | status | Yes |
| Cancellation requests | mt192, mt292, camt.056, camt.055 (source only) | investigation | No |
| Queries | mt195, mt295, camt.110 | investigation | No |
| Answers | mt196, mt296, camt.111 | investigation | No |
| Notices to receive | mt210, camt.057 | statement | No |
| Charges requests | mt191, mt291, camt.106 | charges | No |
| Statement requests | mt920, camt.060 | request | Yes |
| Normalize-only formats | mt199, mt299, camt.029, pain.002 (as a source) | investigation / status | n/a |
The live list of formats, versions and pairs is always GET /v1/formats; the tables on these pages describe the behaviour behind those pairs.
Why pairs never cross families
Some families share a canonical model (FI transfers and customer payments are both payment; queries, answers and cancellation requests are all investigation), yet transmute never converts between them. A message type carries meaning, not just fields: a return is not a new payment, a bank-to-bank cover transfer is not a customer transfer, and a query is not a request to cancel. Converting across that line would produce a well-formed message that says something different from the source.
So these pairs do not exist, and asking for one returns unsupported-conversion (422):
mt202→pacs.008ormt103→pacs.009(FI transfer vs. customer payment)mt103-retn→pacs.002ormt103-rejt→pacs.004(a return is not a reject)mt101→pain.008ormt104→pain.001(a credit transfer is not a direct debit)mt210→camt.053(a notice is not a statement)mt195→camt.111(a query is not an answer)
Within a family, conversions change the syntax (MT to MX or MX to MT). Two MT formats of one family never convert to each other (mt202 → mt205 is not a pair). A few MX-to-MX pairs exist where they serve a real purpose: re-rendering or upgrading a camt statement, bridging pain.001 versions, and forwarding a customer cancellation (camt.055 → camt.056).
The same rule applies to canonical JSON input: a canonical document of one family sent to another family's target, such as a statement document with to=mt103 or a credit-transfer initiation with to=pain.008, is a 422 unsupported-conversion.
Normalize-only formats
Four formats parse, normalize and validate but take part in no conversion: mt199, mt299, camt.029, and pain.002 when it is the source. Each one either has no structured counterpart (free-format text) or carries content that no other format in its family can hold faithfully. Naming one as from on /v1/convert returns 422 unsupported-conversion. See Normalize-only formats.
pain.002 is the one asymmetry: you cannot convert from it, but transmute can generate one from a canonical status document (see Rejects and status reports).
How to read a family page
Every family page follows the same layout:
- Formats: each format id, the MX versions accepted as input, and the version emitted by default. Pin another output version with
targetVersionwhere the page lists more than one. - Pairs: every registered
from→toin the family, both directions. - How fields map: a plain-language summary of where the key fields go, in each direction.
- Where information is lost: the situations that produce a lossy or defaulted step, and the warning code each one emits.
- Conventions: family-specific rules worth knowing before you build on the output.
- Example: one runnable curl with synthetic data and the shape of the response.
All examples post raw MT text with Content-Type: text/plain and let transmute detect the source (meta.detectedType). Each response is abbreviated: XML is shown formatted, and warning detail strings are elided.
Detecting sibling MT types
Several MT types share their field layout with a sibling and differ only in the message type in the FIN header (block 2). Without the {1:}{2:} header, transmute cannot tell them apart:
| Bare message | Detects as |
|---|---|
| MT292, MT295, MT296, MT291, MT299 | mt192, mt195, mt196, mt191, mt199 |
| MT205 | mt202 |
MT940 with no :86: line | mt950 |
| MT910 with no ordering-party or intermediary field | mt900 |
When the distinction matters, send the full FIN envelope or name the format with from.