.NET SDK
The .NET client (netstandard2.0 and net8.0) — typed requests and responses generated from the OpenAPI document, on HttpClient, plus a webhook signature verifier.
Getting it
| Package | Fin403.Transmute |
| Namespaces | Fin403.Transmute (helpers), Fin403.Transmute.Api, .Client, .Model |
| Targets | netstandard2.0 and net8.0 |
| Dependencies | Newtonsoft.Json, Polly; HTTP is System.Net.Http.HttpClient |
dotnet add package Fin403.Transmute --version X.Y.Z
The package version tracks the API release: X.Y.Z is generated from API release vX.Y.Z.
Not on NuGet yet. Until the first release is published, the package is provided during onboarding — contact support.
Convert a message
using Fin403.Transmute;
using Fin403.Transmute.Api;
using Fin403.Transmute.Model;
var http = TransmuteClient.CreateHttpClient(); // reuse one per process
var config = TransmuteClient.CreateConfiguration(
"https://api.transmute.403fin.io",
Environment.GetEnvironmentVariable("TRANSMUTE_KEY"));
var engine = new EngineApi(http, config);
var mt940 = string.Join("\r
",
"{1:F01AAAADEFFXXXX0000000000}{2:I940BBBBDEFFXXXXN}{4:",
":20:STMT0001",
":25:DE89370400440532013000",
":28C:00042/001",
":60F:C260601EUR1000,00",
":61:2606020602C250,00NTRFNONREF//BANKREF1",
":86:INVOICE 4711",
":62F:C260602EUR1250,00",
"-}");
var resp = await engine.ConvertMessageAsync(new ConvertRequest(
to: "camt.053",
message: mt940)); // from omitted → auto-detect
Console.WriteLine(resp.Meta.DetectedType); // "mt940"
var camt053 = resp.Result.GetString();
foreach (var w in resp.Warnings)
Console.WriteLine($"{w.Code} ({w.Severity}): {w.Detail}");
resp.Result holds one string (GetString()) or, when MT paging splits the output, a list (GetList(); Meta.Pages is then set). CreateConfiguration also accepts an OAuth access token in place of an API key. Errors throw ApiException: ErrorCode is the HTTP status and ErrorContent the RFC 9457 problem document, whose type slug is in the error catalog.
API version, Standards Release and envelope
| Option | .NET | What it does |
|---|---|---|
X-Api-Version | TransmuteClient.CreateHttpClient(apiVersion: "2026-06-01") for every request; the xApiVersion: argument on one call wins | Pins date-versioned behaviour — today, the default Standards Release. Unset: your API key's pin, else the current version. See Migrating from SR2025 to SR2026. |
srVersion | new ConvertOptions(srVersion: SRVersion.SR2026) (also normalize, validate, batch) | Explicit Standards Release; always wins over the API version's default. |
envelope (convert) | new ConvertOptions(envelope: ConvertOptions.EnvelopeEnum.Apphdr); Fin for MT targets | apphdr adds a head.001.001.02 Business Application Header before the MX Document; fin wraps MT output in FIN blocks 1 and 2. |
envelope (normalize) | new NormalizeOptions(envelope: NormalizeOptions.EnvelopeEnum.Include) | Adds result.envelope (the source's FIN headers or Business Application Header). |
Options you do not set are not sent (the boolean strict is always sent, as false unless you set it — the API's own default), so an unpinned client follows the API version policy.
Verify a webhook delivery
try
{
WebhookSignature.Verify(
endpointSecret, // "whsec_..." — the full string
Request.Headers["X-Transmute-Signature"], // "t=...,v1=..."
rawBody, // raw bytes, read before parsing
WebhookSignature.DefaultTolerance); // 5 minutes
}
catch (WebhookSignatureException)
{
return BadRequest();
}
Constant-time comparison and the replay-window check are built in — see Webhooks for the delivery contract.
Notes
- Generated with openapi-generator (
csharp,httpclientlibrary) from the same OpenAPI document that serves api.transmute.403fin.io/docs, with the dashboard-internal portal routes removed; a CI gate keeps them in lockstep. - Amount fields are strings in all response types — parse with
decimal, neverdouble.
"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.