Banks mid-migration
Keep older MT-based systems in the loop while your rails move to ISO 20022. Convert at the boundary instead of rewriting every consumer at once.
SWIFT MT ↔ ISO 20022
A stateless, API-first service that converts SWIFT MT messages to and from ISO 20022, normalizes either format to clean JSON, and validates at selectable strictness. Message bodies arenever persisted and never logged; completing a request leaves behind exactly one row of usage metadata.
Free tier: 1,000 live conversions / month · no card required.
Message contents live in request-scoped memory only. The database keeps metadata: type, size, duration, status, warning counts.
Idempotency cache (24h TTL) and the encrypted async batch store (purged on completion; TTL ≤ 24h). Nothing else touches payload content.
All processing and backups stay in the EU. Statelessness makes right-to-erasure trivial: for payloads there is nothing to erase.
Stateless by design
Who it's for
Payments infrastructure increasingly speaks ISO 20022; decades of bank systems still speak MT. Transmute sits in the seam.
Keep older MT-based systems in the loop while your rails move to ISO 20022. Convert at the boundary instead of rewriting every consumer at once.
Statements arrive as MT940 or camt.053 depending on the bank. Normalize either to clean JSON or an accounting file and build against one shape.
Message bodies are never persisted and never logged, with the two 24-hour carve-outs stated right next to the guarantee, so the data-flow answer in your vendor review is one sentence long.
Capabilities
Each card below maps to a live, documented endpoint.
Convert SWIFT MT to and from ISO 20022 MX across statements, confirmations, payments, returns, cancellations, charges and notices: MT940 / MT942 / MT950 / MT900 / MT910 ↔ camt.053 / camt.052 / camt.054, MT103 ↔ pacs.008, MT202 / MT205 ↔ pacs.009, MT101 ↔ pain.001, MT192 / MT292 ↔ camt.056, MT191 / MT291 ↔ camt.106, MT210 ↔ camt.057, and return legs via pacs.004. MX versions auto-detected on input.
Render any statement, report or confirmation straight to OFX, QFX, QBO or Xero CSV, so bank data reaches a ledger without a second tool in the middle.
Parse either format into one frozen, stable canonical JSON shape built for bookkeeping and reconciliation, with amounts always as strings, never floats.
Syntax and schema validation at selectable strictness levels, including CBPR+ checks. Always returns 200 with valid + findings[]; MX output validates against vendored ISO 20022 XSDs.
IBAN / BIC / code checks against free registry data, with a bring-your-own BIC directory plug point. Licensed directory data is never bundled.
Async batch conversion with job polling and signed job.completed webhooks (retry ladder, X-Transmute-Signature).
File-drop / SFTP connectors move files between customer-owned directories (in/ → out/); nothing enters our custody.
License-mode deployment for Enterprise: unlimited within license, rate limiting preserved, your infrastructure.
Lossy or assumed conversion steps surface as deterministic, severity-graded warnings in the response; nothing is dropped silently.
81 directed conversion pairs: 49 between SWIFT MT and ISO 20022, plus 32 straight to accounting file formats.
Every parseable format additionally normalizes to canonical JSON. The full registry is served live by the engine at GET /v1/formats.
One call
Authenticate with a bearer key, POST the message, get back the converted document plus severity-graded warnings and metadata. Raw MT text and bare XML work too.
curl -sS -X POST https://api.transmute.403fin.io/v1/convert \
-H "Authorization: Bearer $TRANSMUTE_KEY" \
-H "Content-Type: application/json" \
-d '{"from":"mt940","to":"camt.053","message":"..."}'const res = await fetch("https://api.transmute.403fin.io/v1/convert", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TRANSMUTE_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ from: "mt940", to: "camt.053", message }),
});
const { result, warnings, meta } = await res.json();import os, requests
res = requests.post(
"https://api.transmute.403fin.io/v1/convert",
headers={"Authorization": f"Bearer {os.environ['TRANSMUTE_KEY']}"},
json={"from": "mt940", "to": "camt.053", "message": message},
)
data = res.json() # {"result": "...camt.053...", "warnings": [...], "meta": {...}}req, _ := http.NewRequest("POST",
"https://api.transmute.403fin.io/v1/convert",
strings.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("TRANSMUTE_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)Full request body omitted for brevity; see the message payload in the quickstart. Sample data is synthetic (published example IBAN, TEST BICs).
POST raw MT text, bare ISO 20022 XML, or a JSON envelope with from/to. Authenticate with a bearer API key.
The engine parses, maps via declarative SR-versioned tables, and renders the target, all in request-scoped memory. Nothing is stored.
Receive the converted document (or canonical JSON) plus deterministic, severity-graded warnings. One row of usage metadata is all that remains.
1,000 live conversions a month on the free tier, no card required.