#pApiAuth
Referência completa de campos da API & CLI: todos os 12 tipos de objeto, endpoints REST & POST /api/v1/send
Esta referência documenta cada propriedade JSON, tipo de dado, valor de enum, configuração padrão e função RBAC mínima de todos os 12 objetos de gerenciamento (/api/admin/cli/objects/{type} & nextxch-cli), bem como o envio de e-mails transacionais (POST /api/v1/send). Use a caixa de filtro instantâneo acima da tabela para pesquisar qualquer propriedade, como dkimSigningMode, tlsMode, allowedCidrs ou warmingEnabled.
Introspecção ao vivo no seu terminal ou via HTTP: cada nextxch expõe este schema completo em JSON legível por máquina em GET /api/admin/cli/schema (com o cabeçalho SHA-256 X-Nextxch-Schema-Version). No terminal, execute nextxch-cli describe <Type> (por exemplo, nextxch-cli describe Domain ou nextxch-cli describe SmtpQueue) a qualquer momento.
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)
Chave: Idempotency-Key
RBAC: User+
Endpoint HTTP JSON de entrega de alto throughput para aplicações web, ERPs, CRMs e códigos 2FA, com priorização por categoria, aquecimento de IP, verificação prévia de supressão e idempotência de 24 h.
/api/v1/send
Enfileira e assina e-mails transacionais (UTF-8 Multipart/Alternative + anexos)
/api/v1/unsubscribe/{token}
Endpoint público de cancelamento de inscrição com um clique (RFC 8058) (token assinado com DKIM)
from
string
OPCIONAL
Key senderAddress
to
string[]
OBRIGATÓRIO
cc
string[]
OPCIONAL
[]
bcc
string[]
OPCIONAL
[]
replyTo
string
OPCIONAL
subject
string
OBRIGATÓRIO
textBody
string
OPCIONAL
htmlBody
string
OPCIONAL
category
string
OPCIONAL
transactional
"critical""transactional""notification""marketing"overflowMode
string
OPCIONAL
DeferQueue
"DeferQueue""Reject429"idempotencyKey
string
OPCIONAL
Header Idempotency-Key
headers
Record<string, string>
OPCIONAL
{}
attachments
SendAttachmentDto[]
OPCIONAL
[]
{
"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)
Chave: id
RBAC: TenantAdmin+
Chave de integração com escopos para /api/v1. Uma chave atua em nome de um usuário ou, como integração de locatário, em nome do usuário indicado no cabeçalho X-Nextxch-Act-As. Sem o escopo, a API responde 403; um usuário de outro locatário resulta em 404. Client credentials OAuth 2.0 opcionais (token válido por 1 hora).
/api/admin/integrations/keys
Criar uma chave (admin, exibida uma vez)
/api/admin/integrations/keys/{id}
Alterar escopos
/api/admin/integrations/keys/{id}
Revogar uma chave (e seus tokens OAuth)
/api/v1/oauth/token
OAuth 2.0 client_credentials: ID da chave + chave para um token de acesso
/api/v1/me
Chave, escopos e usuário atuante
/api/v1/openapi.json
Documento OpenAPI 3.1 da instalação
label
string
OBRIGATÓRIO
mode
string
OBRIGATÓRIO
user
"user""tenant"userEmail
string
OPCIONAL
scopes
string[]
OBRIGATÓRIO
"calendar.read""calendar.write""rooms.read""booking.read""booking.write""contacts.read""contacts.write""directory.read""sharing.manage""webhooks.manage""mail.send"domainId
guid
OPCIONAL
allowedCidrs
string[]
OPCIONAL
[]
expiresInDays
integer
OPCIONAL
senderAddress
string
OPCIONAL
apiKey
string
SOMENTE LEITURA
{
"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)
Chave: hrefName
RBAC: User+
Eventos com séries e exceções, participantes, salas, convites, respostas, disponível/ocupado, calendários compartilhados e globais e links de convite. Escopos calendar.read e calendar.write. Horários em UTC (ISO-8601), fusos horários como nomes IANA.
/api/v1/calendars
Calendários próprios, compartilhados, globais e de recursos
/api/v1/calendar/events?from&to&calendarId&limit&cursor
Ocorrências em uma janela (séries expandidas)
/api/v1/calendar/events
Criar um evento (convidar pessoas e salas)
/api/v1/calendar/events/{hrefName}
Evento com séries e exceções
/api/v1/calendar/events/{hrefName}
Alteração; scope=occurrence|following para partes de uma série
/api/v1/calendar/events/{hrefName}
Excluir, opcionalmente com cancelamentos (notify=true)
/api/v1/calendar/events/{hrefName}/respond
Responder a um convite
/api/v1/calendar/events/{hrefName}/invite-link
Link de convite assinado
/api/v1/calendar/events/{hrefName}/ics
iCalendar bruto
/api/v1/calendar/freebusy
Disponível/ocupado de pessoas e salas
title
string
OBRIGATÓRIO
startUtc
datetime
OBRIGATÓRIO
endUtc
datetime
OBRIGATÓRIO
timeZone
string
OPCIONAL
Europe/Berlin
allDay
boolean
OPCIONAL
false
attendees
Attendee[]
OPCIONAL
[]
sendInvitations
boolean
OPCIONAL
false
recurrence
Recorrência
OPCIONAL
showAs
string
OPCIONAL
busy
"free""tentative""busy""oof""workingElsewhere"isPrivate
boolean
OPCIONAL
false
calendarId
string
OPCIONAL
teamsMeeting
boolean
OPCIONAL
{
"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)
Chave: id
RBAC: User+
Salas e recursos com disponibilidade (rooms.read) e páginas de agendamento como o Calendly (booking.read, booking.write): página de agendamento, tipos de evento, horários livres, leitura e cancelamento de agendamentos. Uma sala é reservada por meio de um evento que tem a sala como participante.
/api/v1/rooms?startUtc&endUtc&category
Salas e recursos, com disponibilidade para a janela
/api/v1/rooms/{email}/availability
Horários ocupados de uma sala
/api/v1/booking/profile
Página de agendamento com horários e tipos de evento
/api/v1/booking/event-types
Tipos de evento
/api/v1/booking/event-types
Criar um tipo de evento
/api/v1/booking/event-types/{id}/slots?from&to
Horários de início livres (máx. 42 dias)
/api/v1/booking/bookings?status&from&to
Reservas
/api/v1/booking/bookings/{id}/cancel
Cancelar um agendamento (o convidado é informado)
slots[].startUtc
datetime
SOMENTE LEITURA
slots[].endUtc
datetime
SOMENTE LEITURA
slots[].staff
object[]
SOMENTE LEITURA
status
string
SOMENTE LEITURA
"confirmed""cancelled"guest
object
SOMENTE LEITURA
free
boolean
SOMENTE LEITURA
{
"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)
Chave: hrefName
RBAC: User+
Contatos pessoais com todos os campos e foto (contacts.read, contacts.write, If-Match para proteção contra conflitos), lista de endereços global (directory.read) e compartilhamentos e delegação (sharing.manage, delegação = permissão na caixa de correio com sendAs ou sendOnBehalf).
/api/v1/contacts?q
Pesquisar contatos
/api/v1/contacts
Criar um contato
/api/v1/contacts/{hrefName}
Alterar um contato (campos nulos permanecem)
/api/v1/contacts/{hrefName}
Excluir um contato
/api/v1/directory?q&type
Lista de endereços global
/api/v1/sharing/grants
Permissões próprias
/api/v1/sharing/grants
Definir ou remover uma permissão
/api/v1/sharing/shared-with-me
Compartilhado comigo
givenName
string
OPCIONAL
familyName
string
OPCIONAL
organization
string
OPCIONAL
emails
TypedValue[]
OPCIONAL
[]
phones
TypedValue[]
OPCIONAL
[]
addresses
Address[]
OPCIONAL
[]
birthday
string
OPCIONAL
photo
string
SOMENTE ESCRITA (SEGREDO)
permissions
string[]
OPCIONAL
"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)
Chave: id
RBAC: User+
Eventos como JSON POST assinado: calendar.event.created, calendar.event.updated, calendar.event.deleted, calendar.invitation.replied, booking.created, booking.rescheduled, booking.cancelled. Assinatura X-Nextxch-Signature: v1=hex(HMAC-SHA256(secret, X-Nextxch-Timestamp + "." + body)). Novas tentativas após 30 s, 2 min, 10 min, 1 h e 6 h.
/api/v1/webhooks
Webhooks do locatário
/api/v1/webhooks
Registrar um webhook (segredo somente na resposta)
/api/v1/webhooks/{id}
Excluir um webhook
/api/v1/webhooks/{id}/deliveries
Entregas recentes
/api/v1/webhooks/{id}/test
Enviar um evento de teste
url
string
OBRIGATÓRIO
events
string[]
OBRIGATÓRIO
"calendar.event.created""calendar.event.updated""calendar.event.deleted""calendar.invitation.replied""booking.created""booking.rescheduled""booking.cancelled""*"secret
string
SOMENTE LEITURA
id (Ereignis)
string
SOMENTE LEITURA
{
"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
Chave: slug
RBAC: ServerAdmin+
Limite organizacional multilocatário que isola domínios, principais, cotas de armazenamento (GiB) e a retenção de conformidade GoBD WORM padrão.
/api/admin/cli/objects/Tenant
Lista todos os locatários
/api/admin/cli/objects/Tenant/{slugOrId}
Obtém o locatário por slug ou UUID
/api/admin/cli/objects/Tenant
Cria um novo locatário
/api/admin/cli/objects/Tenant/{slugOrId}
Atualiza as cotas do locatário no local
id
guid
SOMENTE LEITURA
UUIDv7
slug
string
PRIMARY KEY
name
string
OBRIGATÓRIO
isActive
boolean
OPCIONAL
true
maxDomains
integer
OPCIONAL
100
maxPrincipals
integer
OPCIONAL
10000
quotaGb
integer
OPCIONAL
100
outboundDailyLimit
integer
OPCIONAL
25000
defaultLockMode
string
OPCIONAL
Normal
"Normal""Governance""Compliance""LegalHold"defaultRetentionDays
integer
OPCIONAL
0
createdAtUtc
datetime
SOMENTE LEITURA
{
"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
Chave: name
RBAC: TenantAdmin+
Domínio de e-mail hospedado com geração automática e paralela de chaves Dual-DKIM (RSA-2048 + Ed25519), política de retenção GoBD WORM, plus-addressing e limites de taxa.
/api/admin/cli/objects/Domain
Lista todos os domínios
/api/admin/cli/objects/Domain/{name}
Obtém a configuração do domínio & os seletores DKIM
/api/admin/cli/objects/Domain
Cria o domínio & gera chaves DKIM RSA-2048 + Ed25519
/api/admin/cli/objects/Domain/{name}
Atualiza o modo DKIM, cotas ou retenção em 0 ms
/api/admin/cli/dns/{name}?live=true
Verifica registros DNS ao vivo ou exporta a zona BIND conforme RFC 1035
id
guid
SOMENTE LEITURA
UUIDv7
name
string
PRIMARY KEY
tenant
string
OPCIONAL
default
isActive
boolean
OPCIONAL
true
postmasterAddress
string
OPCIONAL
postmaster@<name>
dkimSigningMode
string
OPCIONAL
Dual
"Rsa2048""Ed25519""Dual"dkimRsaSelector
string
OPCIONAL
s2026
dkimRsaDnsName
string
SOMENTE LEITURA
s2026._domainkey.<name>
dkimEd25519Selector
string
OPCIONAL
ed2026
dkimEd25519DnsName
string
SOMENTE LEITURA
ed2026._domainkey.<name>
retentionLockMode
string
OPCIONAL
Normal
"Normal""Governance""Compliance""LegalHold"retentionDays
integer
OPCIONAL
0
quotaGb
integer
OPCIONAL
50
maxMessageSizeMb
integer
OPCIONAL
50
maxAccounts
integer
OPCIONAL
1000
outboundDailyLimit
integer
OPCIONAL
5000
outboundHourlyLimit
integer
OPCIONAL
1000
usePlusAddressing
boolean
OPCIONAL
true
createdAtUtc
datetime
SOMENTE LEITURA
{
"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)
Chave: email
RBAC: TenantAdmin+
Representa uma caixa de correio de usuário (@type="User", com IMAP/JMAP/CalDAV/CardDAV/ActiveSync) ou uma lista de distribuição (@type="List" com members[]).
/api/admin/cli/objects/Account?filter=role=TenantAdmin
Lista/filtra contas e listas de distribuição
/api/admin/cli/objects/Account/User
Cria uma nova caixa de correio de usuário com pastas RFC 6154
/api/admin/cli/objects/Account/List
Cria uma nova lista de distribuição
/api/admin/cli/objects/Account/{email}
Atualiza cota, encaminhamento, ausência ou senha
/api/admin/cli/objects/Account/{email}
Exclui uma conta de forma reversível (soft delete)
id
guid
SOMENTE LEITURA
UUIDv7
@type
string
OPCIONAL
User
"User""List"email
string
PRIMARY KEY
displayName
string
OPCIONAL
Lokalteil
password
string
SOMENTE ESCRITA (SEGREDO)
role
string
OPCIONAL
User
"User""ComplianceAuditor""TenantAdmin""ServerAdmin"isActive
boolean
OPCIONAL
true
quotaMb
integer
OPCIONAL
5120
usedBytes
long
SOMENTE LEITURA
0
outboundDailyLimit
integer
OPCIONAL
500
forwardAddress
string
OPCIONAL
forwardKeepOriginal
boolean
OPCIONAL
true
vacationEnabled
boolean
OPCIONAL
false
vacationSubject
string
OPCIONAL
vacationBody
string
SOMENTE ESCRITA (SEGREDO)
twoFactorEnabled
boolean
SOMENTE LEITURA
false
members
string[]
OPCIONAL
[]
createdAtUtc
datetime
SOMENTE LEITURA
{
"@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
Chave: address
RBAC: TenantAdmin+
Alias de e-mail secundário ou alias de privacidade mascarado descartável, roteado para uma caixa de correio Account principal ou uma lista de distribuição.
/api/admin/cli/objects/Alias
Lista todos os aliases e e-mails mascarados
/api/admin/cli/objects/Alias
Cria um novo alias roteado para uma caixa de correio de destino
/api/admin/cli/objects/Alias/{address}
Ativa/pausa um alias ou atualiza seu destino
/api/admin/cli/objects/Alias/{address}
Exclui o alias
address
string
PRIMARY KEY
target
string
OBRIGATÓRIO
principalId
guid
SOMENTE LEITURA
description
string
OPCIONAL
""
isMasked
boolean
OPCIONAL
false
isEnabled
boolean
OPCIONAL
true
createdAtUtc
datetime
SOMENTE LEITURA
{
"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
Chave: id
RBAC: TenantAdmin+
Chave de API com escopo, imutável e restrita por RBAC e CIDR (smk_<id>_<secret>) para /api/v1/send, SCIM 2.0 ou nextxch-cli.
/api/admin/cli/objects/ApiKey
Lista as chaves de API ativas (sem o segredo)
/api/admin/cli/objects/ApiKey
Emite uma nova chave de API e retorna apiKey (smk_...) uma única vez
/api/admin/cli/objects/ApiKey/{id}
Revoga a chave de API imediatamente
id
guid
SOMENTE LEITURA
UUIDv7
apiKey
string
SOMENTE NA CRIAÇÃO
smk_<id>_<secret>
label
string
OBRIGATÓRIO
role
string
OPCIONAL
TenantAdmin
"User""ComplianceAuditor""TenantAdmin""ServerAdmin"senderAddress
string
OPCIONAL
defaultCategory
string
OPCIONAL
transactional
"critical""transactional""notification""marketing"allowedCidrs
string[]
OPCIONAL
[] (todos os IPs)
expiresInDays
integer
SOMENTE ESCRITA (SEGREDO)
null (Kein Ablauf)
expiresAtUtc
datetime
SOMENTE LEITURA
outboundDailyLimit
integer
OPCIONAL
10000
isActive
boolean
SOMENTE LEITURA
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
Chave: domain
RBAC: ServerAdmin+
Roteamento SMTP de saída por domínio ou exceção de certificado TLS (por exemplo, StartTlsIgnoreCert para hosts MX de parceiros com certificados divergentes, ou conector de smart host).
/api/admin/cli/objects/Route
Lista todas as rotas de saída personalizadas
/api/admin/cli/objects/Route
Cria uma rota de domínio personalizada ou uma substituição de TLS
/api/admin/cli/objects/Route/{domain}
Atualiza o host de destino, a porta ou o modo TLS
/api/admin/cli/objects/Route/{domain}
Exclui a rota personalizada
domain
string
PRIMARY KEY
targetHost
string
OPCIONAL
"" (Auto DNS-MX)
targetPort
integer
OPCIONAL
25
tlsMode
string
OPCIONAL
StartTlsOptional
"StartTlsOptional""StartTlsRequired""StartTlsIgnoreCert""ImplicitTls""ImplicitTlsIgnoreCert""None"username
string
OPCIONAL
password
string
SOMENTE ESCRITA (SEGREDO)
hasPassword
boolean
SOMENTE LEITURA
false
clearPassword
boolean
SOMENTE ESCRITA (SEGREDO)
false
description
string
OPCIONAL
enabled
boolean
OPCIONAL
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)
Chave: singleton
RBAC: TenantAdmin+
Controla o aquecimento progressivo de IP em 28 dias, as categorias de mensagens e as cotas por hora/dia por provedor destinatário (Google, Microsoft, Yahoo/AOL, provedores alemães, iCloud, *).
/api/admin/cli/objects/TransactionalSend/singleton
Obtém a política ativa de aquecimento de IP & cotas por provedor
/api/admin/cli/objects/TransactionalSend/singleton
Atualiza o dia de aquecimento, o preset ou as cotas por provedor
enabled
boolean
OPCIONAL
true
warmingEnabled
boolean
OPCIONAL
false
startAtWarmingDay
integer
SOMENTE ESCRITA (SEGREDO)
1
currentWarmingDay
integer
SOMENTE LEITURA
currentWarmingPercent
integer
SOMENTE LEITURA
warmingDailyRampPercents
integer[]
OPCIONAL
[5,7,10,...,100]
maxDeferHours
integer
OPCIONAL
48
defaultCategory
string
OPCIONAL
transactional
"critical""transactional""notification""marketing"preset
string
SOMENTE ESCRITA (SEGREDO)
"warming_28d""warming_14d""production_100"categories
CategoryPolicy[]
OPCIONAL
4 Kategorien
providers
ProviderQuota[]
OPCIONAL
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)
Chave: singleton
RBAC: TenantAdmin+
Proteção opcional da reputação de saída: lista automática de supressão de bounces/reclamações, cancelamento de inscrição com um clique (RFC 8058), disjuntor de bounces, backoff adaptativo para 421 de ISPs e webhooks HMAC-SHA256.
/api/admin/cli/objects/ReputationShield/singleton
Obtém a configuração atual do Reputation Shield
/api/admin/cli/objects/ReputationShield/singleton
Atualiza as flags de proteção ou aplica uma predefinição
preset
string
SOMENTE ESCRITA (SEGREDO)
"off""recommended""strict_bulk"enableSuppressionPreCheck
boolean
OPCIONAL
false
enforceSuppressionOnSmtpRelay
boolean
OPCIONAL
false
allSuppressedBehavior
string
OPCIONAL
reject_422
"reject_422""accept_noop"autoSuppressHardBounces
boolean
OPCIONAL
false
hardBounceSuppressionDays
integer
OPCIONAL
180
autoSuppressConsecutiveSoftBounces
boolean
OPCIONAL
false
softBounceEscalationThreshold
integer
OPCIONAL
5
autoSuppressFblComplaints
boolean
OPCIONAL
false
enableOneClickUnsubscribe
boolean
OPCIONAL
false
oneClickUnsubscribeCategories
string[]
OPCIONAL
["marketing","notification"]
enableBounceCircuitBreaker
boolean
OPCIONAL
false
maxHardBouncePercent
number
OPCIONAL
5.0
maxComplaintPercent
number
OPCIONAL
0.1
allowCriticalWhenTripped
boolean
OPCIONAL
true
enableAdaptiveIspBackoff
boolean
OPCIONAL
false
ispCooldownMinutes
integer
OPCIONAL
15
webhookEnabled
boolean
OPCIONAL
false
webhookUrl
string
OPCIONAL
webhookSecret
string
SOMENTE ESCRITA (SEGREDO)
{
"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)
Chave: singleton
RBAC: ServerAdmin+
Defesa de entrada em várias etapas: verificação SPF/DKIM/DMARC/ARC, Smart Greylisting (/24 IPv4 & /64 IPv6), classificador de ML online (FTRL-Proximal), zonas DNSBL, listas de permissões/bloqueio e verificação ClamAV via TCP.
/api/admin/cli/objects/SpamGuard/singleton
Obtém os limites do SpamGuard & os contadores de treinamento
/api/admin/cli/objects/SpamGuard/singleton
Atualiza pontuações, DNSBLs, listas de permissões ou o ClamAV no local
enableEmailAuthChecks
boolean
OPCIONAL
true
enableGreylisting
boolean
OPCIONAL
true
greylistRetryDelaySeconds
integer
OPCIONAL
240
junkScoreThreshold
number
OPCIONAL
4.5
rejectScoreThreshold
number
OPCIONAL
9.0
tagSubjectOnJunk
boolean
OPCIONAL
false
subjectTagPrefix
string
OPCIONAL
"[SPAM] "
enableStructuralHeuristics
boolean
OPCIONAL
true
dnsblZones
string[]
OPCIONAL
["bl.spamcop.net","ix.dnsbl.manitu.net"]
dnsblHitScore
number
OPCIONAL
3.5
allowedSendersOrDomains
string[]
OPCIONAL
[]
blockedSendersOrDomains
string[]
OPCIONAL
[]
clamAvEnabled
boolean
OPCIONAL
false
clamAvHost
string
OPCIONAL
"127.0.0.1"
clamAvPort
integer
OPCIONAL
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)
Chave: singleton
RBAC: ServerAdmin+
Controla a fila de entrega MX de saída, a concorrência dos workers, os intervalos de novas tentativas, a limitação por ISP, a validação TLS de saída, o smart host global e os limites ESMTP de entrada.
/api/admin/cli/objects/SmtpQueue/singleton
Obtém todas as configurações de fila, TLS e ESMTP
/api/admin/cli/objects/SmtpQueue/singleton
Atualiza workers da fila, agenda de novas tentativas ou limites ESMTP em 0 ms
outboundQueuePaused
boolean
OPCIONAL
false
outboundWorkerConcurrency
integer
OPCIONAL
8
maxDeliveryAttempts
integer
OPCIONAL
10
retryScheduleMinutes
integer[]
OPCIONAL
[5,15,60,240,720]
maxConcurrentConnectionsPerMxDomain
integer
OPCIONAL
4
strictThrottleDomains
string[]
OPCIONAL
["t-online.de","gmx.de","web.de","yahoo.com"]
strictThrottleMaxConcurrency
integer
OPCIONAL
2
outboundConnectTimeoutSeconds
integer
OPCIONAL
30
outboundBindAddress
string
OPCIONAL
"" (Auto)
outboundUseStartTls
boolean
OPCIONAL
true
requireOutboundTls
boolean
OPCIONAL
false
outboundTlsCertValidation
string
OPCIONAL
Opportunistic
"Opportunistic""IgnoreErrors""Strict"outboundSmartHost
string
OPCIONAL
""
outboundSmartPort
integer
OPCIONAL
587
maxMessageSizeMb
long
OPCIONAL
50
maxRecipientsPerTransaction
integer
OPCIONAL
100
maxConnectionsPerIp
integer
OPCIONAL
20
tarpitDelayMs
integer
OPCIONAL
1500
requireTlsForAuth
boolean
OPCIONAL
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)
Chave: singleton
RBAC: ServerAdmin+
Disclaimer jurídico para toda a organização (inserido antes da assinatura DKIM), script Sieve global de entrada, limites de auto-ban do Fail2Ban e ServerHostName canônico.
/api/admin/cli/objects/TransportRules/singleton
Obtém as configurações de disclaimer, Sieve global e auto-ban
/api/admin/cli/objects/TransportRules/singleton
Atualiza as regras de transporte no local
/api/admin/cli/objects/Server/singleton
Obtém ServerHostName, mecanismo de armazenamento, tamanho da fila e status da licença
/api/admin/cli/objects/Server/singleton
Atualiza o ServerHostName canônico em 0 ms
outboundDisclaimerEnabled
boolean
OPCIONAL
false
outboundDisclaimerExternalOnly
boolean
OPCIONAL
true
outboundDisclaimerText
string
OPCIONAL
""
outboundDisclaimerHtml
string
OPCIONAL
""
inboundSystemSieve
string
OPCIONAL
""
autoBanThreshold
integer
OPCIONAL
8
autoBanDurationMinutes
integer
OPCIONAL
30
serverHostName
string
OPCIONAL
mail.<domain>
storageProvider
string
SOMENTE LEITURA
Sqlite | SqlServer | Postgres
activeQueueCount
integer
SOMENTE LEITURA
0
licenseState
string
SOMENTE LEITURA
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")}");