अध्याय 14 क्लाइंट, ग्रुपवेयर & CLI एडमिन: #pApiAuth

पूर्ण API & CLI फ़ील्ड संदर्भ: सभी 12 ऑब्जेक्ट प्रकार, REST एंडपॉइंट & POST /api/v1/send

यह संदर्भ सभी 12 प्रबंधन ऑब्जेक्ट (/api/admin/cli/objects/{type} & nextxch-cli) के साथ-साथ ट्रांज़ैक्शनल ईमेल डिलीवरी (POST /api/v1/send) की हर JSON प्रॉपर्टी, डेटा प्रकार, enum मान, डिफ़ॉल्ट सेटिंग और न्यूनतम 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)

कुंजी: Idempotency-Key RBAC: User+
13 प्रॉपर्टी

वेब ऐप्स, ERP, CRM और 2FA कोड के लिए उच्च-थ्रूपुट HTTP JSON डिलीवरी एंडपॉइंट, श्रेणी प्राथमिकता, IP वार्मिंग, सप्रेशन पूर्व-जाँच और 24 घंटे की आइडेम्पोटेंसी के साथ।

POST /api/v1/send ट्रांज़ैक्शनल ईमेल को कतार में डालता है और हस्ताक्षरित करता है (UTF-8 Multipart/Alternative + अटैचमेंट)
POST /api/v1/unsubscribe/{token} सार्वजनिक RFC 8058 One-Click-Unsubscribe एंडपॉइंट (DKIM-हस्ताक्षरित टोकन)
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ from string वैकल्पिक
डिफ़ॉल्ट: Key senderAddress
प्रेषक पता। Role=User कुंजियों के लिए स्वचालित रूप से कुंजी के बंधे हुए senderAddress पर डिफ़ॉल्ट होता है।
├─ to string[] आवश्यक
प्राथमिक प्राप्तकर्ता ईमेल पतों की सरणी (कम से कम 1 आवश्यक)।
├─ cc string[] वैकल्पिक
डिफ़ॉल्ट: []
वैकल्पिक प्रतिलिपि (CC) प्राप्तकर्ता।
├─ bcc string[] वैकल्पिक
डिफ़ॉल्ट: []
वैकल्पिक गुप्त प्रतिलिपि (BCC) प्राप्तकर्ता।
├─ replyTo string वैकल्पिक
वैकल्पिक Reply-To पता।
├─ subject string आवश्यक
ईमेल विषय पंक्ति (UTF-8)।
├─ textBody string वैकल्पिक
सादा-टेक्स्ट बॉडी (text/plain)। textBody या htmlBody में से कम से कम एक आवश्यक है।
├─ htmlBody string वैकल्पिक
HTML बॉडी (text/html)। 10/10 डिलीवरेबिलिटी के लिए textBody के साथ प्रदान करें।
├─ category string वैकल्पिक
डिफ़ॉल्ट: transactional
कतार प्राथमिकता, IP वार्मिंग बायपास और प्राप्तकर्ता-प्रदाता कोटा बकेट चुनता है।
Enum:"critical""transactional""notification""marketing"
├─ overflowMode string वैकल्पिक
डिफ़ॉल्ट: DeferQueue
गंतव्य प्रदाता का प्रति घंटा कोटा पूरा होने पर व्यवहार (सुचारु कतार पेसिंग बनाम HTTP 429 + Retry-After)।
Enum:"DeferQueue""Reject429"
├─ idempotencyKey string वैकल्पिक
डिफ़ॉल्ट: Header Idempotency-Key
नियतात्मक डीडुप्लिकेशन कुंजी (उदा. इनवॉइस ID), जो 24 घंटों के भीतर दोहरी डिलीवरी को रोकती है।
├─ headers Record<string, string> वैकल्पिक
डिफ़ॉल्ट: {}
कस्टम RFC 5322 X-हेडर डिक्शनरी।
├─ attachments SendAttachmentDto[] वैकल्पिक
डिफ़ॉल्ट: []
{ fileName: string, contentType: string, base64Content: string } की सरणी।
{
  "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();
Collection ऑब्जेक्ट (CRUD)

IntegrationKey (API v1)

कुंजी: id RBAC: TenantAdmin+
9 प्रॉपर्टी

/api/v1 के लिए स्कोप वाली इंटीग्रेशन कुंजी। एक कुंजी किसी एक उपयोगकर्ता की ओर से कार्य करती है या, टेनेंट इंटीग्रेशन के रूप में, X-Nextxch-Act-As हेडर में नामित उपयोगकर्ता की ओर से। स्कोप के बिना API 403 लौटाता है; किसी अन्य टेनेंट का उपयोगकर्ता 404 देता है। वैकल्पिक OAuth 2.0 client credentials (टोकन 1 घंटे के लिए मान्य)।

POST /api/admin/integrations/keys एक कुंजी बनाएँ (एडमिन, एक बार दिखाई जाती है)
PUT /api/admin/integrations/keys/{id} स्कोप बदलें
DELETE /api/admin/integrations/keys/{id} एक कुंजी (और उसके OAuth टोकन) निरस्त करें
POST /api/v1/oauth/token OAuth 2.0 client_credentials: एक्सेस टोकन के लिए key id + key
GET /api/v1/me कुंजी, स्कोप और कार्य करने वाला उपयोगकर्ता
GET /api/v1/openapi.json इंस्टॉलेशन का OpenAPI 3.1 दस्तावेज़
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ label string आवश्यक
लेबल, उदा. CRM या ERP।
├─ mode string आवश्यक
डिफ़ॉल्ट: user
user: हमेशा userEmail की ओर से कार्य करता है। tenant: X-Nextxch-Act-As की ओर से कार्य करता है (केवल अपने टेनेंट के उपयोगकर्ता)।
Enum:"user""tenant"
├─ userEmail string वैकल्पिक
mode=user के लिए उपयोगकर्ता।
├─ scopes string[] आवश्यक
अनुमतियाँ; .write में .read शामिल है। crypto.read और crypto.manage (S/MIME, PGP) आरक्षित हैं।
Enum:"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[] वैकल्पिक
डिफ़ॉल्ट: []
अनुमत IP नेटवर्क।
├─ expiresInDays integer वैकल्पिक
दिनों में समाप्ति (खाली: असीमित)।
├─ senderAddress string वैकल्पिक
mail.send (POST /api/v1/send) के लिए प्रेषक।
├─ apiKey string केवल-पठन
smk_<id>_<secret>, केवल create प्रतिक्रिया में; केवल हैश संग्रहीत होता है।
{
  "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");
Collection ऑब्जेक्ट (CRUD)

CalendarEvent (API v1)

कुंजी: hrefName RBAC: User+
12 प्रॉपर्टी

शृंखला और अपवादों के साथ ईवेंट, उपस्थित लोग, कक्ष, आमंत्रण, उत्तर, उपलब्ध/व्यस्त, साझा और वैश्विक कैलेंडर तथा आमंत्रण लिंक। स्कोप calendar.read और calendar.write। समय UTC (ISO-8601) में, समय क्षेत्र IANA नामों के रूप में।

GET /api/v1/calendars अपने, साझा, वैश्विक और संसाधन कैलेंडर
GET /api/v1/calendar/events?from&to&calendarId&limit&cursor किसी अवधि में घटनाएँ (श्रृंखला विस्तारित)
POST /api/v1/calendar/events एक ईवेंट बनाएँ (लोगों और कक्षों को आमंत्रित करें)
GET /api/v1/calendar/events/{hrefName} शृंखला और अपवादों के साथ ईवेंट
PUT /api/v1/calendar/events/{hrefName} परिवर्तन; श्रृंखला के भागों के लिए scope=occurrence|following
DELETE /api/v1/calendar/events/{hrefName} हटाएँ, वैकल्पिक रूप से रद्दीकरण सूचना के साथ (notify=true)
POST /api/v1/calendar/events/{hrefName}/respond किसी आमंत्रण का उत्तर दें
POST /api/v1/calendar/events/{hrefName}/invite-link हस्ताक्षरित आमंत्रण लिंक
GET /api/v1/calendar/events/{hrefName}/ics Raw iCalendar
POST /api/v1/calendar/freebusy लोगों और कक्षों की उपलब्ध/व्यस्त स्थिति
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ title string आवश्यक
शीर्षक।
├─ startUtc datetime आवश्यक
UTC में प्रारंभ।
├─ endUtc datetime आवश्यक
UTC में समाप्ति।
├─ timeZone string वैकल्पिक
डिफ़ॉल्ट: Europe/Berlin
ईवेंट का IANA समय क्षेत्र (श्रृंखला, प्रदर्शन)।
├─ allDay boolean वैकल्पिक
डिफ़ॉल्ट: false
पूरे दिन।
├─ attendees Attendee[] वैकल्पिक
डिफ़ॉल्ट: []
{ email, name, role }; कक्ष और संसाधन अपने नियमों के अनुसार स्वीकार या अस्वीकार करते हैं।
├─ sendInvitations boolean वैकल्पिक
डिफ़ॉल्ट: false
iMIP आमंत्रण भेजें।
├─ recurrence पुनरावृत्ति वैकल्पिक
{ freq, interval, byDay, byMonthDay, count, until }.
├─ showAs string वैकल्पिक
डिफ़ॉल्ट: busy
इस रूप में दिखाएँ।
Enum:"free""tentative""busy""oof""workingElsewhere"
├─ isPrivate boolean वैकल्पिक
डिफ़ॉल्ट: false
निजी (विवरण केवल स्वामी के लिए)।
├─ calendarId string वैकल्पिक
लिखने के अधिकार वाला लक्ष्य कैलेंडर ownerId:slug।
├─ teamsMeeting boolean वैकल्पिक
Microsoft Teams मीटिंग बनाएँ।
{
  "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()!;
Collection ऑब्जेक्ट (CRUD)

Rooms & Booking (API v1)

कुंजी: id RBAC: User+
6 प्रॉपर्टी

उपलब्धता के साथ कक्ष और संसाधन (rooms.read) और Calendly जैसे बुकिंग पेज (booking.read, booking.write): बुकिंग पेज, ईवेंट प्रकार, खाली स्लॉट, बुकिंग पढ़ना और रद्द करना। कक्ष को एक ईवेंट के माध्यम से बुक किया जाता है, जिसमें कक्ष प्रतिभागी होता है।

GET /api/v1/rooms?startUtc&endUtc&category कक्ष और संसाधन, अवधि के लिए उपलब्धता सहित
GET /api/v1/rooms/{email}/availability एक कक्ष का व्यस्त समय
GET /api/v1/booking/profile समय और ईवेंट प्रकारों के साथ बुकिंग पेज
GET /api/v1/booking/event-types इवेंट प्रकार
POST /api/v1/booking/event-types ईवेंट प्रकार बनाएँ
GET /api/v1/booking/event-types/{id}/slots?from&to उपलब्ध प्रारंभ समय (अधिकतम 42 दिन)
GET /api/v1/booking/bookings?status&from&to बुकिंग
POST /api/v1/booking/bookings/{id}/cancel एक बुकिंग रद्द करें (अतिथि को सूचित किया जाता है)
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ slots[].startUtc datetime केवल-पठन
UTC में उपलब्धता का प्रारंभ।
├─ slots[].endUtc datetime केवल-पठन
समाप्ति (प्रारंभ और अवधि)।
├─ slots[].staff object[] केवल-पठन
टीम ईवेंट प्रकारों के लिए उपलब्ध कर्मचारी।
├─ status string केवल-पठन
बुकिंग स्थिति।
Enum:"confirmed""cancelled"
├─ guest object केवल-पठन
{ name, email, phone, timeZone }।
├─ 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());
Collection ऑब्जेक्ट (CRUD)

Contact, Directory & Sharing (API v1)

कुंजी: hrefName RBAC: User+
9 प्रॉपर्टी

सभी फ़ील्ड और फ़ोटो के साथ व्यक्तिगत संपर्क (contacts.read, contacts.write, विरोध सुरक्षा के लिए If-Match), वैश्विक पता सूची (directory.read) और साझाकरण तथा प्रत्यायोजन (sharing.manage, प्रत्यायोजन = sendAs या sendOnBehalf के साथ मेलबॉक्स अनुदान)।

GET /api/v1/contacts?q संपर्क खोजें
POST /api/v1/contacts एक संपर्क बनाएँ
PUT /api/v1/contacts/{hrefName} एक संपर्क बदलें (null फ़ील्ड यथावत रहते हैं)
DELETE /api/v1/contacts/{hrefName} संपर्क हटाएँ
GET /api/v1/directory?q&type वैश्विक पता सूची
GET /api/v1/sharing/grants अपने अनुदान
PUT /api/v1/sharing/grants अनुमति सेट करें या हटाएँ
GET /api/v1/sharing/shared-with-me मेरे साथ साझा
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ givenName string वैकल्पिक
पहला नाम।
├─ familyName string वैकल्पिक
कुलनाम।
├─ organization string वैकल्पिक
कंपनी।
├─ emails TypedValue[] वैकल्पिक
डिफ़ॉल्ट: []
{ type: work|home|other, value }।
├─ phones TypedValue[] वैकल्पिक
डिफ़ॉल्ट: []
{ type: cell|work|home|fax, value }।
├─ addresses Address[] वैकल्पिक
डिफ़ॉल्ट: []
{ type, street, city, region, postalCode, country }।
├─ birthday string वैकल्पिक
yyyy-MM-dd या --MM-dd।
├─ photo string केवल-लेखन (सीक्रेट)
data:image/jpeg;base64,... (अधिकतम 512 KB), खाली मान हटा देता है।
├─ permissions string[] वैकल्पिक
किसी साझाकरण के अधिकार (PUT /sharing/grants)।
Enum:"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" }
});
Collection ऑब्जेक्ट (CRUD)

Webhook (API v1)

कुंजी: id RBAC: User+
4 प्रॉपर्टी

हस्ताक्षरित 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 s, 2 min, 10 min, 1 h और 6 h के बाद पुनः प्रयास।

GET /api/v1/webhooks टेनेंट के वेबहुक
POST /api/v1/webhooks वेबहुक पंजीकृत करें (सीक्रेट केवल प्रतिक्रिया में)
DELETE /api/v1/webhooks/{id} वेबहुक हटाएँ
GET /api/v1/webhooks/{id}/deliveries हाल की डिलीवरी
POST /api/v1/webhooks/{id}/test एक टेस्ट ईवेंट भेजें
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ url string आवश्यक
HTTPS लक्ष्य (आंतरिक पते अवरुद्ध हैं)।
├─ events string[] आवश्यक
ईवेंट; कुंजी के पास संबंधित .read स्कोप होने चाहिए।
Enum:"calendar.event.created""calendar.event.updated""calendar.event.deleted""calendar.invitation.replied""booking.created""booking.rescheduled""booking.cancelled""*"
├─ secret string केवल-पठन
whsec_..., केवल बनाते समय; एन्क्रिप्टेड रूप से संग्रहीत।
├─ id (Ereignis) string केवल-पठन
evt_... प्रति परिवर्तन स्थिर, डी-डुप्लिकेशन के लिए।
{
  "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();
});
Collection ऑब्जेक्ट (CRUD)

Tenant

कुंजी: slug RBAC: ServerAdmin+
11 प्रॉपर्टी

मल्टी-टेनेंट संगठन सीमा, जो डोमेन, प्रिंसिपल, स्टोरेज कोटा (GiB) और डिफ़ॉल्ट GoBD WORM अनुपालन प्रतिधारण को अलग करती है।

GET /api/admin/cli/objects/Tenant सभी टेनेंट सूचीबद्ध करता है
GET /api/admin/cli/objects/Tenant/{slugOrId} slug या UUID द्वारा टेनेंट प्राप्त करता है
POST /api/admin/cli/objects/Tenant एक नया टेनेंट बनाता है
PATCH /api/admin/cli/objects/Tenant/{slugOrId} टेनेंट कोटा को उसी स्थान पर अपडेट करता है
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ id guid केवल-पठन
डिफ़ॉल्ट: UUIDv7
आंतरिक अपरिवर्तनीय UUIDv7 पहचानकर्ता।
├─ slug string PRIMARY KEY
अद्वितीय, URL-सुरक्षित टेनेंट कुंजी (उदा. "default", "acme")।
├─ name string आवश्यक
मानव-पठनीय संगठन डिस्प्ले नाम।
├─ isActive boolean वैकल्पिक
डिफ़ॉल्ट: true
टेनेंट सक्षम या निलंबित करें।
├─ maxDomains integer वैकल्पिक
डिफ़ॉल्ट: 100
इस टेनेंट में अनुमत अधिकतम डोमेन।
├─ maxPrincipals integer वैकल्पिक
डिफ़ॉल्ट: 10000
अधिकतम खाते और वितरण सूचियाँ।
├─ quotaGb integer वैकल्पिक
डिफ़ॉल्ट: 100
GiB में टेनेंट स्टोरेज सीमा।
├─ outboundDailyLimit integer वैकल्पिक
डिफ़ॉल्ट: 25000
पूरे टेनेंट में प्रति दिन अधिकतम आउटबाउंड ईमेल।
├─ defaultLockMode string वैकल्पिक
डिफ़ॉल्ट: Normal
नए बनाए गए डोमेन के लिए डिफ़ॉल्ट GoBD WORM लॉक मोड।
Enum:"Normal""Governance""Compliance""LegalHold"
├─ defaultRetentionDays integer वैकल्पिक
डिफ़ॉल्ट: 0
दिनों में डिफ़ॉल्ट अनिवार्य प्रतिधारण अवधि (3650 = 10 वर्ष GoBD)।
├─ createdAtUtc datetime केवल-पठन
UTC में निर्माण टाइमस्टैम्प।
{
  "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);
Collection ऑब्जेक्ट (CRUD)

Domain

कुंजी: name RBAC: TenantAdmin+
19 गुण

स्वचालित समानांतर Dual-DKIM कुंजी निर्माण (RSA-2048 + Ed25519), GoBD WORM प्रतिधारण नीति, प्लस-एड्रेसिंग और दर सीमाओं के साथ होस्ट किया गया मेल डोमेन।

GET /api/admin/cli/objects/Domain सभी डोमेन सूचीबद्ध करता है
GET /api/admin/cli/objects/Domain/{name} डोमेन कॉन्फ़िगरेशन & DKIM सेलेक्टर प्राप्त करता है
POST /api/admin/cli/objects/Domain डोमेन बनाता है & RSA-2048 + Ed25519 DKIM कुंजियाँ उत्पन्न करता है
PATCH /api/admin/cli/objects/Domain/{name} DKIM मोड, कोटा या प्रतिधारण को 0 ms में अपडेट करता है
GET /api/admin/cli/dns/{name}?live=true लाइव DNS रिकॉर्ड सत्यापित करता है या RFC 1035 BIND ज़ोन निर्यात करता है
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ id guid केवल-पठन
डिफ़ॉल्ट: UUIDv7
आंतरिक डोमेन UUIDv7।
├─ name string PRIMARY KEY
DNS डोमेन नाम (उदा. "muster-logistik.de")।
├─ tenant string वैकल्पिक
डिफ़ॉल्ट: default
स्वामी टेनेंट का slug या GUID।
├─ isActive boolean वैकल्पिक
डिफ़ॉल्ट: true
डोमेन सक्षम करें या रोकें।
├─ postmasterAddress string वैकल्पिक
डिफ़ॉल्ट: postmaster@<name>
RFC 5321 postmaster संपर्क पता।
├─ dkimSigningMode string वैकल्पिक
डिफ़ॉल्ट: Dual
सक्रिय DKIM हस्ताक्षर मोड (Dual, RSA-2048 और Ed25519 दोनों से हस्ताक्षर करता है)।
Enum:"Rsa2048""Ed25519""Dual"
├─ dkimRsaSelector string वैकल्पिक
डिफ़ॉल्ट: s2026
RSA-2048 DNS सिलेक्टर।
├─ dkimRsaDnsName string केवल-पठन
डिफ़ॉल्ट: s2026._domainkey.<name>
गणना किया गया RSA-2048 _domainkey FQDN।
├─ dkimEd25519Selector string वैकल्पिक
डिफ़ॉल्ट: ed2026
Ed25519 DNS सेलेक्टर।
├─ dkimEd25519DnsName string केवल-पठन
डिफ़ॉल्ट: ed2026._domainkey.<name>
गणना किया गया Ed25519 _domainkey FQDN।
├─ retentionLockMode string वैकल्पिक
डिफ़ॉल्ट: Normal
इस डोमेन के लिए GoBD WORM आर्काइव लॉक मोड।
Enum:"Normal""Governance""Compliance""LegalHold"
├─ retentionDays integer वैकल्पिक
डिफ़ॉल्ट: 0
अनिवार्य प्रतिधारण अवधि दिनों में (3650 = 10 वर्ष GoBD)।
├─ quotaGb integer वैकल्पिक
डिफ़ॉल्ट: 50
GiB में डोमेन स्टोरेज की ऊपरी सीमा।
├─ maxMessageSizeMb integer वैकल्पिक
डिफ़ॉल्ट: 50
MiB में अधिकतम संदेश आकार।
├─ maxAccounts integer वैकल्पिक
डिफ़ॉल्ट: 1000
इस डोमेन में अधिकतम मेलबॉक्स।
├─ outboundDailyLimit integer वैकल्पिक
डिफ़ॉल्ट: 5000
इस डोमेन के लिए दैनिक आउटबाउंड भेजने की सीमा।
├─ outboundHourlyLimit integer वैकल्पिक
डिफ़ॉल्ट: 1000
इस डोमेन के लिए प्रति घंटा आउटबाउंड भेजने की सीमा।
├─ usePlusAddressing boolean वैकल्पिक
डिफ़ॉल्ट: true
RFC 5233 प्लस-एड्रेसिंग (user+tag@domain) सक्षम करता है।
├─ createdAtUtc datetime केवल-पठन
UTC में निर्माण टाइमस्टैम्प।
{
  "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();
Collection ऑब्जेक्ट (CRUD)

Account (Account/User & Account/List)

कुंजी: email RBAC: TenantAdmin+
18 प्रॉपर्टी

एक उपयोगकर्ता मेलबॉक्स (@type="User", IMAP/JMAP/CalDAV/CardDAV/ActiveSync के साथ) या एक वितरण सूची (@type="List", members[] के साथ) को दर्शाता है।

GET /api/admin/cli/objects/Account?filter=role=TenantAdmin खातों और वितरण सूचियों को सूचीबद्ध/फ़िल्टर करता है
POST /api/admin/cli/objects/Account/User RFC 6154 फ़ोल्डरों के साथ एक नया उपयोगकर्ता मेलबॉक्स बनाता है
POST /api/admin/cli/objects/Account/List एक नई वितरण सूची बनाता है
PATCH /api/admin/cli/objects/Account/{email} कोटा, अग्रेषण, अवकाश संदेश या पासवर्ड अपडेट करता है
DELETE /api/admin/cli/objects/Account/{email} किसी खाते को सॉफ़्ट-डिलीट करता है
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ id guid केवल-पठन
डिफ़ॉल्ट: UUIDv7
आंतरिक प्रिंसिपल UUIDv7।
├─ @type string वैकल्पिक
डिफ़ॉल्ट: User
खाता प्रकार: User मेलबॉक्स या List वितरण समूह।
Enum:"User""List"
├─ email string PRIMARY KEY
मेलबॉक्स या सूची का प्राथमिक ईमेल पता।
├─ displayName string वैकल्पिक
डिफ़ॉल्ट: Lokalteil
Webmail, GAL और From हेडर में दिखाया जाने वाला डिस्प्ले नाम।
├─ password string केवल-लेखन (सीक्रेट)
create/update पर सादा-पाठ पासवर्ड (तुरंत Argon2id से हैश किया जाता है)।
├─ role string वैकल्पिक
डिफ़ॉल्ट: User
प्रशासनिक RBAC भूमिका।
Enum:"User""ComplianceAuditor""TenantAdmin""ServerAdmin"
├─ isActive boolean वैकल्पिक
डिफ़ॉल्ट: true
खाता सक्षम या निलंबित करें।
├─ quotaMb integer वैकल्पिक
डिफ़ॉल्ट: 5120
मेलबॉक्स स्टोरेज कोटा MiB में (5120 = 5 GiB)।
├─ usedBytes long केवल-पठन
डिफ़ॉल्ट: 0
बाइट में वर्तमान मेलबॉक्स स्टोरेज उपयोग।
├─ outboundDailyLimit integer वैकल्पिक
डिफ़ॉल्ट: 500
इस खाते के लिए दैनिक आउटबाउंड संदेश सीमा।
├─ forwardAddress string वैकल्पिक
वैकल्पिक SRS-सुरक्षित अग्रेषण गंतव्य ईमेल।
├─ forwardKeepOriginal boolean वैकल्पिक
डिफ़ॉल्ट: true
अग्रेषण सक्रिय होने पर INBOX में एक स्थानीय प्रति रखें।
├─ vacationEnabled boolean वैकल्पिक
डिफ़ॉल्ट: false
स्वचालित अनुपस्थिति उत्तरदाता सक्षम करें।
├─ vacationSubject string वैकल्पिक
अनुपस्थिति स्वचालित उत्तर का विषय।
├─ vacationBody string केवल-लेखन (सीक्रेट)
अनुपस्थिति स्वचालित उत्तर का मुख्य पाठ।
├─ twoFactorEnabled boolean केवल-पठन
डिफ़ॉल्ट: false
दर्शाता है कि TOTP 2FA सक्रिय है या नहीं।
├─ members string[] वैकल्पिक
डिफ़ॉल्ट: []
सदस्य ईमेल पते (@type="List" के लिए)।
├─ createdAtUtc datetime केवल-पठन
UTC में निर्माण टाइमस्टैम्प।
{
  "@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
});
Collection ऑब्जेक्ट (CRUD)

Alias

कुंजी: address RBAC: TenantAdmin+
7 गुण

द्वितीयक ईमेल उपनाम या डिस्पोज़ेबल मास्क्ड गोपनीयता उपनाम, जो किसी प्राथमिक Account मेलबॉक्स या वितरण सूची पर रूट किया जाता है।

GET /api/admin/cli/objects/Alias सभी उपनाम और मास्क्ड ईमेल सूचीबद्ध करता है
POST /api/admin/cli/objects/Alias लक्ष्य मेलबॉक्स पर रूट किया गया नया उपनाम बनाता है
PATCH /api/admin/cli/objects/Alias/{address} किसी उपनाम को सक्षम/रोकता है या उसका लक्ष्य अपडेट करता है
DELETE /api/admin/cli/objects/Alias/{address} उपनाम हटाता है
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ address string PRIMARY KEY
उपनाम ईमेल पता।
├─ target string आवश्यक
लक्ष्य प्राथमिक Account ईमेल पता।
├─ principalId guid केवल-पठन
हल किया गया लक्ष्य principal UUID।
├─ description string वैकल्पिक
डिफ़ॉल्ट: ""
उद्देश्य नोट या बाहरी सेवा लेबल (Webmail कंपोज़र में भी दिखाया जाता है)।
├─ isMasked boolean वैकल्पिक
डिफ़ॉल्ट: false
उपनाम को मास्क्ड गोपनीयता उपनाम के रूप में चिह्नित करता है।
├─ isEnabled boolean वैकल्पिक
डिफ़ॉल्ट: true
false होने पर, इस उपनाम पर आने वाला मेल पता मुक्त किए बिना अस्वीकार कर दिया जाता है।
├─ createdAtUtc datetime केवल-पठन
UTC में निर्माण टाइमस्टैम्प।
{
  "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
});
Collection ऑब्जेक्ट (CRUD)

ApiKey

कुंजी: id RBAC: TenantAdmin+
11 प्रॉपर्टी

/api/v1/send, SCIM 2.0 या nextxch-cli के लिए अपरिवर्तनीय, RBAC- और CIDR-प्रतिबंधित Scoped API Key (smk_<id>_<secret>)।

GET /api/admin/cli/objects/ApiKey सक्रिय API कुंजियों की सूची (secret छोड़ा गया)
POST /api/admin/cli/objects/ApiKey एक नई API कुंजी बनाता है और apiKey (smk_...) एक बार लौटाता है
DELETE /api/admin/cli/objects/ApiKey/{id} API कुंजी को तुरंत रद्द करता है
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ id guid केवल-पठन
डिफ़ॉल्ट: UUIDv7
अद्वितीय कुंजी UUID (DELETE के माध्यम से रद्द करने के लिए प्रयुक्त)।
├─ apiKey string केवल-निर्माण
डिफ़ॉल्ट: smk_<id>_<secret>
पूर्ण Bearer टोकन केवल एक बार, निर्माण के समय लौटाया जाता है।
├─ label string आवश्यक
मानव-पठनीय लेबल (उदा. "Ansible GitOps" या "Shopware 6")।
├─ role string वैकल्पिक
डिफ़ॉल्ट: TenantAdmin
अधिकार का दायरा (User सख्ती से केवल POST /api/v1/send तक सीमित है)।
Enum:"User""ComplianceAuditor""TenantAdmin""ServerAdmin"
├─ senderAddress string वैकल्पिक
अधिकृत प्रेषक पता (role="User" होने पर आवश्यक)।
├─ defaultCategory string वैकल्पिक
डिफ़ॉल्ट: transactional
इस कुंजी के लिए डिफ़ॉल्ट भेजने की श्रेणी।
Enum:"critical""transactional""notification""marketing"
├─ allowedCidrs string[] वैकल्पिक
डिफ़ॉल्ट: [] (Alle IPs)
अनुमत स्रोत IPv4/IPv6 CIDR नेटवर्क।
├─ expiresInDays integer केवल-लेखन (सीक्रेट)
डिफ़ॉल्ट: null (Kein Ablauf)
निर्माण से दिनों में वैकल्पिक स्वचालित समाप्ति।
├─ expiresAtUtc datetime केवल-पठन
गणना किया गया UTC समाप्ति टाइमस्टैम्प।
├─ 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()!;
Collection ऑब्जेक्ट (CRUD)

Route

कुंजी: domain RBAC: ServerAdmin+
10 प्रॉपर्टी

प्रति-डोमेन आउटबाउंड SMTP रूटिंग या TLS प्रमाणपत्र अपवाद (उदा. बेमेल प्रमाणपत्र वाले भागीदार MX होस्ट के लिए StartTlsIgnoreCert, या स्मार्ट-होस्ट कनेक्टर)।

GET /api/admin/cli/objects/Route सभी कस्टम आउटबाउंड रूट सूचीबद्ध करता है
POST /api/admin/cli/objects/Route कस्टम डोमेन रूट या TLS ओवरराइड बनाता है
PATCH /api/admin/cli/objects/Route/{domain} लक्ष्य होस्ट, पोर्ट या TLS मोड अपडेट करता है
DELETE /api/admin/cli/objects/Route/{domain} कस्टम रूट हटाता है
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ domain string PRIMARY KEY
गंतव्य प्राप्तकर्ता डोमेन (उदा. "neff.me" या "*.partner-holding.eu")।
├─ targetHost string वैकल्पिक
डिफ़ॉल्ट: "" (Auto DNS-MX)
रिले होस्टनाम या IP। गंतव्य MX को DNS के माध्यम से स्वचालित रूप से रिज़ॉल्व करने के लिए खाली छोड़ें।
├─ targetPort integer वैकल्पिक
डिफ़ॉल्ट: 25
गंतव्य TCP पोर्ट (25, 587 या 465)।
├─ tlsMode string वैकल्पिक
डिफ़ॉल्ट: StartTlsOptional
इस डोमेन के लिए आउटबाउंड TLS और X.509 सत्यापन मोड।
Enum:"StartTlsOptional""StartTlsRequired""StartTlsIgnoreCert""ImplicitTls""ImplicitTlsIgnoreCert""None"
├─ username string वैकल्पिक
वैकल्पिक SMTP AUTH उपयोगकर्ता नाम।
├─ password string केवल-लेखन (सीक्रेट)
वैकल्पिक SMTP AUTH पासवर्ड।
├─ hasPassword boolean केवल-पठन
डिफ़ॉल्ट: false
बताता है कि पासवर्ड संग्रहीत है या नहीं।
├─ clearPassword boolean केवल-लेखन (सीक्रेट)
डिफ़ॉल्ट: false
संग्रहीत पासवर्ड हटाने के लिए true सेट करें।
├─ 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+
11 प्रॉपर्टी

प्रगतिशील 28-दिवसीय IP वार्मिंग, संदेश श्रेणियाँ और प्रति-प्राप्तकर्ता-प्रदाता प्रति घंटा/दैनिक कोटा (Google, Microsoft, Yahoo/AOL, जर्मन ISP, iCloud, *) नियंत्रित करता है।

GET /api/admin/cli/objects/TransactionalSend/singleton सक्रिय IP वार्मिंग & प्रदाता कोटा नीति प्राप्त करता है
PATCH /api/admin/cli/objects/TransactionalSend/singleton वार्मिंग दिवस, प्रीसेट या प्रदाता कोटा अपडेट करता है
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ enabled boolean वैकल्पिक
डिफ़ॉल्ट: true
श्रेणी और प्रदाता कोटा नियंत्रण सक्षम करता है।
├─ warmingEnabled boolean वैकल्पिक
डिफ़ॉल्ट: false
प्रगतिशील दैनिक IP वार्मिंग रैम्प सक्षम करता है।
├─ startAtWarmingDay integer केवल-लेखन (सीक्रेट)
डिफ़ॉल्ट: 1
वार्मिंग शेड्यूल को दिन N (1..365) पर ले जाता है या रीसेट करता है।
├─ currentWarmingDay integer केवल-पठन
वार्मिंग शेड्यूल में वर्तमान सक्रिय दिन।
├─ currentWarmingPercent integer केवल-पठन
लक्ष्य प्रदाता कोटा का वर्तमान सक्रिय प्रतिशत।
├─ warmingDailyRampPercents integer[] वैकल्पिक
डिफ़ॉल्ट: [5,7,10,...,100]
वार्मिंग रैम्प के लिए दैनिक प्रतिशत ऐरे।
├─ maxDeferHours integer वैकल्पिक
डिफ़ॉल्ट: 48
DeferQueue पेसिंग के लिए घंटों में अधिकतम लुकअहेड विंडो।
├─ defaultCategory string वैकल्पिक
डिफ़ॉल्ट: transactional
API कॉल में छोड़े जाने पर फ़ॉलबैक श्रेणी।
Enum:"critical""transactional""notification""marketing"
├─ preset string केवल-लेखन (सीक्रेट)
एक-चरणीय प्रीसेट चयनकर्ता।
Enum:"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+
20 प्रॉपर्टी

वैकल्पिक आउटबाउंड प्रतिष्ठा सुरक्षा: स्वचालित बाउंस/शिकायत सप्रेशन सूची, RFC 8058 One-Click Unsubscribe, बाउंस सर्किट ब्रेकर, अनुकूली 421 ISP बैकऑफ़ और HMAC-SHA256 वेबहुक।

GET /api/admin/cli/objects/ReputationShield/singleton वर्तमान Reputation Shield कॉन्फ़िगरेशन प्राप्त करता है
PATCH /api/admin/cli/objects/ReputationShield/singleton सुरक्षा फ़्लैग अपडेट करता है या कोई प्रीसेट लागू करता है
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ preset string केवल-लेखन (सीक्रेट)
एक ही चरण में पूर्ण सुरक्षा प्रोफ़ाइल लागू करता है।
Enum:"off""recommended""strict_bulk"
├─ enableSuppressionPreCheck boolean वैकल्पिक
डिफ़ॉल्ट: false
भेजने से पहले सप्रेस किए गए पतों को फ़िल्टर करता है।
├─ enforceSuppressionOnSmtpRelay boolean वैकल्पिक
डिफ़ॉल्ट: false
SMTP सबमिशन पर भी सप्रेशन सूची लागू करता है।
├─ allSuppressedBehavior string वैकल्पिक
डिफ़ॉल्ट: reject_422
सभी प्राप्तकर्ताओं के सप्रेस होने पर प्रतिक्रिया मोड।
Enum:"reject_422""accept_noop"
├─ autoSuppressHardBounces boolean वैकल्पिक
डिफ़ॉल्ट: false
5xx स्थायी हार्ड बाउंस को स्वचालित रूप से सप्रेस करता है।
├─ hardBounceSuppressionDays integer वैकल्पिक
डिफ़ॉल्ट: 180
हार्ड-बाउंस सप्रेशन के लिए प्रतिधारण दिन।
├─ autoSuppressConsecutiveSoftBounces boolean वैकल्पिक
डिफ़ॉल्ट: false
बार-बार आने वाले 4xx सॉफ़्ट बाउंस को सप्रेशन सूची में बढ़ा देता है।
├─ softBounceEscalationThreshold integer वैकल्पिक
डिफ़ॉल्ट: 5
सप्रेशन से पहले लगातार सॉफ़्ट बाउंस।
├─ autoSuppressFblComplaints boolean वैकल्पिक
डिफ़ॉल्ट: false
इनबाउंड RFC 5965 ARF दुरुपयोग रिपोर्ट को स्वचालित रूप से पार्स करता है।
├─ enableOneClickUnsubscribe boolean वैकल्पिक
डिफ़ॉल्ट: false
DKIM-हस्ताक्षरित RFC 8058 List-Unsubscribe हेडर जोड़ता है।
├─ oneClickUnsubscribeCategories string[] वैकल्पिक
डिफ़ॉल्ट: ["marketing","notification"]
वे श्रेणियाँ जिन्हें RFC 8058 अनसब्सक्राइब हेडर मिलते हैं।
├─ enableBounceCircuitBreaker boolean वैकल्पिक
डिफ़ॉल्ट: false
यदि 24 घंटे की बाउंस/शिकायत दर अचानक बढ़ जाए, तो गैर-महत्वपूर्ण भेजना रोक देता है।
├─ maxHardBouncePercent number वैकल्पिक
डिफ़ॉल्ट: 5.0
प्रतिशत में 24 घंटे की हार्ड-बाउंस दर सीमा।
├─ maxComplaintPercent number वैकल्पिक
डिफ़ॉल्ट: 0.1
प्रतिशत में 24 घंटे की ARF शिकायत दर की ऊपरी सीमा।
├─ allowCriticalWhenTripped boolean वैकल्पिक
डिफ़ॉल्ट: true
सर्किट ब्रेकर ट्रिप होने पर भी महत्वपूर्ण 2FA मेल की अनुमति देता है।
├─ enableAdaptiveIspBackoff boolean वैकल्पिक
डिफ़ॉल्ट: false
जब रिमोट MX 421/451 थ्रॉटलिंग लौटाता है, तो स्वचालित कूलडाउन।
├─ ispCooldownMinutes integer वैकल्पिक
डिफ़ॉल्ट: 15
मिनटों में कूलडाउन अवधि।
├─ webhookEnabled boolean वैकल्पिक
डिफ़ॉल्ट: false
HMAC-SHA256 हस्ताक्षरित वेबहुक सक्षम करता है।
├─ webhookUrl string वैकल्पिक
वेबहुक के लिए गंतव्य HTTPS URL।
├─ webhookSecret string केवल-लेखन (सीक्रेट)
X-Nextxch-Signature के लिए HMAC-SHA256 सीक्रेट।
{
  "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+
15 प्रॉपर्टी

बहु-चरणीय इनबाउंड सुरक्षा: SPF/DKIM/DMARC/ARC सत्यापन, Smart Greylisting (/24 IPv4 & /64 IPv6), ऑनलाइन ML क्लासिफ़ायर (FTRL-Proximal), DNSBL ज़ोन, अनुमति/ब्लॉकलिस्ट और ClamAV TCP स्कैन।

GET /api/admin/cli/objects/SpamGuard/singleton SpamGuard थ्रेशोल्ड & प्रशिक्षण काउंटर प्राप्त करता है
PATCH /api/admin/cli/objects/SpamGuard/singleton स्कोर, DNSBL, अनुमति सूचियाँ या ClamAV को वहीं अपडेट करता है
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ enableEmailAuthChecks boolean वैकल्पिक
डिफ़ॉल्ट: true
इनबाउंड SPF, DKIM, DMARC और ARC सत्यापित करता है।
├─ enableGreylisting boolean वैकल्पिक
डिफ़ॉल्ट: true
अज्ञात प्रथम-बार प्रेषकों के लिए अनुकूली Smart Greylisting।
├─ greylistRetryDelaySeconds integer वैकल्पिक
डिफ़ॉल्ट: 240
सेकंड में न्यूनतम पुनः प्रयास विलंब (डिफ़ॉल्ट: 240s)।
├─ junkScoreThreshold number वैकल्पिक
डिफ़ॉल्ट: 4.5
Junk फ़ोल्डर में रखने के लिए स्कोर थ्रेशोल्ड।
├─ rejectScoreThreshold number वैकल्पिक
डिफ़ॉल्ट: 9.0
कठोर SMTP 550 अस्वीकृति के लिए स्कोर सीमा।
├─ tagSubjectOnJunk boolean वैकल्पिक
डिफ़ॉल्ट: false
स्पैम संदेशों के विषय में उपसर्ग जोड़ें।
├─ subjectTagPrefix string वैकल्पिक
डिफ़ॉल्ट: "[SPAM] "
विषय उपसर्ग स्ट्रिंग।
├─ enableStructuralHeuristics boolean वैकल्पिक
डिफ़ॉल्ट: true
MIME/HTML संरचनात्मक ह्यूरिस्टिक्स का मूल्यांकन करता है।
├─ dnsblZones string[] वैकल्पिक
डिफ़ॉल्ट: ["bl.spamcop.net","ix.dnsbl.manitu.net"]
क्वेरी किए गए DNSBL ज़ोन।
├─ dnsblHitScore number वैकल्पिक
डिफ़ॉल्ट: 3.5
प्रति DNSBL हिट जोड़ा जाने वाला स्कोर।
├─ allowedSendersOrDomains string[] वैकल्पिक
डिफ़ॉल्ट: []
स्पष्ट प्रेषक ईमेल या डोमेन अनुमति सूची।
├─ blockedSendersOrDomains string[] वैकल्पिक
डिफ़ॉल्ट: []
स्पष्ट प्रेषक ईमेल या डोमेन ब्लॉकलिस्ट।
├─ clamAvEnabled boolean वैकल्पिक
डिफ़ॉल्ट: false
ClamAV डेमन TCP INSTREAM स्कैनिंग सक्षम करता है।
├─ clamAvHost string वैकल्पिक
डिफ़ॉल्ट: "127.0.0.1"
ClamAV daemon होस्ट या IP।
├─ clamAvPort integer वैकल्पिक
डिफ़ॉल्ट: 3310
ClamAV डेमन TCP पोर्ट।
{
  "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+
19 गुण

आउटबाउंड MX डिलीवरी कतार, वर्कर समवर्तिता, पुनः प्रयास अंतराल, ISP थ्रॉटलिंग, आउटबाउंड TLS सत्यापन, वैश्विक स्मार्ट-होस्ट और इनबाउंड ESMTP सीमाओं को नियंत्रित करता है।

GET /api/admin/cli/objects/SmtpQueue/singleton सभी कतार, TLS और ESMTP सेटिंग्स प्राप्त करता है
PATCH /api/admin/cli/objects/SmtpQueue/singleton कतार वर्कर, पुनः प्रयास शेड्यूल या ESMTP सीमाएँ 0 ms में अपडेट करता है
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ outboundQueuePaused boolean वैकल्पिक
डिफ़ॉल्ट: false
मेल स्वीकार करना जारी रखते हुए आउटबाउंड MX डिलीवरी रोकता है।
├─ outboundWorkerConcurrency integer वैकल्पिक
डिफ़ॉल्ट: 8
समानांतर आउटबाउंड डिलीवरी वर्करों की संख्या।
├─ maxDeliveryAttempts integer वैकल्पिक
डिफ़ॉल्ट: 10
स्थायी बाउंस से पहले अधिकतम डिलीवरी प्रयास।
├─ retryScheduleMinutes integer[] वैकल्पिक
डिफ़ॉल्ट: [5,15,60,240,720]
मिनटों में पुनः प्रयास बैकऑफ़ शेड्यूल।
├─ maxConcurrentConnectionsPerMxDomain integer वैकल्पिक
डिफ़ॉल्ट: 4
प्रति गंतव्य MX डोमेन अधिकतम समवर्ती कनेक्शन।
├─ strictThrottleDomains string[] वैकल्पिक
डिफ़ॉल्ट: ["t-online.de","gmx.de","web.de","yahoo.com"]
सख्त समवर्तीता थ्रॉटलिंग के अधीन डोमेन।
├─ strictThrottleMaxConcurrency integer वैकल्पिक
डिफ़ॉल्ट: 2
strictThrottleDomains के लिए अधिकतम समवर्ती कनेक्शन।
├─ outboundConnectTimeoutSeconds integer वैकल्पिक
डिफ़ॉल्ट: 30
आउटबाउंड TCP/TLS कनेक्ट टाइमआउट, सेकंड में।
├─ outboundBindAddress string वैकल्पिक
डिफ़ॉल्ट: "" (Auto)
वैकल्पिक स्थानीय स्रोत IP बाइंड पता।
├─ outboundUseStartTls boolean वैकल्पिक
डिफ़ॉल्ट: true
आउटबाउंड MX कनेक्शन पर STARTTLS का उपयोग करें।
├─ requireOutboundTls boolean वैकल्पिक
डिफ़ॉल्ट: false
यदि रिमोट MX TLS प्रदान नहीं करता है तो डिलीवरी रद्द करें।
├─ outboundTlsCertValidation string वैकल्पिक
डिफ़ॉल्ट: Opportunistic
वैश्विक आउटबाउंड X.509 प्रमाणपत्र सत्यापन मोड।
Enum:"Opportunistic""IgnoreErrors""Strict"
├─ outboundSmartHost string वैकल्पिक
डिफ़ॉल्ट: ""
वैकल्पिक वैश्विक अपस्ट्रीम रिले होस्ट।
├─ outboundSmartPort integer वैकल्पिक
डिफ़ॉल्ट: 587
वैश्विक स्मार्ट-होस्ट TCP पोर्ट।
├─ maxMessageSizeMb long वैकल्पिक
डिफ़ॉल्ट: 50
MiB में वैश्विक ESMTP SIZE सीमा।
├─ maxRecipientsPerTransaction integer वैकल्पिक
डिफ़ॉल्ट: 100
प्रति ट्रांज़ैक्शन अधिकतम RCPT TO कमांड।
├─ maxConnectionsPerIp integer वैकल्पिक
डिफ़ॉल्ट: 20
प्रति IP अधिकतम एक साथ इनबाउंड कनेक्शन।
├─ tarpitDelayMs integer वैकल्पिक
डिफ़ॉल्ट: 1500
ऑथ/कमांड त्रुटियों पर ms में टारपिट विलंब।
├─ requireTlsForAuth boolean वैकल्पिक
डिफ़ॉल्ट: true
SMTP AUTH की अनुमति देने से पहले TLS एन्क्रिप्शन आवश्यक है।
{
  "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+
11 प्रॉपर्टी

संगठन-व्यापी कानूनी अस्वीकरण (DKIM हस्ताक्षर से पहले डाला जाता है), वैश्विक इनबाउंड Sieve स्क्रिप्ट, Fail2Ban ऑटो-बैन सीमाएँ और मानक ServerHostName।

GET /api/admin/cli/objects/TransportRules/singleton अस्वीकरण, वैश्विक Sieve और ऑटो-बैन सेटिंग्स प्राप्त करता है
PATCH /api/admin/cli/objects/TransportRules/singleton ट्रांसपोर्ट नियमों को उसी स्थान पर अपडेट करता है
GET /api/admin/cli/objects/Server/singleton ServerHostName, स्टोरेज इंजन, कतार की गहराई और लाइसेंस स्थिति प्राप्त करता है
PATCH /api/admin/cli/objects/Server/singleton मानक ServerHostName को 0 ms में अपडेट करता है
{ } ऑब्जेक्ट स्कीमा और टाइप की गई प्रॉपर्टी application/json · camelCase
├─ outboundDisclaimerEnabled boolean वैकल्पिक
डिफ़ॉल्ट: false
आउटबाउंड संदेशों में अनिवार्य कॉर्पोरेट फ़ुटर जोड़ता है।
├─ outboundDisclaimerExternalOnly boolean वैकल्पिक
डिफ़ॉल्ट: true
केवल बाहरी डोमेन पर भेजते समय फ़ुटर जोड़ें।
├─ outboundDisclaimerText string वैकल्पिक
डिफ़ॉल्ट: ""
सादा-पाठ कानूनी फ़ुटर।
├─ outboundDisclaimerHtml string वैकल्पिक
डिफ़ॉल्ट: ""
HTML कानूनी फ़ुटर।
├─ inboundSystemSieve string वैकल्पिक
डिफ़ॉल्ट: ""
उपयोगकर्ता स्क्रिप्ट से पहले निष्पादित वैश्विक RFC 5228 Sieve स्क्रिप्ट।
├─ autoBanThreshold integer वैकल्पिक
डिफ़ॉल्ट: 8
स्वचालित IP प्रतिबंध से पहले विफल लॉगिन।
├─ autoBanDurationMinutes integer वैकल्पिक
डिफ़ॉल्ट: 30
मिनटों में स्वचालित IP प्रतिबंध अवधि।
├─ serverHostName string वैकल्पिक
डिफ़ॉल्ट: mail.<domain>
मानक EHLO, TLS और Autodiscover FQDN (ऑब्जेक्ट: Server)।
├─ storageProvider string केवल-पठन
डिफ़ॉल्ट: Sqlite | SqlServer | Postgres
सक्रिय स्टोरेज इंजन (Object: Server)।
├─ activeQueueCount integer केवल-पठन
डिफ़ॉल्ट: 0
वर्तमान आउटबाउंड कतार संख्या (ऑब्जेक्ट: Server)।
├─ licenseState string केवल-पठन
डिफ़ॉल्ट: EnterpriseActive
लाइसेंस स्थिति (ऑब्जेक्ट: Server)।
{
  "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> &middot; 70565 Stuttgart &middot; 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")}");