#pApiAuth
Riferimento completo dei campi API & CLI: tutti i 12 tipi di oggetto, endpoint REST & POST /api/v1/send
Questo riferimento documenta ogni proprietà JSON, tipo di dato, valore enum, impostazione predefinita e ruolo RBAC minimo di tutti i 12 oggetti di gestione (/api/admin/cli/objects/{type} & nextxch-cli), nonché l'invio di e-mail transazionali (POST /api/v1/send). Usare la casella di filtro istantaneo sopra la tabella per cercare qualsiasi proprietà, come dkimSigningMode, tlsMode, allowedCidrs o warmingEnabled.
Introspezione live nel terminale o via HTTP: ogni nextxch espone questo schema completo in JSON leggibile dalle macchine su GET /api/admin/cli/schema (con header SHA-256 X-Nextxch-Schema-Version). Nel terminale, eseguire in qualsiasi momento nextxch-cli describe <Type> (ad es. nextxch-cli describe Domain o nextxch-cli describe SmtpQueue).
TransactionalSendRequest (POST /api/v1/send)
13
IntegrationKey (API v1)
9
CalendarEvent (API v1)
12
Rooms & Booking (API v1)
6
Contact, Directory & Sharing (API v1)
9
Webhook (API v1)
4
Tenant
11
Domain
19
Account (Account/User & Account/List)
18
Alias
7
ApiKey
11
Route
10
TransactionalSend (Singleton)
11
ReputationShield (Singleton)
20
SpamGuard (Singleton)
15
SmtpQueue (Singleton)
19
TransportRules & Server (Singletons)
11
TransactionalSendRequest (POST /api/v1/send)
Chiave: Idempotency-Key
RBAC: User+
Endpoint HTTP JSON ad alto throughput per il recapito da web app, ERP, CRM e codici 2FA, con priorità per categoria, IP warming, controllo preliminare delle soppressioni e idempotenza di 24 ore.
/api/v1/send
Accoda e firma l'e-mail transazionale (UTF-8 Multipart/Alternative + allegati)
/api/v1/unsubscribe/{token}
Endpoint pubblico One-Click-Unsubscribe RFC 8058 (token firmato DKIM)
from
string
FACOLTATIVO
Key senderAddress
to
string[]
OBBLIGATORIO
cc
string[]
FACOLTATIVO
[]
bcc
string[]
FACOLTATIVO
[]
replyTo
string
FACOLTATIVO
subject
string
OBBLIGATORIO
textBody
string
FACOLTATIVO
htmlBody
string
FACOLTATIVO
category
string
FACOLTATIVO
transactional
"critical""transactional""notification""marketing"overflowMode
string
FACOLTATIVO
DeferQueue
"DeferQueue""Reject429"idempotencyKey
string
FACOLTATIVO
Header Idempotency-Key
headers
Record<string, string>
FACOLTATIVO
{}
attachments
SendAttachmentDto[]
FACOLTATIVO
[]
{
"from": "Abrechnung <rechnung@firma.de>",
"to": ["einkauf@kunde.de"],
"cc": ["buchhaltung@firma.de"],
"subject": "Ihre elektronische Rechnung RE-2026-90412",
"category": "transactional",
"overflowMode": "DeferQueue",
"textBody": "Guten Tag,\nanbei erhalten Sie Ihre Rechnung RE-2026-90412.",
"htmlBody": "<p>Guten Tag,</p><p>anbei erhalten Sie Ihre Rechnung <strong>RE-2026-90412</strong>.</p>",
"headers": {
"X-ERP-Document-Id": "RE-2026-90412"
},
"attachments": [
{
"fileName": "RE-2026-90412.pdf",
"contentType": "application/pdf",
"base64Content": "JVBERi0xLjcKJcfs..."
}
]
}
# 1) Kleinstprivilegierten Sende-Key (Role=User) für rechnung@firma.de erstellen:
nextxch-cli create ApiKey \
--set label="ERP Rechnungsversand" \
--set role=User \
--set senderAddress=rechnung@firma.de \
--set defaultCategory=transactional \
--set allowedCidrs=10.20.0.0/16
# 2) Risikofreier Trockentest gegen die integrierte Sandbox-Sink-Domain:
# ok@sink.nextxch.local | bounce@sink.nextxch.local | defer@sink.nextxch.local
curl -fsS -X POST "https://mail.firma.de/api/v1/send" \
-H "Authorization: Bearer smk_01968f2a_..." \
-H "Idempotency-Key: inv-2026-90412" \
-H "Content-Type: application/json" \
-d '{
"from": "rechnung@firma.de",
"to": ["einkauf@kunde.de"],
"subject": "Ihre Rechnung RE-2026-90412",
"category": "transactional",
"textBody": "Guten Tag, anbei Ihre Rechnung RE-2026-90412.",
"htmlBody": "<p>Guten Tag, anbei Ihre Rechnung <b>RE-2026-90412</b>.</p>"
}'
using System.Net.Http.Headers;
using System.Net.Http.Json;
using var http = new HttpClient { BaseAddress = new Uri("https://mail.firma.de") };
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "smk_01968f2a_...");
http.DefaultRequestHeaders.Add("Idempotency-Key", "inv-2026-90412");
var response = await http.PostAsJsonAsync("/api/v1/send", new
{
from = "rechnung@firma.de",
to = new[] { "einkauf@kunde.de" },
subject = "Ihre Rechnung RE-2026-90412",
category = "transactional",
textBody = "Guten Tag, anbei Ihre Rechnung RE-2026-90412.",
htmlBody = "<p>Guten Tag, anbei Ihre Rechnung <strong>RE-2026-90412</strong>.</p>"
});
response.EnsureSuccessStatusCode();
IntegrationKey (API v1)
Chiave: id
RBAC: TenantAdmin+
Chiave di integrazione con scope per /api/v1. Una chiave agisce per un utente oppure, come integrazione del tenant, per l'utente indicato nell'header X-Nextxch-Act-As. Senza lo scope l'API risponde 403; un utente di un altro tenant restituisce 404. Facoltativamente OAuth 2.0 client credentials (token valido 1 ora).
/api/admin/integrations/keys
Crea una chiave (admin, mostrata una sola volta)
/api/admin/integrations/keys/{id}
Modifica ambiti
/api/admin/integrations/keys/{id}
Revoca una chiave (e i relativi token OAuth)
/api/v1/oauth/token
OAuth 2.0 client_credentials: key id + key per un access token
/api/v1/me
Chiave, ambiti e utente che agisce
/api/v1/openapi.json
Documento OpenAPI 3.1 dell'installazione
label
string
OBBLIGATORIO
mode
string
OBBLIGATORIO
user
"user""tenant"userEmail
string
FACOLTATIVO
scopes
string[]
OBBLIGATORIO
"calendar.read""calendar.write""rooms.read""booking.read""booking.write""contacts.read""contacts.write""directory.read""sharing.manage""webhooks.manage""mail.send"domainId
guid
FACOLTATIVO
allowedCidrs
string[]
FACOLTATIVO
[]
expiresInDays
integer
FACOLTATIVO
senderAddress
string
FACOLTATIVO
apiKey
string
SOLA LETTURA
{
"label": "CRM",
"mode": "tenant",
"scopes": ["calendar.write", "rooms.read", "contacts.write", "webhooks.manage"],
"allowedCidrs": ["203.0.113.0/24"],
"expiresInDays": 365
}
# Integrations-Schlüssel: Admin > API & Integrationen > Neuer Schlüssel
# Danach z. B. ein Access-Token per OAuth 2.0 Client Credentials holen:
curl -fsS -X POST "https://mail.firma.de/api/v1/oauth/token" \
-d grant_type=client_credentials \
-d client_id=0196c3a2-5f1e-7c11-9a20-1c2d3e4f5a6b \
-d client_secret=smk_0196c3a25f1e7c119a201c2d3e4f5a6b_... \
-d scope="calendar.read rooms.read"
curl -fsS "https://mail.firma.de/api/v1/me" \
-H "Authorization: Bearer smk_0196c3a2..." \
-H "X-Nextxch-Act-As: anna@firma.de"
using var http = new HttpClient { BaseAddress = new Uri("https://mail.firma.de") };
http.DefaultRequestHeaders.Authorization = new("Bearer", "smk_0196c3a2...");
http.DefaultRequestHeaders.Add("X-Nextxch-Act-As", "anna@firma.de");
var me = await http.GetFromJsonAsync<JsonElement>("/api/v1/me");
CalendarEvent (API v1)
Chiave: hrefName
RBAC: User+
Eventi con serie ed eccezioni, partecipanti, sale, inviti, risposte, disponibilità, calendari condivisi e globali e link di invito. Ambiti calendar.read e calendar.write. Orari in UTC (ISO-8601), fusi orari come nomi IANA.
/api/v1/calendars
Calendari propri, condivisi, globali e di risorse
/api/v1/calendar/events?from&to&calendarId&limit&cursor
Occorrenze in una finestra temporale (serie espanse)
/api/v1/calendar/events
Crea un evento (invita persone e sale)
/api/v1/calendar/events/{hrefName}
Evento con serie ed eccezioni
/api/v1/calendar/events/{hrefName}
Modifica; scope=occurrence|following per parti di una serie
/api/v1/calendar/events/{hrefName}
Elimina, facoltativamente con annullamenti (notify=true)
/api/v1/calendar/events/{hrefName}/respond
Rispondi a un invito
/api/v1/calendar/events/{hrefName}/invite-link
Link di invito firmato
/api/v1/calendar/events/{hrefName}/ics
iCalendar grezzo
/api/v1/calendar/freebusy
Disponibilità di persone e sale
title
string
OBBLIGATORIO
startUtc
datetime
OBBLIGATORIO
endUtc
datetime
OBBLIGATORIO
timeZone
string
FACOLTATIVO
Europe/Berlin
allDay
boolean
FACOLTATIVO
false
attendees
Attendee[]
FACOLTATIVO
[]
sendInvitations
boolean
FACOLTATIVO
false
recurrence
Ricorrenza
FACOLTATIVO
showAs
string
FACOLTATIVO
busy
"free""tentative""busy""oof""workingElsewhere"isPrivate
boolean
FACOLTATIVO
false
calendarId
string
FACOLTATIVO
teamsMeeting
boolean
FACOLTATIVO
{
"title": "Projektstart",
"startUtc": "2026-12-03T09:00:00Z",
"endUtc": "2026-12-03T10:00:00Z",
"timeZone": "Europe/Berlin",
"attendees": [
{ "email": "bernd@firma.de" },
{ "email": "raum-1@firma.de" }
],
"sendInvitations": true
}
# Benötigte Scopes: calendar.read (lesen), calendar.write (schreiben)
# Einen Raum buchen: Raumadresse als Teilnehmer eintragen
curl -fsS -X POST "https://mail.firma.de/api/v1/calendar/events" \
-H "Authorization: Bearer smk_0196c3a2..." \
-H "X-Nextxch-Act-As: anna@firma.de" \
-H "Content-Type: application/json" \
-d '{"title":"Projektstart","startUtc":"2026-12-03T09:00:00Z","endUtc":"2026-12-03T10:00:00Z","timeZone":"Europe/Berlin","attendees":[{"email":"raum-1@firma.de"}]}'
var res = await http.PostAsJsonAsync("/api/v1/calendar/events", new
{
title = "Projektstart",
startUtc = DateTimeOffset.Parse("2026-12-03T09:00:00Z"),
endUtc = DateTimeOffset.Parse("2026-12-03T10:00:00Z"),
timeZone = "Europe/Berlin",
attendees = new[] { new { email = "raum-1@firma.de" } }
});
string href = (await res.Content.ReadFromJsonAsync<JsonElement>()).GetProperty("data").GetProperty("hrefName").GetString()!;
Rooms & Booking (API v1)
Chiave: id
RBAC: User+
Sale e risorse con disponibilità (rooms.read) e pagine di prenotazione come Calendly (booking.read, booking.write): pagina di prenotazione, tipi di evento, slot liberi, lettura e cancellazione delle prenotazioni. Una sala si prenota tramite un evento con la sala come partecipante.
/api/v1/rooms?startUtc&endUtc&category
Sale e risorse, con disponibilità per la finestra temporale
/api/v1/rooms/{email}/availability
Orari occupati di una sala
/api/v1/booking/profile
Pagina di prenotazione con orari e tipi di evento
/api/v1/booking/event-types
Tipi di evento
/api/v1/booking/event-types
Crea un tipo di evento
/api/v1/booking/event-types/{id}/slots?from&to
Orari di inizio liberi (max. 42 giorni)
/api/v1/booking/bookings?status&from&to
Prenotazioni
/api/v1/booking/bookings/{id}/cancel
Annulla una prenotazione (l'ospite viene informato)
slots[].startUtc
datetime
SOLA LETTURA
slots[].endUtc
datetime
SOLA LETTURA
slots[].staff
object[]
SOLA LETTURA
status
string
SOLA LETTURA
"confirmed""cancelled"guest
object
SOLA LETTURA
free
boolean
SOLA LETTURA
{
"ok": true,
"data": {
"eventTypeId": "beratung-3f2a",
"durationMinutes": 30,
"timeZone": "Europe/Berlin",
"slots": [
{ "startUtc": "2026-12-04T08:00:00Z", "endUtc": "2026-12-04T08:30:00Z", "staff": [] }
]
}
}
# Benötigte Scopes: rooms.read, booking.read, booking.write
curl -fsS "https://mail.firma.de/api/v1/rooms?startUtc=2026-12-03T09:00:00Z&endUtc=2026-12-03T10:00:00Z" \
-H "Authorization: Bearer smk_0196c3a2..."
var slots = await http.GetFromJsonAsync<JsonElement>("/api/v1/booking/event-types/beratung/slots");
foreach (var s in slots.GetProperty("data").GetProperty("slots").EnumerateArray())
Console.WriteLine(s.GetProperty("startUtc").GetString());
Contact, Directory & Sharing (API v1)
Chiave: hrefName
RBAC: User+
Contatti personali con tutti i campi e foto (contacts.read, contacts.write, If-Match per la protezione dai conflitti), elenco indirizzi globale (directory.read) e condivisioni e delega (sharing.manage, delega = concessione sulla casella di posta con sendAs o sendOnBehalf).
/api/v1/contacts?q
Cerca contatti
/api/v1/contacts
Crea un contatto
/api/v1/contacts/{hrefName}
Modifica un contatto (i campi null restano invariati)
/api/v1/contacts/{hrefName}
Elimina un contatto
/api/v1/directory?q&type
Elenco indirizzi globale
/api/v1/sharing/grants
Concessioni proprie
/api/v1/sharing/grants
Imposta o rimuove un'autorizzazione
/api/v1/sharing/shared-with-me
Condivisi con me
givenName
string
FACOLTATIVO
familyName
string
FACOLTATIVO
organization
string
FACOLTATIVO
emails
TypedValue[]
FACOLTATIVO
[]
phones
TypedValue[]
FACOLTATIVO
[]
addresses
Address[]
FACOLTATIVO
[]
birthday
string
FACOLTATIVO
photo
string
SOLO SCRITTURA (SEGRETO)
permissions
string[]
FACOLTATIVO
"freeBusy""read""write""delete""sendOnBehalf""sendAs""manage"{
"givenName": "Clara",
"familyName": "Kunde",
"organization": "Kunde AG",
"emails": [{ "type": "work", "value": "clara@kunde.example" }],
"phones": [{ "type": "cell", "value": "+49 170 1234567" }]
}
# Benötigte Scopes: contacts.read, contacts.write, directory.read, sharing.manage
curl -fsS -X POST "https://mail.firma.de/api/v1/contacts" \
-H "Authorization: Bearer smk_0196c3a2..." \
-H "Content-Type: application/json" \
-d '{"givenName":"Clara","familyName":"Kunde","emails":[{"type":"work","value":"clara@kunde.example"}]}'
await http.PutAsJsonAsync("/api/v1/sharing/grants", new
{
kind = "calendar", granteeType = "user", grantee = "bernd@firma.de", permissions = new[] { "read" }
});
Webhook (API v1)
Chiave: id
RBAC: User+
Eventi come JSON POST firmato: calendar.event.created, calendar.event.updated, calendar.event.deleted, calendar.invitation.replied, booking.created, booking.rescheduled, booking.cancelled. Firma X-Nextxch-Signature: v1=hex(HMAC-SHA256(secret, X-Nextxch-Timestamp + "." + body)). Nuovi tentativi dopo 30 s, 2 min, 10 min, 1 h e 6 h.
/api/v1/webhooks
Webhook del tenant
/api/v1/webhooks
Registrare un webhook (secret solo nella risposta)
/api/v1/webhooks/{id}
Elimina un webhook
/api/v1/webhooks/{id}/deliveries
Recapiti recenti
/api/v1/webhooks/{id}/test
Invia un evento di prova
url
string
OBBLIGATORIO
events
string[]
OBBLIGATORIO
"calendar.event.created""calendar.event.updated""calendar.event.deleted""calendar.invitation.replied""booking.created""booking.rescheduled""booking.cancelled""*"secret
string
SOLA LETTURA
id (Ereignis)
string
SOLA LETTURA
{
"id": "evt_5c1f0e9a2b7d4c3e8f601a2b",
"type": "calendar.invitation.replied",
"createdAtUtc": "2026-12-01T10:15:02Z",
"tenantId": "0196c3a2-0000-7000-8000-000000000001",
"data": {
"calendarId": "0196c3a25f1e7c11:default",
"hrefName": "0196c3a2@nextxch.ics",
"title": "Projektstart",
"startUtc": "2026-12-03T09:00:00Z",
"attendee": { "email": "bernd@firma.de", "partStat": "ACCEPTED" }
}
}
# Signatur prüfen (Bash):
# expected="v1=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | cut -d' ' -f2)"
curl -fsS -X POST "https://mail.firma.de/api/v1/webhooks" \
-H "Authorization: Bearer smk_0196c3a2..." \
-H "Content-Type: application/json" \
-d '{"url":"https://crm.firma.de/hooks/nextxch","events":["calendar.event.created","booking.created"]}'
// ASP.NET Core receiver
app.MapPost("/hooks/nextxch", async (HttpRequest req) =>
{
using var ms = new MemoryStream();
await req.Body.CopyToAsync(ms);
string ts = req.Headers["X-Nextxch-Timestamp"]!;
byte[] mac = HMACSHA256.HashData(Encoding.UTF8.GetBytes(secret), [.. Encoding.ASCII.GetBytes(ts + "."), .. ms.ToArray()]);
return req.Headers["X-Nextxch-Signature"] == "v1=" + Convert.ToHexStringLower(mac) ? Results.Ok() : Results.Unauthorized();
});
Tenant
Chiave: slug
RBAC: ServerAdmin+
Confine organizzativo multi-tenant che isola domini, principal, quote di archiviazione (GiB) e la conservazione di conformità GoBD WORM predefinita.
/api/admin/cli/objects/Tenant
Elenca tutti i tenant
/api/admin/cli/objects/Tenant/{slugOrId}
Restituisce il tenant tramite slug o UUID
/api/admin/cli/objects/Tenant
Crea un nuovo tenant
/api/admin/cli/objects/Tenant/{slugOrId}
Aggiorna direttamente le quote del tenant
id
guid
SOLA LETTURA
UUIDv7
slug
string
PRIMARY KEY
name
string
OBBLIGATORIO
isActive
boolean
FACOLTATIVO
true
maxDomains
integer
FACOLTATIVO
100
maxPrincipals
integer
FACOLTATIVO
10000
quotaGb
integer
FACOLTATIVO
100
outboundDailyLimit
integer
FACOLTATIVO
25000
defaultLockMode
string
FACOLTATIVO
Normal
"Normal""Governance""Compliance""LegalHold"defaultRetentionDays
integer
FACOLTATIVO
0
createdAtUtc
datetime
SOLA LETTURA
{
"slug": "acme",
"name": "ACME Logistik GmbH",
"isActive": true,
"maxDomains": 50,
"maxPrincipals": 2500,
"quotaGb": 250,
"outboundDailyLimit": 25000,
"defaultLockMode": "Compliance",
"defaultRetentionDays": 3650
}
# Mandant anlegen:
nextxch-cli create Tenant \
--set slug=acme \
--set name="ACME Logistik GmbH" \
--set quotaGb=250 \
--set defaultLockMode=Compliance \
--set defaultRetentionDays=3650
# Mandant abfragen & Kontingent erhöhen:
nextxch-cli get Tenant acme
nextxch-cli update Tenant acme --set quotaGb=500
curl -fsS -X POST "https://mail.firma.de/api/admin/cli/objects/Tenant" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"slug":"acme","name":"ACME Logistik GmbH","quotaGb":250,"defaultLockMode":"Compliance","defaultRetentionDays":3650}'
var payload = new
{
slug = "acme",
name = "ACME Logistik GmbH",
quotaGb = 250,
defaultLockMode = "Compliance",
defaultRetentionDays = 3650
};
using var res = await http.PostAsJsonAsync("/api/admin/cli/objects/Tenant", payload);
Domain
Chiave: name
RBAC: TenantAdmin+
Dominio di posta ospitato con generazione automatica parallela delle chiavi Dual-DKIM (RSA-2048 + Ed25519), policy di conservazione GoBD WORM, plus-addressing e limiti di frequenza.
/api/admin/cli/objects/Domain
Elenca tutti i domini
/api/admin/cli/objects/Domain/{name}
Restituisce la configurazione del dominio & i selettori DKIM
/api/admin/cli/objects/Domain
Crea il dominio & genera le chiavi DKIM RSA-2048 + Ed25519
/api/admin/cli/objects/Domain/{name}
Aggiorna modalità DKIM, quote o conservazione in 0 ms
/api/admin/cli/dns/{name}?live=true
Verifica i record DNS live o esporta la zona BIND RFC 1035
id
guid
SOLA LETTURA
UUIDv7
name
string
PRIMARY KEY
tenant
string
FACOLTATIVO
default
isActive
boolean
FACOLTATIVO
true
postmasterAddress
string
FACOLTATIVO
postmaster@<name>
dkimSigningMode
string
FACOLTATIVO
Dual
"Rsa2048""Ed25519""Dual"dkimRsaSelector
string
FACOLTATIVO
s2026
dkimRsaDnsName
string
SOLA LETTURA
s2026._domainkey.<name>
dkimEd25519Selector
string
FACOLTATIVO
ed2026
dkimEd25519DnsName
string
SOLA LETTURA
ed2026._domainkey.<name>
retentionLockMode
string
FACOLTATIVO
Normal
"Normal""Governance""Compliance""LegalHold"retentionDays
integer
FACOLTATIVO
0
quotaGb
integer
FACOLTATIVO
50
maxMessageSizeMb
integer
FACOLTATIVO
50
maxAccounts
integer
FACOLTATIVO
1000
outboundDailyLimit
integer
FACOLTATIVO
5000
outboundHourlyLimit
integer
FACOLTATIVO
1000
usePlusAddressing
boolean
FACOLTATIVO
true
createdAtUtc
datetime
SOLA LETTURA
{
"name": "muster-logistik.de",
"tenant": "default",
"isActive": true,
"postmasterAddress": "postmaster@muster-logistik.de",
"dkimSigningMode": "Dual",
"dkimRsaSelector": "s2026",
"dkimEd25519Selector": "ed2026",
"retentionLockMode": "Compliance",
"retentionDays": 3650,
"quotaGb": 100,
"maxMessageSizeMb": 50,
"maxAccounts": 500,
"outboundDailyLimit": 10000,
"outboundHourlyLimit": 2000,
"usePlusAddressing": true
}
# Domain mit Dual-DKIM und 10 Jahren GoBD-Compliance anlegen:
nextxch-cli create Domain \
--set name=muster-logistik.de \
--set dkimSigningMode=Dual \
--set retentionLockMode=Compliance \
--set retentionDays=3650
# Fertige RFC-1035 BIND-Zonendatei exportieren & DNS live prüfen:
nextxch-cli dns muster-logistik.de --bind > muster-logistik.de.zone
nextxch-cli dns muster-logistik.de --live
curl -fsS -X PATCH "https://mail.firma.de/api/admin/cli/objects/Domain/muster-logistik.de" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"dkimSigningMode":"Dual","retentionLockMode":"Compliance","retentionDays":3650}'
using var res = await http.PatchAsJsonAsync(
"/api/admin/cli/objects/Domain/muster-logistik.de",
new { dkimSigningMode = "Dual", quotaGb = 200 });
res.EnsureSuccessStatusCode();
Account (Account/User & Account/List)
Chiave: email
RBAC: TenantAdmin+
Rappresenta una casella di posta utente (@type="User", con IMAP/JMAP/CalDAV/CardDAV/ActiveSync) o una lista di distribuzione (@type="List" con members[]).
/api/admin/cli/objects/Account?filter=role=TenantAdmin
Elenca/filtra account e liste di distribuzione
/api/admin/cli/objects/Account/User
Crea una nuova casella di posta utente con cartelle RFC 6154
/api/admin/cli/objects/Account/List
Crea una nuova lista di distribuzione
/api/admin/cli/objects/Account/{email}
Aggiorna quota, inoltro, risposta automatica o password
/api/admin/cli/objects/Account/{email}
Elimina un account in modo logico (soft delete)
id
guid
SOLA LETTURA
UUIDv7
@type
string
FACOLTATIVO
User
"User""List"email
string
PRIMARY KEY
displayName
string
FACOLTATIVO
Lokalteil
password
string
SOLO SCRITTURA (SEGRETO)
role
string
FACOLTATIVO
User
"User""ComplianceAuditor""TenantAdmin""ServerAdmin"isActive
boolean
FACOLTATIVO
true
quotaMb
integer
FACOLTATIVO
5120
usedBytes
long
SOLA LETTURA
0
outboundDailyLimit
integer
FACOLTATIVO
500
forwardAddress
string
FACOLTATIVO
forwardKeepOriginal
boolean
FACOLTATIVO
true
vacationEnabled
boolean
FACOLTATIVO
false
vacationSubject
string
FACOLTATIVO
vacationBody
string
SOLO SCRITTURA (SEGRETO)
twoFactorEnabled
boolean
SOLA LETTURA
false
members
string[]
FACOLTATIVO
[]
createdAtUtc
datetime
SOLA LETTURA
{
"@type": "User",
"email": "anna.weber@muster-logistik.de",
"displayName": "Anna Weber (IT-Leitung)",
"password": "SicheresStartPasswort!2026",
"role": "TenantAdmin",
"isActive": true,
"quotaMb": 15360,
"outboundDailyLimit": 1000,
"forwardAddress": null,
"forwardKeepOriginal": true,
"vacationEnabled": false,
"vacationSubject": "Abwesenheitsnotiz: Anna Weber",
"vacationBody": "Ich bin ab Montag wieder erreichbar."
}
# Benutzerpostfach (15 GiB Quota) anlegen:
nextxch-cli create Account/User \
--set email=anna.weber@muster-logistik.de \
--set displayName="Anna Weber" \
--set password="SicheresStartPasswort!2026" \
--set quotaMb=15360
# Verteilerliste anlegen:
nextxch-cli create Account/List \
--set email=team@muster-logistik.de \
--set displayName="Disposition & Einkauf" \
--set members=anna.weber@muster-logistik.de,dispo@muster-logistik.de
curl -fsS -X POST "https://mail.firma.de/api/admin/cli/objects/Account/User" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"email":"anna.weber@muster-logistik.de","displayName":"Anna Weber","password":"SicheresStartPasswort!2026","quotaMb":15360}'
await http.PostAsJsonAsync("/api/admin/cli/objects/Account/User", new
{
email = "anna.weber@muster-logistik.de",
displayName = "Anna Weber",
password = "SicheresStartPasswort!2026",
quotaMb = 15360
});
Alias
Chiave: address
RBAC: TenantAdmin+
Alias e-mail secondario o alias di privacy mascherato usa e getta, instradato verso una casella di posta Account primaria o una lista di distribuzione.
/api/admin/cli/objects/Alias
Elenca tutti gli alias e gli indirizzi e-mail mascherati
/api/admin/cli/objects/Alias
Crea un nuovo alias instradato verso una casella di posta di destinazione
/api/admin/cli/objects/Alias/{address}
Attiva/sospende un alias o ne aggiorna la destinazione
/api/admin/cli/objects/Alias/{address}
Elimina l'alias
address
string
PRIMARY KEY
target
string
OBBLIGATORIO
principalId
guid
SOLA LETTURA
description
string
FACOLTATIVO
""
isMasked
boolean
FACOLTATIVO
false
isEnabled
boolean
FACOLTATIVO
true
createdAtUtc
datetime
SOLA LETTURA
{
"address": "shop-8f2k@muster-logistik.de",
"target": "anna.weber@muster-logistik.de",
"description": "Fachbuchhandlung / Online-Bestellung",
"isMasked": true,
"isEnabled": true
}
# Masked-Email-Alias anlegen:
nextxch-cli create Alias \
--set address=shop-8f2k@muster-logistik.de \
--set target=anna.weber@muster-logistik.de \
--set description="Fachbuchhandlung" \
--set isMasked=true
# Alias bei Spam-Aufkommen mit 1 Befehl stummschalten:
nextxch-cli update Alias shop-8f2k@muster-logistik.de --set isEnabled=false
curl -fsS -X POST "https://mail.firma.de/api/admin/cli/objects/Alias" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"address":"vertrieb@muster-logistik.de","target":"anna.weber@muster-logistik.de","description":"Vertrieb & Angebote"}'
await http.PostAsJsonAsync("/api/admin/cli/objects/Alias", new
{
address = "vertrieb@muster-logistik.de",
target = "anna.weber@muster-logistik.de",
description = "Vertrieb & Angebote",
isEnabled = true
});
ApiKey
Chiave: id
RBAC: TenantAdmin+
Chiave API con ambito immutabile, limitata tramite RBAC e CIDR (smk_<id>_<secret>) per /api/v1/send, SCIM 2.0 o nextxch-cli.
/api/admin/cli/objects/ApiKey
Elenca le chiavi API attive (secret omesso)
/api/admin/cli/objects/ApiKey
Genera una nuova chiave API e restituisce apiKey (smk_...) una sola volta
/api/admin/cli/objects/ApiKey/{id}
Revoca immediatamente la chiave API
id
guid
SOLA LETTURA
UUIDv7
apiKey
string
SOLO CREAZIONE
smk_<id>_<secret>
label
string
OBBLIGATORIO
role
string
FACOLTATIVO
TenantAdmin
"User""ComplianceAuditor""TenantAdmin""ServerAdmin"senderAddress
string
FACOLTATIVO
defaultCategory
string
FACOLTATIVO
transactional
"critical""transactional""notification""marketing"allowedCidrs
string[]
FACOLTATIVO
[] (Alle IPs)
expiresInDays
integer
SOLO SCRITTURA (SEGRETO)
null (Kein Ablauf)
expiresAtUtc
datetime
SOLA LETTURA
outboundDailyLimit
integer
FACOLTATIVO
10000
isActive
boolean
SOLA LETTURA
true
{
"label": "Shopware 6 ERP Rechnungsversand",
"role": "User",
"senderAddress": "rechnung@muster-logistik.de",
"defaultCategory": "transactional",
"allowedCidrs": ["10.20.10.15/32", "2a01:4f8:120:44aa::/64"],
"expiresInDays": 180,
"outboundDailyLimit": 10000
}
# CIDR-geschützten Key für Ansible / nextxch-cli erstellen:
nextxch-cli create ApiKey \
--set label="GitLab CI / Ansible" \
--set role=TenantAdmin \
--set allowedCidrs=10.20.0.0/16 \
--set expiresInDays=90
# Schlüssel widerrufen:
nextxch-cli delete ApiKey 0195f2a0-8b14-7000-9a10-001122334455
curl -fsS -X POST "https://mail.firma.de/api/admin/cli/objects/ApiKey" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"label":"Shopware 6","role":"User","senderAddress":"rechnung@muster-logistik.de","allowedCidrs":["10.20.10.15/32"],"expiresInDays":180}'
var res = await http.PostAsJsonAsync("/api/admin/cli/objects/ApiKey", new
{
label = "Shopware 6",
role = "User",
senderAddress = "rechnung@muster-logistik.de",
allowedCidrs = new[] { "10.20.10.15/32" },
expiresInDays = 180
});
var created = await res.Content.ReadFromJsonAsync<JsonElement>();
string oneTimeSecretKey = created.GetProperty("apiKey").GetString()!;
Route
Chiave: domain
RBAC: ServerAdmin+
Instradamento SMTP in uscita per dominio o eccezione per certificato TLS (ad es. StartTlsIgnoreCert per host MX partner con certificati non corrispondenti, oppure connettore smart host).
/api/admin/cli/objects/Route
Elenca tutte le route in uscita personalizzate
/api/admin/cli/objects/Route
Crea una route di dominio personalizzata o un override TLS
/api/admin/cli/objects/Route/{domain}
Aggiorna host di destinazione, porta o modalità TLS
/api/admin/cli/objects/Route/{domain}
Elimina la route personalizzata
domain
string
PRIMARY KEY
targetHost
string
FACOLTATIVO
"" (Auto DNS-MX)
targetPort
integer
FACOLTATIVO
25
tlsMode
string
FACOLTATIVO
StartTlsOptional
"StartTlsOptional""StartTlsRequired""StartTlsIgnoreCert""ImplicitTls""ImplicitTlsIgnoreCert""None"username
string
FACOLTATIVO
password
string
SOLO SCRITTURA (SEGRETO)
hasPassword
boolean
SOLA LETTURA
false
clearPassword
boolean
SOLO SCRITTURA (SEGRETO)
false
description
string
FACOLTATIVO
enabled
boolean
FACOLTATIVO
true
{
"domain": "neff.me",
"targetHost": "",
"targetPort": 25,
"tlsMode": "StartTlsIgnoreCert",
"username": null,
"description": "Shared-Hosting-MX mit abweichendem Zertifikatsnamen (Auto DNS-MX)",
"enabled": true
}
# Partner-Domain mit fehlerhaftem MX-Zertifikat per Auto-DNS-MX freigeben:
nextxch-cli create Route \
--set domain=neff.me \
--set tlsMode=StartTlsIgnoreCert \
--set description="TLS NameMismatch auf Partner-MX erlauben"
# Internes ERP-Subnetz an lokalen Connector routen:
nextxch-cli create Route \
--set domain=erp.firma.intern \
--set targetHost=10.40.2.15 \
--set targetPort=25
curl -fsS -X POST "https://mail.firma.de/api/admin/cli/objects/Route" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"domain":"neff.me","targetHost":"","targetPort":25,"tlsMode":"StartTlsIgnoreCert","enabled":true}'
await http.PostAsJsonAsync("/api/admin/cli/objects/Route", new
{
domain = "neff.me",
targetHost = "",
targetPort = 25,
tlsMode = "StartTlsIgnoreCert",
enabled = true
});
TransactionalSend (Singleton)
Chiave: singleton
RBAC: TenantAdmin+
Gestisce il warming IP progressivo di 28 giorni, le categorie di messaggi e le quote orarie/giornaliere per provider del destinatario (Google, Microsoft, Yahoo/AOL, ISP tedeschi, iCloud, *).
/api/admin/cli/objects/TransactionalSend/singleton
Restituisce il warming IP attivo & la policy di quota dei provider
/api/admin/cli/objects/TransactionalSend/singleton
Aggiorna il giorno di warming, il preset o le quote per provider
enabled
boolean
FACOLTATIVO
true
warmingEnabled
boolean
FACOLTATIVO
false
startAtWarmingDay
integer
SOLO SCRITTURA (SEGRETO)
1
currentWarmingDay
integer
SOLA LETTURA
currentWarmingPercent
integer
SOLA LETTURA
warmingDailyRampPercents
integer[]
FACOLTATIVO
[5,7,10,...,100]
maxDeferHours
integer
FACOLTATIVO
48
defaultCategory
string
FACOLTATIVO
transactional
"critical""transactional""notification""marketing"preset
string
SOLO SCRITTURA (SEGRETO)
"warming_28d""warming_14d""production_100"categories
CategoryPolicy[]
FACOLTATIVO
4 Kategorien
providers
ProviderQuota[]
FACOLTATIVO
6 Provider-Gruppen
{
"enabled": true,
"warmingEnabled": true,
"startAtWarmingDay": 1,
"maxDeferHours": 48,
"defaultCategory": "transactional",
"preset": "warming_28d"
}
# 28-Tage IP-Warming aktivieren:
nextxch-cli update TransactionalSend --set preset=warming_28d
# Direkt auf Warming-Tag 14 vorspringen:
nextxch-cli update TransactionalSend --set startAtWarmingDay=14
curl -fsS -X PATCH "https://mail.firma.de/api/admin/cli/objects/TransactionalSend/singleton" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"preset":"warming_28d","enabled":true}'
await http.PatchAsJsonAsync(
"/api/admin/cli/objects/TransactionalSend/singleton",
new { preset = "warming_28d", enabled = true });
ReputationShield (Singleton)
Chiave: singleton
RBAC: TenantAdmin+
Protezione facoltativa della reputazione in uscita: elenco di soppressione automatico per bounce/reclami, One-Click Unsubscribe RFC 8058, circuit breaker per i bounce, backoff adattivo per 421 degli ISP e webhook HMAC-SHA256.
/api/admin/cli/objects/ReputationShield/singleton
Ottiene la configurazione attuale di Reputation Shield
/api/admin/cli/objects/ReputationShield/singleton
Aggiorna i flag di protezione o applica un preset
preset
string
SOLO SCRITTURA (SEGRETO)
"off""recommended""strict_bulk"enableSuppressionPreCheck
boolean
FACOLTATIVO
false
enforceSuppressionOnSmtpRelay
boolean
FACOLTATIVO
false
allSuppressedBehavior
string
FACOLTATIVO
reject_422
"reject_422""accept_noop"autoSuppressHardBounces
boolean
FACOLTATIVO
false
hardBounceSuppressionDays
integer
FACOLTATIVO
180
autoSuppressConsecutiveSoftBounces
boolean
FACOLTATIVO
false
softBounceEscalationThreshold
integer
FACOLTATIVO
5
autoSuppressFblComplaints
boolean
FACOLTATIVO
false
enableOneClickUnsubscribe
boolean
FACOLTATIVO
false
oneClickUnsubscribeCategories
string[]
FACOLTATIVO
["marketing","notification"]
enableBounceCircuitBreaker
boolean
FACOLTATIVO
false
maxHardBouncePercent
number
FACOLTATIVO
5.0
maxComplaintPercent
number
FACOLTATIVO
0.1
allowCriticalWhenTripped
boolean
FACOLTATIVO
true
enableAdaptiveIspBackoff
boolean
FACOLTATIVO
false
ispCooldownMinutes
integer
FACOLTATIVO
15
webhookEnabled
boolean
FACOLTATIVO
false
webhookUrl
string
FACOLTATIVO
webhookSecret
string
SOLO SCRITTURA (SEGRETO)
{
"preset": "recommended",
"enableSuppressionPreCheck": true,
"autoSuppressHardBounces": true,
"hardBounceSuppressionDays": 180,
"enableOneClickUnsubscribe": true,
"oneClickUnsubscribeCategories": ["marketing", "notification"],
"enableBounceCircuitBreaker": true,
"maxHardBouncePercent": 5.0,
"maxComplaintPercent": 0.1,
"allowCriticalWhenTripped": true,
"enableAdaptiveIspBackoff": true,
"webhookEnabled": true,
"webhookUrl": "https://erp.firma.de/webhooks/nextxch"
}
# Empfohlenen Reputationsschutz aktivieren:
nextxch-cli update ReputationShield --set preset=recommended
# Webhook-Ziel konfigurieren:
nextxch-cli update ReputationShield \
--set webhookEnabled=true \
--set webhookUrl=https://erp.firma.de/webhooks/nextxch \
--set webhookSecret=whsec_9f8e7d6c5b4a
curl -fsS -X PATCH "https://mail.firma.de/api/admin/cli/objects/ReputationShield/singleton" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"preset":"recommended"}'
await http.PatchAsJsonAsync(
"/api/admin/cli/objects/ReputationShield/singleton",
new { preset = "recommended" });
SpamGuard (Singleton)
Chiave: singleton
RBAC: ServerAdmin+
Difesa in entrata multilivello: verifica SPF/DKIM/DMARC/ARC, Smart Greylisting (/24 IPv4 & /64 IPv6), classificatore ML online (FTRL-Proximal), zone DNSBL, elenchi consentiti/bloccati e scansione TCP ClamAV.
/api/admin/cli/objects/SpamGuard/singleton
Restituisce le soglie SpamGuard & i contatori di addestramento
/api/admin/cli/objects/SpamGuard/singleton
Aggiorna sul posto punteggi, DNSBL, elenchi consentiti o ClamAV
enableEmailAuthChecks
boolean
FACOLTATIVO
true
enableGreylisting
boolean
FACOLTATIVO
true
greylistRetryDelaySeconds
integer
FACOLTATIVO
240
junkScoreThreshold
number
FACOLTATIVO
4.5
rejectScoreThreshold
number
FACOLTATIVO
9.0
tagSubjectOnJunk
boolean
FACOLTATIVO
false
subjectTagPrefix
string
FACOLTATIVO
"[SPAM] "
enableStructuralHeuristics
boolean
FACOLTATIVO
true
dnsblZones
string[]
FACOLTATIVO
["bl.spamcop.net","ix.dnsbl.manitu.net"]
dnsblHitScore
number
FACOLTATIVO
3.5
allowedSendersOrDomains
string[]
FACOLTATIVO
[]
blockedSendersOrDomains
string[]
FACOLTATIVO
[]
clamAvEnabled
boolean
FACOLTATIVO
false
clamAvHost
string
FACOLTATIVO
"127.0.0.1"
clamAvPort
integer
FACOLTATIVO
3310
{
"enableEmailAuthChecks": true,
"enableGreylisting": true,
"greylistRetryDelaySeconds": 240,
"junkScoreThreshold": 4.5,
"rejectScoreThreshold": 9.0,
"enableStructuralHeuristics": true,
"dnsblZones": ["bl.spamcop.net", "ix.dnsbl.manitu.net"],
"dnsblHitScore": 3.5,
"allowedSendersOrDomains": ["datev.de", "partner-spedition.de"],
"blockedSendersOrDomains": [],
"clamAvEnabled": false,
"clamAvHost": "127.0.0.1",
"clamAvPort": 3310
}
# Partner-Domains auf die Allowlist setzen:
nextxch-cli update SpamGuard \
--set allowedSendersOrDomains=datev.de,partner-spedition.de
# Schwellenwerte anpassen:
nextxch-cli update SpamGuard --set junkScoreThreshold=4.5 --set rejectScoreThreshold=9.0
curl -fsS -X PATCH "https://mail.firma.de/api/admin/cli/objects/SpamGuard/singleton" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"junkScoreThreshold":4.5,"rejectScoreThreshold":9.0,"allowedSendersOrDomains":["datev.de"]}'
await http.PatchAsJsonAsync(
"/api/admin/cli/objects/SpamGuard/singleton",
new { junkScoreThreshold = 4.5, rejectScoreThreshold = 9.0 });
SmtpQueue (Singleton)
Chiave: singleton
RBAC: ServerAdmin+
Controlla la coda di recapito MX in uscita, la concorrenza dei worker, gli intervalli dei tentativi, il throttling ISP, la convalida TLS in uscita, lo smart host globale e i limiti ESMTP in entrata.
/api/admin/cli/objects/SmtpQueue/singleton
Ottiene tutte le impostazioni di coda, TLS ed ESMTP
/api/admin/cli/objects/SmtpQueue/singleton
Aggiorna worker della coda, pianificazione dei tentativi o limiti ESMTP in 0 ms
outboundQueuePaused
boolean
FACOLTATIVO
false
outboundWorkerConcurrency
integer
FACOLTATIVO
8
maxDeliveryAttempts
integer
FACOLTATIVO
10
retryScheduleMinutes
integer[]
FACOLTATIVO
[5,15,60,240,720]
maxConcurrentConnectionsPerMxDomain
integer
FACOLTATIVO
4
strictThrottleDomains
string[]
FACOLTATIVO
["t-online.de","gmx.de","web.de","yahoo.com"]
strictThrottleMaxConcurrency
integer
FACOLTATIVO
2
outboundConnectTimeoutSeconds
integer
FACOLTATIVO
30
outboundBindAddress
string
FACOLTATIVO
"" (Auto)
outboundUseStartTls
boolean
FACOLTATIVO
true
requireOutboundTls
boolean
FACOLTATIVO
false
outboundTlsCertValidation
string
FACOLTATIVO
Opportunistic
"Opportunistic""IgnoreErrors""Strict"outboundSmartHost
string
FACOLTATIVO
""
outboundSmartPort
integer
FACOLTATIVO
587
maxMessageSizeMb
long
FACOLTATIVO
50
maxRecipientsPerTransaction
integer
FACOLTATIVO
100
maxConnectionsPerIp
integer
FACOLTATIVO
20
tarpitDelayMs
integer
FACOLTATIVO
1500
requireTlsForAuth
boolean
FACOLTATIVO
true
{
"outboundQueuePaused": false,
"outboundWorkerConcurrency": 8,
"maxDeliveryAttempts": 10,
"retryScheduleMinutes": [5, 15, 60, 240, 720],
"maxConcurrentConnectionsPerMxDomain": 4,
"strictThrottleDomains": ["t-online.de", "gmx.de", "web.de", "yahoo.com"],
"strictThrottleMaxConcurrency": 2,
"outboundUseStartTls": true,
"requireOutboundTls": false,
"outboundTlsCertValidation": "Opportunistic",
"maxMessageSizeMb": 50,
"maxRecipientsPerTransaction": 100,
"tarpitDelayMs": 1500,
"requireTlsForAuth": true
}
# Outbound-TLS auf Opportunistic (RFC 7435) setzen & MaxMessageSize auf 75 MiB erhöhen:
nextxch-cli update SmtpQueue \
--set outboundTlsCertValidation=Opportunistic \
--set maxMessageSizeMb=75
curl -fsS -X PATCH "https://mail.firma.de/api/admin/cli/objects/SmtpQueue/singleton" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"outboundTlsCertValidation":"Opportunistic","maxMessageSizeMb":75}'
await http.PatchAsJsonAsync(
"/api/admin/cli/objects/SmtpQueue/singleton",
new { outboundTlsCertValidation = "Opportunistic", maxMessageSizeMb = 75 });
TransportRules & Server (Singletons)
Chiave: singleton
RBAC: ServerAdmin+
Disclaimer legale a livello di organizzazione (inserito prima della firma DKIM), script Sieve globale in entrata, soglie di auto-ban Fail2Ban e ServerHostName canonico.
/api/admin/cli/objects/TransportRules/singleton
Restituisce le impostazioni di disclaimer, Sieve globale e auto-ban
/api/admin/cli/objects/TransportRules/singleton
Aggiorna le regole di trasporto sul posto
/api/admin/cli/objects/Server/singleton
Restituisce ServerHostName, motore di storage, profondità della coda e stato della licenza
/api/admin/cli/objects/Server/singleton
Aggiorna il ServerHostName canonico in 0 ms
outboundDisclaimerEnabled
boolean
FACOLTATIVO
false
outboundDisclaimerExternalOnly
boolean
FACOLTATIVO
true
outboundDisclaimerText
string
FACOLTATIVO
""
outboundDisclaimerHtml
string
FACOLTATIVO
""
inboundSystemSieve
string
FACOLTATIVO
""
autoBanThreshold
integer
FACOLTATIVO
8
autoBanDurationMinutes
integer
FACOLTATIVO
30
serverHostName
string
FACOLTATIVO
mail.<domain>
storageProvider
string
SOLA LETTURA
Sqlite | SqlServer | Postgres
activeQueueCount
integer
SOLA LETTURA
0
licenseState
string
SOLA LETTURA
EnterpriseActive
{
"outboundDisclaimerEnabled": true,
"outboundDisclaimerExternalOnly": true,
"outboundDisclaimerText": "-- \nMuster Logistik GmbH · Industriestraße 18 · 70565 Stuttgart · HRB 774819",
"outboundDisclaimerHtml": "<p style='font-size:11px;color:#64748b'><strong>Muster Logistik GmbH</strong> · 70565 Stuttgart · HRB 774819</p>",
"inboundSystemSieve": "require [\"fileinto\"];\nif header :contains \"X-Spam-Flag\" \"YES\" { fileinto \"Junk\"; }",
"autoBanThreshold": 8,
"autoBanDurationMinutes": 30
}
# Pflicht-Impressum & Auto-Ban aktualisieren:
nextxch-cli update TransportRules \
--set outboundDisclaimerEnabled=true \
--set autoBanThreshold=8
# Kanonischen Server-Hostnamen abfragen oder setzen:
nextxch-cli get Server
nextxch-cli update Server --set serverHostName=mail.muster-logistik.de
curl -fsS -X GET "https://mail.firma.de/api/admin/cli/objects/Server/singleton" \
-H "Authorization: Bearer smk_..."
var status = await http.GetFromJsonAsync<JsonElement>("/api/admin/cli/objects/Server/singleton");
Console.WriteLine($"Host: {status.GetProperty("serverHostName")}, Queue: {status.GetProperty("activeQueueCount")}");