Mandantenverwaltung
Erstellen, auflisten, abrufen und aktualisieren Sie Mandanten auf der mindzieStudio-Plattform.
WICHTIG: Alle Endpunkte auf dieser Seite erfordern einen Globalen API-Schlüssel. Mandantenspezifische API-Schlüssel erhalten einen 401 Unauthorized-Fehler.
Alle Mandanten auflisten
GET /api/tenant
Gibt eine paginierte Liste aller Mandanten im System mit Zusammenfassungsstatistiken zurück.
Abfrageparameter
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
page |
Ganzzahl | 1 | Seitenzahl für die Paginierung |
pageSize |
Ganzzahl | 50 | Anzahl der Elemente pro Seite (max.: 100) |
Antwort (200 OK)
{
"tenants": [
{
"tenantId": "12345678-1234-1234-1234-123456789012",
"name": "acme-corp",
"displayName": "Acme Corporation",
"description": "Hauptmandant für Acme Corporation",
"caseCount": 50000,
"maxUserCount": 100,
"maxAnalystCount": 20,
"analystCount": 12,
"userCount": 45,
"preRelease": false,
"isAcademic": false,
"autoload": true,
"dateCreated": "2024-01-15T10:30:00Z",
"isDisabled": false
}
],
"totalCount": 5,
"page": 1,
"pageSize": 50
}
Felder des Mandantenobjekts
| Feld | Typ | Beschreibung |
|---|---|---|
tenantId |
GUID | Eindeutige Identifikationsnummer des Mandanten |
name |
string | Eindeutiger Systemname (wird in URLs verwendet) |
displayName |
string | Menschenlesbarer Anzeigename |
description |
string | Beschreibung des Mandanten |
caseCount |
Ganzzahl | Gesamtanzahl der Fälle über alle Datensätze |
maxUserCount |
Ganzzahl | Maximal erlaubte Benutzeranzahl |
maxAnalystCount |
Ganzzahl | Maximal erlaubte Analystenzahl |
analystCount |
Ganzzahl | Aktuelle Anzahl der Analysten |
userCount |
Ganzzahl | Aktuelle Anzahl der Benutzer |
preRelease |
boolean | Ob der Mandant Vorab-Funktionen hat |
isAcademic |
boolean | Ob es sich um einen akademischen Mandanten handelt |
autoload |
boolean | Ob Projekte automatisch geladen werden sollen |
dateCreated |
datetime | Zeitpunkt der Erstellung des Mandanten |
isDisabled |
boolean | Ob der Mandant deaktiviert ist |
Fehlerantworten
Unauthorized (401):
{
"error": "Dieser Endpunkt erfordert einen Globalen API-Schlüssel. Mandantenspezifische API-Schlüssel können nicht alle Mandanten auflisten.",
"hint": "Globale API-Schlüssel können unter /admin/global-api-keys erstellt werden"
}
Mandanten nach ID abrufen
GET /api/tenant/{tenantId}
Gibt detaillierte Informationen für einen bestimmten Mandanten anhand seiner ID zurück.
Pfadparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
tenantId |
GUID | Ja | Die eindeutige Identifikationsnummer des Mandanten |
Antwort (200 OK)
{
"tenantId": "12345678-1234-1234-1234-123456789012",
"name": "acme-corp",
"displayName": "Acme Corporation",
"description": "Hauptmandant für Acme Corporation",
"isAcademic": false,
"preRelease": false,
"maxUserCount": 100,
"maxAnalystCount": 20,
"maxCases": 100000,
"dateCreated": "2024-01-15T10:30:00Z",
"isDisabled": false
}
Fehlerantworten
Not Found (404):
{
"error": "Mandant mit der ID '12345678-1234-1234-1234-123456789012' wurde nicht gefunden"
}
Mandanten erstellen
POST /api/tenant
Erstellt einen neuen Mandanten im System mit aller notwendigen Infrastruktur.
Anfragekörper
{
"name": "new-tenant",
"displayName": "New Tenant Corp",
"description": "Beschreibung des neuen Mandanten",
"maxUsers": 50,
"maxAnalyst": 10,
"maxCases": 100000,
"timeZone": "America/New_York"
}
Anfragefelder
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name |
string | Ja | Eindeutiger Systemname (3-63 Zeichen, Kleinbuchstaben, Zahlen und Bindestriche) |
displayName |
string | Ja | Menschenlesbarer Anzeigename |
description |
string | Nein | Beschreibung des Mandanten |
maxUsers |
Ganzzahl | Ja | Maximale Anzahl von Benutzern |
maxAnalyst |
Ganzzahl | Ja | Maximale Anzahl von Analysten |
maxCases |
Ganzzahl | Ja | Maximale Anzahl von Fällen |
timeZone |
string | Nein | Zeitzone des Mandanten |
Anforderungen an den Mandantennamen
- 3–63 Zeichen
- Nur Kleinbuchstaben, Zahlen und Bindestriche
- Keine Leerzeichen oder Sonderzeichen
- Muss mandantenübergreifend eindeutig sein
Antwort (201 Created)
{
"tenantId": "aabbccdd-1234-1234-1234-123456789012",
"name": "new-tenant",
"displayName": "New Tenant Corp",
"message": "Mandant 'New Tenant Corp' erfolgreich erstellt",
"storageContainerCreated": true
}
Fehlerantworten
Conflict (409):
{
"error": "Ein Mandant mit dem Namen 'new-tenant' existiert bereits"
}
Lizenzlimit (429):
{
"error": "Maximale Anzahl von Mandanten erreicht. Ihre Lizenz erlaubt 10 Mandanten.",
"hint": "Erweitern Sie Ihre Lizenz, um mehr Mandanten zu erstellen"
}
Validierungsfehler (400):
{
"error": "Validierung fehlgeschlagen",
"validationErrors": [
"Name muss zwischen 3 und 63 Zeichen lang sein",
"Name darf nur Kleinbuchstaben, Zahlen und Bindestriche enthalten"
]
}
Mandanten aktualisieren
PUT /api/tenant
Aktualisiert die Eigenschaften eines vorhandenen Mandanten. Es werden nur angegebene Felder aktualisiert; Nullwerte werden ignoriert.
Anfragekörper
{
"tenantId": "12345678-1234-1234-1234-123456789012",
"displayName": "Acme Corporation Aktualisiert",
"description": "Aktualisierte Beschreibung",
"maxUsers": 100,
"maxAnalyst": 25,
"maxCases": 200000,
"timeZone": "America/New_York",
"isAcademic": false,
"preRelease": true,
"isDisabled": false
}
Anfragefelder
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
tenantId |
GUID | Ja | Zu aktualisierender Mandant |
displayName |
string | Nein | Neuer Anzeigename (null = keine Änderung) |
description |
string | Nein | Neue Beschreibung (null = keine Änderung, "" = löschen) |
maxUsers |
Ganzzahl | Nein | Maximale Benutzer (null = keine Änderung) |
maxAnalyst |
Ganzzahl | Nein | Maximale Analysten (null = keine Änderung) |
maxCases |
Ganzzahl | Nein | Maximale Fälle (null = keine Änderung, -1 = unbegrenzt) |
timeZone |
string | Nein | Zeitzonen-ID (null = keine Änderung) |
isAcademic |
boolean | Nein | Akademisches Flag (null = keine Änderung) |
preRelease |
boolean | Nein | Vorab-Funktionen (null = keine Änderung) |
isDisabled |
boolean | Nein | Mandant deaktivieren (null = keine Änderung) |
Hinweis: Der Mandantenname name kann nach der Erstellung nicht geändert werden.
Antwort (200 OK)
{
"tenantId": "12345678-1234-1234-1234-123456789012",
"name": "acme-corp",
"displayName": "Acme Corporation Aktualisiert",
"message": "Mandant 'acme-corp' erfolgreich aktualisiert",
"isDisabled": false
}
Fehlerantworten
Not Found (404):
{
"error": "Mandant mit der ID '12345678-1234-1234-1234-123456789012' wurde nicht gefunden"
}
Validierungsfehler (400):
{
"error": "Validierung fehlgeschlagen",
"validationErrors": ["Anzeigename darf 255 Zeichen nicht überschreiten"]
}
Implementierungsbeispiele
cURL
# Alle Mandanten auflisten
curl -X GET "https://your-mindzie-instance.com/api/tenant?page=1&pageSize=50" \
-H "Authorization: Bearer YOUR_GLOBAL_API_KEY"
# Bestimmten Mandanten per ID abrufen
curl -X GET "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012" \
-H "Authorization: Bearer YOUR_GLOBAL_API_KEY"
# Mandanten erstellen
curl -X POST "https://your-mindzie-instance.com/api/tenant" \
-H "Authorization: Bearer YOUR_GLOBAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "new-tenant",
"displayName": "New Tenant Corp",
"description": "Test mandant",
"maxUsers": 50,
"maxAnalyst": 10,
"maxCases": 100000
}'
# Mandanten aktualisieren
curl -X PUT "https://your-mindzie-instance.com/api/tenant" \
-H "Authorization: Bearer YOUR_GLOBAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tenantId": "12345678-1234-1234-1234-123456789012",
"displayName": "New Tenant Corp Aktualisiert",
"maxUsers": 100,
"isDisabled": false
}'
Python
import requests
BASE_URL = 'https://your-mindzie-instance.com'
class TenantManager:
def __init__(self, global_api_key):
"""Initialisiert mit einem GLOBALEN API-Schlüssel (nicht mandantenspezifisch)."""
self.headers = {
'Authorization': f'Bearer {global_api_key}',
'Content-Type': 'application/json'
}
def list_tenants(self, page=1, page_size=50):
"""Listet alle Mandanten im System auf."""
url = f'{BASE_URL}/api/tenant'
params = {'page': page, 'pageSize': page_size}
response = requests.get(url, headers=self.headers, params=params)
response.raise_for_status()
return response.json()
def get_tenant(self, tenant_id):
"""Holt einen spezifischen Mandanten per ID."""
url = f'{BASE_URL}/api/tenant/{tenant_id}'
response = requests.get(url, headers=self.headers)
response.raise_for_status()
return response.json()
def create_tenant(self, name, display_name, description='', max_users=50,
max_analyst=10, max_cases=100000, timezone=None):
"""Erstellt einen neuen Mandanten."""
url = f'{BASE_URL}/api/tenant'
payload = {
'name': name,
'displayName': display_name,
'description': description,
'maxUsers': max_users,
'maxAnalyst': max_analyst,
'maxCases': max_cases
}
if timezone:
payload['timeZone'] = timezone
response = requests.post(url, json=payload, headers=self.headers)
response.raise_for_status()
return response.json()
def update_tenant(self, tenant_id, display_name=None, description=None,
max_users=None, max_analyst=None, is_disabled=None):
"""Aktualisiert einen bestehenden Mandanten."""
url = f'{BASE_URL}/api/tenant'
payload = {'tenantId': tenant_id}
if display_name is not None:
payload['displayName'] = display_name
if description is not None:
payload['description'] = description
if max_users is not None:
payload['maxUsers'] = max_users
if max_analyst is not None:
payload['maxAnalyst'] = max_analyst
if is_disabled is not None:
payload['isDisabled'] = is_disabled
response = requests.put(url, json=payload, headers=self.headers)
response.raise_for_status()
return response.json()
# Verwendung
manager = TenantManager('your-global-api-key')
# Alle Mandanten auflisten
result = manager.list_tenants()
print(f"Gesamtzahl der Mandanten: {result['totalCount']}")
for tenant in result['tenants']:
print(f"- {tenant['displayName']} ({tenant['name']})")
print(f" Benutzer: {tenant['userCount']}/{tenant['maxUserCount']}")
# Neuen Mandanten erstellen
new_tenant = manager.create_tenant(
name='test-tenant',
display_name='Test Mandant',
description='Per API erstellt',
max_users=25,
max_analyst=5,
max_cases=50000
)
print(f"Mandant erstellt: {new_tenant['tenantId']}")
# Mandantenlimits aktualisieren
manager.update_tenant(
tenant_id=new_tenant['tenantId'],
max_users=50,
max_analyst=10
)
print("Mandantenlimits aktualisiert")
JavaScript
const BASE_URL = 'https://your-mindzie-instance.com';
class TenantManager {
constructor(globalApiKey) {
this.headers = {
'Authorization': `Bearer ${globalApiKey}`,
'Content-Type': 'application/json'
};
}
async listTenants(page = 1, pageSize = 50) {
const url = `${BASE_URL}/api/tenant?page=${page}&pageSize=${pageSize}`;
const response = await fetch(url, { headers: this.headers });
if (!response.ok) throw new Error(`Fehler: ${response.status}`);
return await response.json();
}
async getTenant(tenantId) {
const url = `${BASE_URL}/api/tenant/${tenantId}`;
const response = await fetch(url, { headers: this.headers });
if (!response.ok) throw new Error(`Fehler: ${response.status}`);
return await response.json();
}
async createTenant(config) {
const url = `${BASE_URL}/api/tenant`;
const response = await fetch(url, {
method: 'POST',
headers: this.headers,
body: JSON.stringify(config)
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error || `Fehler: ${response.status}`);
}
return await response.json();
}
async updateTenant(tenantId, updates) {
const url = `${BASE_URL}/api/tenant`;
const response = await fetch(url, {
method: 'PUT',
headers: this.headers,
body: JSON.stringify({ tenantId, ...updates })
});
if (!response.ok) throw new Error(`Fehler: ${response.status}`);
return await response.json();
}
}
// Verwendung
const manager = new TenantManager('your-global-api-key');
// Mandanten auflisten
const tenants = await manager.listTenants();
console.log(`Gefundene Mandanten: ${tenants.totalCount}`);
// Mandanten erstellen
const newTenant = await manager.createTenant({
name: 'new-tenant',
displayName: 'Neuer Mandant',
maxUsers: 50,
maxAnalyst: 10,
maxCases: 100000
});
console.log(`Erstellt: ${newTenant.tenantId}`);
// Mandanten aktualisieren
await manager.updateTenant(newTenant.tenantId, {
displayName: 'Aktualisierter Mandantenname',
maxUsers: 100
});
Best Practices
- Globale API-Schlüssel: Verwenden Sie nur globale API-Schlüssel für die Mandantenverwaltung - sie besitzen weitreichende systemweite Berechtigungen
- Lizenzüberwachung: Überwachen Sie die Anzahl der Mandanten im Verhältnis zu den Lizenzbeschränkungen, bevor Sie neue Mandanten erstellen
- Kapazitätsplanung: Legen Sie angemessene Benutzer- und Analystenlimits basierend auf der erwarteten Nutzung fest
- Namenskonventionen: Verwenden Sie konsistente, klein geschriebene Namen mit Bindestrichen für Mandantennamen