Warnings Registry
The closed registry of conversion warning codes. Every lossy or assumed step in a conversion surfaces as one of these — nothing is dropped silently.
The contract
Converting between formats with different capacities sometimes forces a choice: truncate a name to fit an MT line, default a mandatory timestamp the source never carried, transliterate a character the SWIFT X charset can't hold. transmute's contract is that every such step emits a structured warning — if the warnings[] array carries no lossy entries, nothing was dropped.
{ "code": "TRUNC_NAME", "severity": "lossy",
"sourceField": "payment.creditor.name", "targetField": ":59:",
"detail": "name shortened from 52 to 35 characters to fit the MT line budget" }
| Field | Meaning |
|---|---|
code | A stable identifier from the closed registry below — match on this |
severity | info < warning < lossy < error |
sourceField / targetField | Paths naming what was affected |
detail | A short explanation — never message content values |
Warnings are deterministic (sorted by source field, then code) — identical input yields identical warnings, so you can diff them across runs.
On bare-document responses (Accept: application/xml/text/plain) warnings can't ride in the body; you get an X-Transmute-Warnings count header instead — re-issue with Accept: application/json for the entries. Warnings are not stored server-side.
Severity semantics
| Severity | Meaning | Recommended handling |
|---|---|---|
info | An assumption or normalization was made; no data lost | Log it |
warning | Something didn't verify or is structurally imperfect | Review in reconciliation |
lossy | Data present in the source is absent or reduced in the target | Review item — decide whether the loss matters for your flow |
error | Reserved for strict-mode style failures | Fail the item |
Setting options.strict: true on convert turns would-be lossy outcomes into failures.
The registry
The registry is closed: codes are only ever added (with release notes), never renamed or silently changed, so switching on them exhaustively is safe.
Lossy by default
| Code | Emitted when |
|---|---|
CHARSET_DROP | Characters with no transliteration were replaced or removed |
CHARSET_TRANSLIT | Characters were transliterated to the SWIFT X charset (e.g. ü → ue) |
CSV_FORMULA_NEUTRALIZED | A CSV Description cell began with a spreadsheet formula trigger (=, +, -, @ or a control character) and was prefixed with a single quote so it cannot execute on import |
DROP_AGENT | An agent in the chain cannot be represented in the target |
DROP_FIELD | A whole source element has no slot in the target format |
FIELD_OVERSIZED | A value did not fit its target element's schema bound (e.g. a camt sequence number longer than 18 digits or not numeric) and was dropped rather than cut short |
OVERRIDE_SUPPRESSED | A tenant override rule deliberately dropped this field (always paired with OVERRIDE_APPLIED) |
TRUNC_ADDRESS | Address components were dropped or cut flattening to MT lines |
TRUNC_NAME | A party/agent name was cut to fit the MT line budget |
TRUNC_NARRATIVE | Investigation narrative exceeded the target's free-text capacity (MT :75:/:76:/:77A: lines, or the 500-character camt.110/camt.111 narrative) and was cut |
TRUNC_REFERENCE | A reference exceeded the target field length |
TRUNC_REMITTANCE | Remittance text exceeded :70:/:86: capacity |
UETR_INVALID | A UETR was not in UUID form (8-4-4-4-12 hex) and was dropped instead of being carried into the target |
Warning by default
| Code | Emitted when |
|---|---|
ADDRESS_UNSTRUCTURED | A structured address was preferred but only unstructured was available |
AMOUNT_MISMATCH | Charges arithmetic or a page balance chain failed verification |
DEBULK_AMOUNT_MISSING | Debulking was requested, but a transaction inside a batch entry states no amount of its own, so the entry was kept as one transaction |
ENVELOPE_MISMATCH | A Business Application Header names a different message type (MsgDefIdr) than the Document it travels with |
STATEMENT_BALANCE_ABSENT | An account report (camt.052) was converted to a statement (camt.053) but carries no closing booked balance; balances are kept as typed, none is relabelled |
Info by default
| Code | Emitted when |
|---|---|
ACCOUNT_CCY_SUFFIX | An MT :25: account id carried a trailing currency suffix (a known bank dialect); split into IBAN + account currency |
ADDRESS_SPLIT_INFERRED | Structured address components (post code, town, country, street, building number) were inferred from unstructured address lines; the original lines are kept alongside |
CHARGES_DETAIL_UNMAPPED | A charges detail line had no mapping row; carried as narrative/verbatim |
CHARGES_DUPLICATED | A return charge restated in two source fields of equal amount was collapsed to one, not double-counted |
CODE_UNMAPPED_PROPRIETARY | A code had no table mapping and was carried as proprietary |
COLUMN_UNMAPPED | A column of a CSV or XLSX payment file matched no known header and no columnMap entry, so it was ignored |
DATE_YEAR_INFERRED | An :61: entry-date year was inferred from the value date |
ENTRY_DEBULKED | A bank-statement batch entry was split into its individual transactions because debulking was requested; each amount is copied from the transaction's own stated amount, never computed |
ENVELOPE_DROPPED | Part of the source message envelope (for example the FIN MUR, or the AppHdr message id or creation time) has no place in the requested output envelope and was not carried |
LEGAL_SEQUENCE_ABSENT | An account report (camt.052) was converted to a statement (camt.053) without a legal sequence number; none is invented |
MISSING_REQUIRED_DEFAULTED | A mandatory target element was defaulted (e.g. camt.053 CreDtTm from an MT940 that carries no timestamp) |
OVERRIDE_APPLIED | A tenant override rule changed this field's mapping (detail names the action, never values) |
PAGED_OUTPUT | Output was split into N MT pages (2,000-character cap per message) |
RETURN_REASON_UNMAPPED | A return/cancellation reason code had no mapping row; carried as proprietary/narrative |
Using warnings in pipelines
- Persist the codes (they're metadata, safe to store) alongside your own record of each conversion.
- Alert on
lossyin flows where completeness matters — payment chains, regulatory reporting. - Don't string-match
detail— it's for humans and may be refined;codeis the contract.