Standards Releases
How transmute versions its mapping rules by SWIFT Standards Release (SR2025, SR2026), how to pin a release per request, what SR2026 changes, and how the default release is chosen.
What a Standards Release is
SWIFT publishes a Standards Release (SR) every November: a yearly revision of the MT message formats and of the usage rules that networks apply to ISO 20022 (MX) messages. A release can change which fields are allowed, how long they can be, or, as in 2026, how postal addresses must be structured.
transmute keeps one set of mapping rules per release. Every conversion, normalization and validation runs under exactly one release, and you can choose which. Pinning a release means your output only changes when you decide it should.
| Release | Status in transmute |
|---|---|
SR2025 | The baseline. Every conversion pair has SR2025 rules. The default today. |
SR2026 | The November 2026 release. Adds structured postal-address handling for four payment pairs (below). Every other pair uses its SR2025 rules. |
A release with no rules of its own for a pair falls back to the latest earlier release that has them, never to a later one. That is why SR2026 output is byte-identical to SR2025 output for every pair it does not change.
GET /v1/formats lists the releases this deployment accepts as srVersions:
curl -sS https://api.transmute.403fin.io/v1/formats \
-H "Authorization: Bearer $TRANSMUTE_KEY" | jq '.srVersions'
# ["SR2025", "SR2026"]
Pin a release per request
srVersion works on /v1/convert, /v1/normalize, /v1/validate and on each item of /v1/convert/batch. There are three ways to send it; the first one present wins:
| Form | Where | Example |
|---|---|---|
| JSON envelope | options.srVersion | {"to":"pacs.008","message":"...","options":{"srVersion":"SR2026"}} |
| Query parameter | Raw bodies and file uploads | ?srVersion=SR2026 |
| Header | Raw bodies and file uploads | X-Transmute-SR-Version: SR2026 |
The set is closed. Any other value, including a different case or a future release, is a invalid-input 400 that names the supported values:
{
"type": "https://docs.transmute.403fin.io/errors/invalid-input",
"title": "Invalid input",
"status": 400,
"detail": "unsupported srVersion "SR2027": supported values are SR2025, SR2026",
"instance": "/v1/convert"
}
What SR2026 changes
From 14 November 2026, cross-border ISO 20022 payments must carry each postal address as structured or hybrid data: at least the town and the country as their own elements, with at most two free-text address lines beside them. An address made only of free-text lines is no longer accepted.
Under srVersion=SR2026, transmute applies that to four pairs, in both directions:
| Pair | SR2026 behaviour |
|---|---|
| MT103 → pacs.008, MT101 → pain.001 (and normalizing MT103, MT101, pacs.008, pain.001) | Free-text address lines are split into street, building number, post code, town, state or province, and country when a town and a country can be recognised. |
| pacs.008 → MT103, pain.001 → MT101 | A structured address is written into option F party lines (:50F:, :59F:) so the structure survives. |
| Every other pair | Unchanged: the SR2025 rules apply. |
Address-line splitting (MT or MX in)
transmute reads the free-text lines of a party or agent address and recognises the address layout of 12 countries: DE, AT, CH, FR, ES, IT, NL, BE, GB, US, CA and AU. Each country has its own post-code shape, town-line order (post code first in DE, 10115 BERLIN; post code last in GB and the US) and street-line order (number after the street in DE, HAUPTSTRASSE 12; number first in GB, FR and the US). US, CA and AU addresses also yield a state or province.
The country comes from, in order:
- the country already given (the option F
3/CC/line, or an MXCtryelement); - a line holding only a country code or a country name;
- a
CC-prefix on a line, such asAT-1010 WIEN.
The split is used only if it yields both a town and a country. It never overwrites a component the source already structured, and the original lines are always kept alongside. When it succeeds you get one ADDRESS_SPLIT_INFERRED info warning per address, naming the inferred components (never their values):
{ "code": "ADDRESS_SPLIT_INFERRED", "severity": "info",
"sourceField": ":59a:", "targetField": "creditor",
"detail": "inferred components: streetName, buildingNumber, postCode, townName, country" }
On MX output, the address is written as a hybrid address: the structured elements, plus only the lines they do not already cover, at most two. Further lines are dropped with TRUNC_ADDRESS (lossy). An address that could not be structured is kept as it is and flagged ADDRESS_UNSTRUCTURED (warning), so you can fix it before it reaches a network that rejects it.
Option F composition (MX in, MT out)
A structured address is written into option F lines:
1/the name;2/street and building number in the country's order, then any free-text lines the structure does not cover;3/the country code, then post code and town in the country's order (with the state or province for US, CA and AU).
That layout is the one the splitter reads back, so an MT103 → pacs.008 → MT103 round trip keeps the structure. Characters outside the SWIFT X character set are transliterated before lines are shortened. When a party has to use a free-text option (:50K:, letterless :59:), the last line carries CC-<town line>.
See the difference
This synthetic MT103 is converted under both releases:
cat > mt103.txt <<'MSG'
{1:F01AAAADEFFAXXX0000000000}{2:I103BBBBDEFFXXXXN}{3:{121:00000000-0000-4000-8000-000000002601}}{4:
:20:SR26DE001
:23B:CRED
:32A:261116EUR1500,00
:50F:/DE89370400440532013000
1/MAX EXAMPLE
2/HAUPTSTRASSE 12
3/DE/10115 BERLIN
:52A:AAAADEFFXXX
:57A:BBBBDEFFXXX
:59:/DE89370400440532013000
ERIKA EXAMPLE
RINGSTRASSE 5
AT-1010 WIEN
:70:INVOICE SR26-001
:71A:SHA
-}
MSG
for sr in SR2025 SR2026; do
curl -sS -X POST "https://api.transmute.403fin.io/v1/convert?to=pacs.008&srVersion=$sr" \
-H "Authorization: Bearer $TRANSMUTE_KEY" \
-H "Content-Type: text/plain" \
--data-binary @mt103.txt | jq -r '.result' | grep -oE '<Cdtr>.*</Cdtr>'
done
Creditor under SR2025:
<Cdtr><Nm>ERIKA EXAMPLE</Nm><PstlAdr><AdrLine>RINGSTRASSE 5</AdrLine><AdrLine>AT-1010 WIEN</AdrLine></PstlAdr></Cdtr>
Creditor under SR2026:
<Cdtr><Nm>ERIKA EXAMPLE</Nm><PstlAdr><StrtNm>RINGSTRASSE</StrtNm><BldgNb>5</BldgNb><PstCd>1010</PstCd><TwnNm>WIEN</TwnNm><Ctry>AT</Ctry></PstlAdr></Cdtr>
Converting the SR2026 pacs.008 back to MT103 under SR2026 gives option F lines in each country's order:
:50F:/DE89370400440532013000
1/MAX EXAMPLE
2/HAUPTSTRASSE 12
3/DE/10115 BERLIN
...
:59F:/DE89370400440532013000
1/ERIKA EXAMPLE
2/RINGSTRASSE 5
3/AT/1010 WIEN
CBPR+ address rules
Validation follows the release too. With level=cbpr and srVersion=SR2026, two rules check every party and agent postal address on pacs.008, pacs.009, pacs.004, camt.056 and camt.057:
| Finding code | Severity | Raised when |
|---|---|---|
cbpr.address_structure_required | error | A PstlAdr carries AdrLine but no TwnNm or no Ctry (one finding per missing element) |
cbpr.address_hybrid_overflow | error | A PstlAdr with structured elements also carries more than two AdrLine |
Under SR2025 neither rule runs. Validating the SR2025 pacs.008 from the example above passes under srVersion=SR2025 and returns two cbpr.address_structure_required findings (creditor TwnNm and Ctry) under srVersion=SR2026.
How the default release is chosen
When a request names no srVersion, the release comes from the request's API version, a date you can pin with the X-Api-Version header or on your API key. In full, the first rule that applies wins:
- an explicit
srVersion(envelope option, then query parameter, then header); - the default release of the resolved API version (
X-Api-Versionheader, then the key's pin, then the current version); - the service default,
SR2025.
| API version | Default release | Status |
|---|---|---|
2026-06-01 | SR2025 | Current: every request without a pin gets it. Never re-pointed. |
2026-11-14 | SR2026 | Planned, not accepted yet. It is due to become the current version with the 14 November 2026 release, announced in the changelog first. Sending it today is a 400. |
A change of default release only ever ships as a new API version date. If you pin 2026-06-01 (or send srVersion: SR2025), you stay on SR2025 when the current version moves. If you pin nothing, you move with it. See API Versioning for the header, key pins and the closed date list.
Batch jobs and the connector
- Batch. Each item can carry its own
options.srVersion. An item without one is stored with the release its request resolved to when the job was accepted, so a queued job keeps that release even if the current API version moves while it waits. - On-premise connector. A watch's
options.srVersionpins its release. An unknown value stops the connector at startup instead of falling back. A watch without one uses the service default,SR2025.
Before 14 November 2026
- Run your messages through
srVersion=SR2026on a test key and compare the output. - If you read MX postal addresses, read
StrtNm,BldgNb,PstCd,TwnNmandCtryas well asAdrLine. - If you read MT option F parties, expect
2/and3/lines built from structured addresses. - Decide whether to pin (
X-Api-Version: 2026-06-01orsrVersion: SR2025) or to move with the default.
The step-by-step version of this list is in SR2025 to SR2026.
"SWIFT" is a trademark of S.W.I.F.T. SCRL. transmute converts SWIFT MT messages; it is not affiliated with, endorsed by, or certified by SWIFT.