ResponsesWarnings Registry

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" }
FieldMeaning
codeA stable identifier from the closed registry below — match on this
severityinfo < warning < lossy < error
sourceField / targetFieldPaths naming what was affected
detailA 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

SeverityMeaningRecommended handling
infoAn assumption or normalization was made; no data lostLog it
warningSomething didn't verify or is structurally imperfectReview in reconciliation
lossyData present in the source is absent or reduced in the targetReview item — decide whether the loss matters for your flow
errorReserved for strict-mode style failuresFail 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

CodeEmitted when
CHARSET_DROPCharacters with no transliteration were replaced or removed
CHARSET_TRANSLITCharacters were transliterated to the SWIFT X charset (e.g. ü → ue)
CSV_FORMULA_NEUTRALIZEDA 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_AGENTAn agent in the chain cannot be represented in the target
DROP_FIELDA whole source element has no slot in the target format
FIELD_OVERSIZEDA 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_SUPPRESSEDA tenant override rule deliberately dropped this field (always paired with OVERRIDE_APPLIED)
TRUNC_ADDRESSAddress components were dropped or cut flattening to MT lines
TRUNC_NAMEA party/agent name was cut to fit the MT line budget
TRUNC_NARRATIVEInvestigation 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_REFERENCEA reference exceeded the target field length
TRUNC_REMITTANCERemittance text exceeded :70:/:86: capacity
UETR_INVALIDA 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

CodeEmitted when
ADDRESS_UNSTRUCTUREDA structured address was preferred but only unstructured was available
AMOUNT_MISMATCHCharges arithmetic or a page balance chain failed verification
DEBULK_AMOUNT_MISSINGDebulking was requested, but a transaction inside a batch entry states no amount of its own, so the entry was kept as one transaction
ENVELOPE_MISMATCHA Business Application Header names a different message type (MsgDefIdr) than the Document it travels with
STATEMENT_BALANCE_ABSENTAn 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

CodeEmitted when
ACCOUNT_CCY_SUFFIXAn MT :25: account id carried a trailing currency suffix (a known bank dialect); split into IBAN + account currency
ADDRESS_SPLIT_INFERREDStructured address components (post code, town, country, street, building number) were inferred from unstructured address lines; the original lines are kept alongside
CHARGES_DETAIL_UNMAPPEDA charges detail line had no mapping row; carried as narrative/verbatim
CHARGES_DUPLICATEDA return charge restated in two source fields of equal amount was collapsed to one, not double-counted
CODE_UNMAPPED_PROPRIETARYA code had no table mapping and was carried as proprietary
COLUMN_UNMAPPEDA column of a CSV or XLSX payment file matched no known header and no columnMap entry, so it was ignored
DATE_YEAR_INFERREDAn :61: entry-date year was inferred from the value date
ENTRY_DEBULKEDA 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_DROPPEDPart 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_ABSENTAn account report (camt.052) was converted to a statement (camt.053) without a legal sequence number; none is invented
MISSING_REQUIRED_DEFAULTEDA mandatory target element was defaulted (e.g. camt.053 CreDtTm from an MT940 that carries no timestamp)
OVERRIDE_APPLIEDA tenant override rule changed this field's mapping (detail names the action, never values)
PAGED_OUTPUTOutput was split into N MT pages (2,000-character cap per message)
RETURN_REASON_UNMAPPEDA return/cancellation reason code had no mapping row; carried as proprietary/narrative

Using warnings in pipelines

  1. Persist the codes (they're metadata, safe to store) alongside your own record of each conversion.
  2. Alert on lossy in flows where completeness matters — payment chains, regulatory reporting.
  3. Don't string-match detail — it's for humans and may be refined; code is the contract.