#pApiAuth
API と CLI の完全なフィールド リファレンス: 全 12 オブジェクト タイプ、REST エンドポイントと POST /api/v1/send
このリファレンスでは、12 個すべての管理オブジェクト (/api/admin/cli/objects/{type} & nextxch-cli) とトランザクション メール配信 (POST /api/v1/send) について、すべての JSON プロパティ、データ型、列挙値、既定値、最小 RBAC ロールを記載しています。表の上にある即時フィルター ボックスで、dkimSigningMode、tlsMode、allowedCidrs、warmingEnabled などの任意のプロパティを検索できます。
ターミナルまたは HTTP でのライブ イントロスペクション: すべての nextxch は、この完全なスキーマを機械可読な JSON として GET /api/admin/cli/schema で公開します (SHA-256 ヘッダー X-Nextxch-Schema-Version 付き)。ターミナルでは、nextxch-cli describe <Type> (例: nextxch-cli describe Domain または 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)
キー: Idempotency-Key
RBAC: User+
Web アプリ、ERP、CRM、2FA コード向けの高スループット HTTP JSON 配信エンドポイント。カテゴリ優先度、IP ウォーミング、抑制リストの事前チェック、24 時間のべき等性を備えています。
/api/v1/send
トランザクション メールをキューに登録して署名します (UTF-8 Multipart/Alternative + 添付ファイル)
/api/v1/unsubscribe/{token}
公開 RFC 8058 ワンクリック配信停止エンドポイント (DKIM 署名付きトークン)
from
string
任意
Key senderAddress
to
string[]
必須
cc
string[]
任意
[]
bcc
string[]
任意
[]
replyTo
string
任意
subject
string
必須
textBody
string
任意
htmlBody
string
任意
category
string
任意
transactional
"critical""transactional""notification""marketing"overflowMode
string
任意
DeferQueue
"DeferQueue""Reject429"idempotencyKey
string
任意
Header Idempotency-Key
headers
Record<string, string>
任意
{}
attachments
SendAttachmentDto[]
任意
[]
{
"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)
キー: id
RBAC: TenantAdmin+
/api/v1 用のスコープ付き連携キー。キーは 1 人のユーザーとして、またはテナント連携として X-Nextxch-Act-As ヘッダーで指定されたユーザーとして動作します。スコープがない場合、API は 403 を返し、他テナントのユーザーの場合は 404 を返します。オプションで OAuth 2.0 クライアント資格情報 (トークンの有効期間は 1 時間) を利用できます。
/api/admin/integrations/keys
キーを作成 (管理者、一度だけ表示)
/api/admin/integrations/keys/{id}
スコープを変更
/api/admin/integrations/keys/{id}
キー (およびその OAuth トークン) を取り消す
/api/v1/oauth/token
OAuth 2.0 client_credentials: キー ID + キーでアクセス トークンを取得
/api/v1/me
キー、スコープ、実行ユーザー
/api/v1/openapi.json
インストール環境の OpenAPI 3.1 ドキュメント
label
string
必須
mode
string
必須
user
"user""tenant"userEmail
string
任意
scopes
string[]
必須
"calendar.read""calendar.write""rooms.read""booking.read""booking.write""contacts.read""contacts.write""directory.read""sharing.manage""webhooks.manage""mail.send"domainId
guid
任意
allowedCidrs
string[]
任意
[]
expiresInDays
integer
任意
senderAddress
string
任意
apiKey
string
読み取り専用
{
"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)
キー: hrefName
RBAC: User+
定期的な予定と例外、出席者、会議室、招待、返答、空き時間情報、共有カレンダーとグローバル カレンダー、招待リンク。スコープは calendar.read と calendar.write。時刻は UTC (ISO-8601)、タイム ゾーンは IANA 名で指定します。
/api/v1/calendars
個人、共有、グローバル、リソースのカレンダー
/api/v1/calendar/events?from&to&calendarId&limit&cursor
期間内の発生 (展開されたシリーズ)
/api/v1/calendar/events
予定を作成 (ユーザーと会議室を招待)
/api/v1/calendar/events/{hrefName}
定期的な予定と例外を含む予定
/api/v1/calendar/events/{hrefName}
変更。シリーズの一部には scope=occurrence|following
/api/v1/calendar/events/{hrefName}
削除します。必要に応じてキャンセル通知付き (notify=true)
/api/v1/calendar/events/{hrefName}/respond
招待に返信
/api/v1/calendar/events/{hrefName}/invite-link
署名付き招待リンク
/api/v1/calendar/events/{hrefName}/ics
生の iCalendar
/api/v1/calendar/freebusy
ユーザーと会議室の空き時間情報
title
string
必須
startUtc
datetime
必須
endUtc
datetime
必須
timeZone
string
任意
Europe/Berlin
allDay
boolean
任意
false
attendees
Attendee[]
任意
[]
sendInvitations
boolean
任意
false
recurrence
繰り返し
任意
showAs
string
任意
busy
"free""tentative""busy""oof""workingElsewhere"isPrivate
boolean
任意
false
calendarId
string
任意
teamsMeeting
boolean
任意
{
"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)
キー: id
RBAC: User+
空き状況付きの会議室とリソース (rooms.read)、Calendly のような予約ページ (booking.read、booking.write): 予約ページ、予定の種類、空き枠、予約の読み取りとキャンセル。会議室は、その会議室を出席者とする予定を通じて予約されます。
/api/v1/rooms?startUtc&endUtc&category
会議室とリソース、期間内の空き状況付き
/api/v1/rooms/{email}/availability
1 つの会議室の予定あり時間
/api/v1/booking/profile
受付時間と予定の種類を備えた予約ページ
/api/v1/booking/event-types
イベントの種類
/api/v1/booking/event-types
予定タイプを作成
/api/v1/booking/event-types/{id}/slots?from&to
空いている開始時刻 (最大 42 日)
/api/v1/booking/bookings?status&from&to
予約
/api/v1/booking/bookings/{id}/cancel
予約をキャンセル (ゲストに通知されます)
slots[].startUtc
datetime
読み取り専用
slots[].endUtc
datetime
読み取り専用
slots[].staff
object[]
読み取り専用
status
string
読み取り専用
"confirmed""cancelled"guest
object
読み取り専用
free
boolean
読み取り専用
{
"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)
キー: hrefName
RBAC: User+
すべてのフィールドと写真を備えた個人の連絡先 (contacts.read、contacts.write、競合防止のための If-Match)、グローバル アドレス一覧 (directory.read)、共有と委任 (sharing.manage、委任 = sendAs または sendOnBehalf 付きのメールボックス許可)。
/api/v1/contacts?q
連絡先を検索
/api/v1/contacts
連絡先を作成
/api/v1/contacts/{hrefName}
連絡先を変更 (null のフィールドは維持)
/api/v1/contacts/{hrefName}
連絡先を削除
/api/v1/directory?q&type
グローバル アドレス一覧
/api/v1/sharing/grants
自分の許可
/api/v1/sharing/grants
許可を設定または削除します
/api/v1/sharing/shared-with-me
共有されたアイテム
givenName
string
任意
familyName
string
任意
organization
string
任意
emails
TypedValue[]
任意
[]
phones
TypedValue[]
任意
[]
addresses
Address[]
任意
[]
birthday
string
任意
photo
string
書き込み専用 (シークレット)
permissions
string[]
任意
"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)
キー: id
RBAC: User+
署名付き JSON POST として送信されるイベント: calendar.event.created、calendar.event.updated、calendar.event.deleted、calendar.invitation.replied、booking.created、booking.rescheduled、booking.cancelled。署名 X-Nextxch-Signature: v1=hex(HMAC-SHA256(secret, X-Nextxch-Timestamp + "." + body))。再試行は 30 秒、2 分、10 分、1 時間、6 時間後です。
/api/v1/webhooks
テナントの Webhook
/api/v1/webhooks
Webhook を登録 (シークレットは応答時のみ)
/api/v1/webhooks/{id}
Webhook を削除
/api/v1/webhooks/{id}/deliveries
最近の配信
/api/v1/webhooks/{id}/test
テスト イベントを送信
url
string
必須
events
string[]
必須
"calendar.event.created""calendar.event.updated""calendar.event.deleted""calendar.invitation.replied""booking.created""booking.rescheduled""booking.cancelled""*"secret
string
読み取り専用
id (Ereignis)
string
読み取り専用
{
"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
キー: slug
RBAC: ServerAdmin+
ドメイン、プリンシパル、ストレージ クォータ (GiB)、既定の GoBD WORM コンプライアンス保持を分離するマルチテナント組織の境界です。
/api/admin/cli/objects/Tenant
すべてのテナントを一覧表示します
/api/admin/cli/objects/Tenant/{slugOrId}
slug または UUID でテナントを取得します
/api/admin/cli/objects/Tenant
新しいテナントを作成します
/api/admin/cli/objects/Tenant/{slugOrId}
テナントのクォータをその場で更新します
id
guid
読み取り専用
UUIDv7
slug
string
PRIMARY KEY
name
string
必須
isActive
boolean
任意
true
maxDomains
integer
任意
100
maxPrincipals
integer
任意
10000
quotaGb
integer
任意
100
outboundDailyLimit
integer
任意
25000
defaultLockMode
string
任意
Normal
"Normal""Governance""Compliance""LegalHold"defaultRetentionDays
integer
任意
0
createdAtUtc
datetime
読み取り専用
{
"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
キー: name
RBAC: TenantAdmin+
Dual-DKIM キー (RSA-2048 + Ed25519) の自動並行生成、GoBD WORM 保持ポリシー、プラス アドレス指定、レート制限を備えたホスト型メール ドメイン。
/api/admin/cli/objects/Domain
すべてのドメインを一覧表示します
/api/admin/cli/objects/Domain/{name}
ドメイン構成 & DKIM セレクターを取得します
/api/admin/cli/objects/Domain
ドメインを作成し、RSA-2048 + Ed25519 の DKIM キーを生成します
/api/admin/cli/objects/Domain/{name}
DKIM モード、クォータ、保持を 0 ms で更新します
/api/admin/cli/dns/{name}?live=true
ライブ DNS レコードを検証するか、RFC 1035 BIND ゾーンをエクスポートします
id
guid
読み取り専用
UUIDv7
name
string
PRIMARY KEY
tenant
string
任意
default
isActive
boolean
任意
true
postmasterAddress
string
任意
postmaster@<name>
dkimSigningMode
string
任意
Dual
"Rsa2048""Ed25519""Dual"dkimRsaSelector
string
任意
s2026
dkimRsaDnsName
string
読み取り専用
s2026._domainkey.<name>
dkimEd25519Selector
string
任意
ed2026
dkimEd25519DnsName
string
読み取り専用
ed2026._domainkey.<name>
retentionLockMode
string
任意
Normal
"Normal""Governance""Compliance""LegalHold"retentionDays
integer
任意
0
quotaGb
integer
任意
50
maxMessageSizeMb
integer
任意
50
maxAccounts
integer
任意
1000
outboundDailyLimit
integer
任意
5000
outboundHourlyLimit
integer
任意
1000
usePlusAddressing
boolean
任意
true
createdAtUtc
datetime
読み取り専用
{
"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)
キー: email
RBAC: TenantAdmin+
ユーザー メールボックス (@type="User"、IMAP/JMAP/CalDAV/CardDAV/ActiveSync 対応) または配布リスト (@type="List"、members[] 付き) を表します。
/api/admin/cli/objects/Account?filter=role=TenantAdmin
アカウントと配布リストを一覧表示/フィルターします
/api/admin/cli/objects/Account/User
RFC 6154 フォルダーを備えた新しいユーザー メールボックスを作成します
/api/admin/cli/objects/Account/List
新しい配布リストを作成します
/api/admin/cli/objects/Account/{email}
クォータ、転送、自動応答、パスワードを更新します
/api/admin/cli/objects/Account/{email}
アカウントを論理削除します
id
guid
読み取り専用
UUIDv7
@type
string
任意
User
"User""List"email
string
PRIMARY KEY
displayName
string
任意
Lokalteil
password
string
書き込み専用 (シークレット)
role
string
任意
User
"User""ComplianceAuditor""TenantAdmin""ServerAdmin"isActive
boolean
任意
true
quotaMb
integer
任意
5120
usedBytes
long
読み取り専用
0
outboundDailyLimit
integer
任意
500
forwardAddress
string
任意
forwardKeepOriginal
boolean
任意
true
vacationEnabled
boolean
任意
false
vacationSubject
string
任意
vacationBody
string
書き込み専用 (シークレット)
twoFactorEnabled
boolean
読み取り専用
false
members
string[]
任意
[]
createdAtUtc
datetime
読み取り専用
{
"@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
キー: address
RBAC: TenantAdmin+
プライマリ アカウントのメールボックスまたは配布リストにルーティングされる、セカンダリ メール エイリアスまたは使い捨てのプライバシー保護用マスク エイリアス。
/api/admin/cli/objects/Alias
すべてのエイリアスとマスクされたメールを一覧表示します
/api/admin/cli/objects/Alias
対象メールボックスにルーティングされる新しいエイリアスを作成します
/api/admin/cli/objects/Alias/{address}
エイリアスを有効化/一時停止するか、転送先を更新します
/api/admin/cli/objects/Alias/{address}
エイリアスを削除します
address
string
PRIMARY KEY
target
string
必須
principalId
guid
読み取り専用
description
string
任意
""
isMasked
boolean
任意
false
isEnabled
boolean
任意
true
createdAtUtc
datetime
読み取り専用
{
"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
キー: id
RBAC: TenantAdmin+
/api/v1/send、SCIM 2.0、nextxch-cli 向けの、変更不可で RBAC と CIDR により制限されたスコープ付き API キー (smk_<id>_<secret>)。
/api/admin/cli/objects/ApiKey
有効な API キーを一覧表示します (シークレットは除外)
/api/admin/cli/objects/ApiKey
新しい API キーを発行し、apiKey (smk_...) を 1 回だけ返します
/api/admin/cli/objects/ApiKey/{id}
API キーを直ちに取り消します
id
guid
読み取り専用
UUIDv7
apiKey
string
作成時のみ
smk_<id>_<secret>
label
string
必須
role
string
任意
TenantAdmin
"User""ComplianceAuditor""TenantAdmin""ServerAdmin"senderAddress
string
任意
defaultCategory
string
任意
transactional
"critical""transactional""notification""marketing"allowedCidrs
string[]
任意
[] (Alle IPs)
expiresInDays
integer
書き込み専用 (シークレット)
null (Kein Ablauf)
expiresAtUtc
datetime
読み取り専用
outboundDailyLimit
integer
任意
10000
isActive
boolean
読み取り専用
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
キー: domain
RBAC: ServerAdmin+
ドメインごとの送信 SMTP ルーティングまたは TLS 証明書の例外 (例: 証明書が一致しないパートナー MX ホスト向けの StartTlsIgnoreCert、またはスマート ホスト コネクタ)。
/api/admin/cli/objects/Route
すべてのカスタム送信ルートを一覧表示します
/api/admin/cli/objects/Route
カスタム ドメイン ルートまたは TLS オーバーライドを作成します
/api/admin/cli/objects/Route/{domain}
ターゲット ホスト、ポート、または TLS モードを更新します
/api/admin/cli/objects/Route/{domain}
カスタム ルートを削除します
domain
string
PRIMARY KEY
targetHost
string
任意
"" (Auto DNS-MX)
targetPort
integer
任意
25
tlsMode
string
任意
StartTlsOptional
"StartTlsOptional""StartTlsRequired""StartTlsIgnoreCert""ImplicitTls""ImplicitTlsIgnoreCert""None"username
string
任意
password
string
書き込み専用 (シークレット)
hasPassword
boolean
読み取り専用
false
clearPassword
boolean
書き込み専用 (シークレット)
false
description
string
任意
enabled
boolean
任意
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)
キー: singleton
RBAC: TenantAdmin+
段階的な 28 日間の IP ウォーミング、メッセージ カテゴリ、受信側プロバイダーごとの時間/日単位のクォータ (Google、Microsoft、Yahoo/AOL、ドイツの ISP、iCloud、*) を管理します。
/api/admin/cli/objects/TransactionalSend/singleton
アクティブな IP ウォーミングとプロバイダー クォータ ポリシーを取得します
/api/admin/cli/objects/TransactionalSend/singleton
ウォーミング日、プリセット、またはプロバイダー クォータを更新
enabled
boolean
任意
true
warmingEnabled
boolean
任意
false
startAtWarmingDay
integer
書き込み専用 (シークレット)
1
currentWarmingDay
integer
読み取り専用
currentWarmingPercent
integer
読み取り専用
warmingDailyRampPercents
integer[]
任意
[5,7,10,...,100]
maxDeferHours
integer
任意
48
defaultCategory
string
任意
transactional
"critical""transactional""notification""marketing"preset
string
書き込み専用 (シークレット)
"warming_28d""warming_14d""production_100"categories
CategoryPolicy[]
任意
4 Kategorien
providers
ProviderQuota[]
任意
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)
キー: singleton
RBAC: TenantAdmin+
任意の送信レピュテーション保護: バウンス / 苦情の自動抑制リスト、RFC 8058 ワンクリック配信停止、バウンス サーキット ブレーカー、ISP の 421 に応じた適応型バックオフ、HMAC-SHA256 Webhook。
/api/admin/cli/objects/ReputationShield/singleton
現在の Reputation Shield 構成を取得します
/api/admin/cli/objects/ReputationShield/singleton
保護フラグを更新するか、プリセットを適用します
preset
string
書き込み専用 (シークレット)
"off""recommended""strict_bulk"enableSuppressionPreCheck
boolean
任意
false
enforceSuppressionOnSmtpRelay
boolean
任意
false
allSuppressedBehavior
string
任意
reject_422
"reject_422""accept_noop"autoSuppressHardBounces
boolean
任意
false
hardBounceSuppressionDays
integer
任意
180
autoSuppressConsecutiveSoftBounces
boolean
任意
false
softBounceEscalationThreshold
integer
任意
5
autoSuppressFblComplaints
boolean
任意
false
enableOneClickUnsubscribe
boolean
任意
false
oneClickUnsubscribeCategories
string[]
任意
["marketing","notification"]
enableBounceCircuitBreaker
boolean
任意
false
maxHardBouncePercent
number
任意
5.0
maxComplaintPercent
number
任意
0.1
allowCriticalWhenTripped
boolean
任意
true
enableAdaptiveIspBackoff
boolean
任意
false
ispCooldownMinutes
integer
任意
15
webhookEnabled
boolean
任意
false
webhookUrl
string
任意
webhookSecret
string
書き込み専用 (シークレット)
{
"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)
キー: singleton
RBAC: ServerAdmin+
多段階の受信防御: SPF/DKIM/DMARC/ARC の検証、スマート グレーリスト (/24 IPv4 & /64 IPv6)、オンライン ML 分類器 (FTRL-Proximal)、DNSBL ゾーン、許可/ブロックリスト、ClamAV TCP スキャン。
/api/admin/cli/objects/SpamGuard/singleton
SpamGuard のしきい値 & 学習カウンターを取得します
/api/admin/cli/objects/SpamGuard/singleton
スコア、DNSBL、許可リスト、または ClamAV をその場で更新します
enableEmailAuthChecks
boolean
任意
true
enableGreylisting
boolean
任意
true
greylistRetryDelaySeconds
integer
任意
240
junkScoreThreshold
number
任意
4.5
rejectScoreThreshold
number
任意
9.0
tagSubjectOnJunk
boolean
任意
false
subjectTagPrefix
string
任意
"[SPAM] "
enableStructuralHeuristics
boolean
任意
true
dnsblZones
string[]
任意
["bl.spamcop.net","ix.dnsbl.manitu.net"]
dnsblHitScore
number
任意
3.5
allowedSendersOrDomains
string[]
任意
[]
blockedSendersOrDomains
string[]
任意
[]
clamAvEnabled
boolean
任意
false
clamAvHost
string
任意
"127.0.0.1"
clamAvPort
integer
任意
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)
キー: singleton
RBAC: ServerAdmin+
送信 MX 配信キュー、ワーカーの同時実行数、再試行間隔、ISP スロットリング、送信 TLS 検証、グローバル スマート ホスト、受信 ESMTP 制限を制御します。
/api/admin/cli/objects/SmtpQueue/singleton
すべてのキュー、TLS、ESMTP の設定を取得します
/api/admin/cli/objects/SmtpQueue/singleton
キュー ワーカー、再試行スケジュール、ESMTP 制限を 0 ms で更新します
outboundQueuePaused
boolean
任意
false
outboundWorkerConcurrency
integer
任意
8
maxDeliveryAttempts
integer
任意
10
retryScheduleMinutes
integer[]
任意
[5,15,60,240,720]
maxConcurrentConnectionsPerMxDomain
integer
任意
4
strictThrottleDomains
string[]
任意
["t-online.de","gmx.de","web.de","yahoo.com"]
strictThrottleMaxConcurrency
integer
任意
2
outboundConnectTimeoutSeconds
integer
任意
30
outboundBindAddress
string
任意
"" (Auto)
outboundUseStartTls
boolean
任意
true
requireOutboundTls
boolean
任意
false
outboundTlsCertValidation
string
任意
Opportunistic
"Opportunistic""IgnoreErrors""Strict"outboundSmartHost
string
任意
""
outboundSmartPort
integer
任意
587
maxMessageSizeMb
long
任意
50
maxRecipientsPerTransaction
integer
任意
100
maxConnectionsPerIp
integer
任意
20
tarpitDelayMs
integer
任意
1500
requireTlsForAuth
boolean
任意
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)
キー: singleton
RBAC: ServerAdmin+
組織全体の法的免責事項 (DKIM 署名の前に挿入)、グローバル受信 Sieve スクリプト、Fail2Ban 自動禁止のしきい値、正規の ServerHostName。
/api/admin/cli/objects/TransportRules/singleton
免責事項、グローバル Sieve、自動禁止の設定を取得します
/api/admin/cli/objects/TransportRules/singleton
トランスポート ルールをその場で更新します
/api/admin/cli/objects/Server/singleton
ServerHostName、ストレージ エンジン、キューの深さ、ライセンス状態を取得します
/api/admin/cli/objects/Server/singleton
正規の ServerHostName を 0 ms で更新します
outboundDisclaimerEnabled
boolean
任意
false
outboundDisclaimerExternalOnly
boolean
任意
true
outboundDisclaimerText
string
任意
""
outboundDisclaimerHtml
string
任意
""
inboundSystemSieve
string
任意
""
autoBanThreshold
integer
任意
8
autoBanDurationMinutes
integer
任意
30
serverHostName
string
任意
mail.<domain>
storageProvider
string
読み取り専用
Sqlite | SqlServer | Postgres
activeQueueCount
integer
読み取り専用
0
licenseState
string
読み取り専用
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")}");