Tenantbeheer
Maak, lijst, haal op en werk tenants bij in het mindzieStudio-platform.
BELANGRIJK: Alle endpoints op deze pagina vereisen een Global API Key. Tenant-specifieke API-sleutels krijgen een 401 Unauthorized-fout.
Alle tenants weergeven
GET /api/tenant
Haalt een gepagineerde lijst op van alle tenants in het systeem met samenvattende statistieken.
Query Parameters
| Parameter | Type | Standaard | Beschrijving |
|---|---|---|---|
page |
integer | 1 | Paginanummer voor paginering |
pageSize |
integer | 50 | Aantal items per pagina (max: 100) |
Response (200 OK)
{
"tenants": [
{
"tenantId": "12345678-1234-1234-1234-123456789012",
"name": "acme-corp",
"displayName": "Acme Corporation",
"description": "Hoofdtenant voor 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
}
Tenant Object Velden
| Veld | Type | Beschrijving |
|---|---|---|
tenantId |
GUID | Unieke identifier voor de tenant |
name |
string | Unieke systeemnaam (gebruikt in URL's) |
displayName |
string | Menselijk leesbare weergavenaam |
description |
string | Beschrijving van de tenant |
caseCount |
integer | Totaal aantal cases over alle datasets |
maxUserCount |
integer | Maximaal toegestane gebruikers |
maxAnalystCount |
integer | Maximaal toegestane analisten |
analystCount |
integer | Huidig aantal analisten |
userCount |
integer | Huidig aantal gebruikers |
preRelease |
boolean | Of de tenant pre-release functies heeft |
isAcademic |
boolean | Of dit een academische tenant is |
autoload |
boolean | Of projecten automatisch geladen worden |
dateCreated |
datetime | Wanneer de tenant is aangemaakt |
isDisabled |
boolean | Of de tenant is uitgeschakeld |
Foutantwoorden
Unauthorized (401):
{
"error": "Dit endpoint vereist een Global API key. Tenant-specifieke API keys kunnen niet alle tenants weergeven.",
"hint": "Global API keys kunnen worden aangemaakt via /admin/global-api-keys"
}
Tenant ophalen op ID
GET /api/tenant/{tenantId}
Haalt gedetailleerde informatie op voor een specifieke tenant via zijn ID.
Path Parameters
| Parameter | Type | Verplicht | Beschrijving |
|---|---|---|---|
tenantId |
GUID | Ja | De unieke identifier van de tenant |
Response (200 OK)
{
"tenantId": "12345678-1234-1234-1234-123456789012",
"name": "acme-corp",
"displayName": "Acme Corporation",
"description": "Hoofdtenant voor Acme Corporation",
"isAcademic": false,
"preRelease": false,
"maxUserCount": 100,
"maxAnalystCount": 20,
"maxCases": 100000,
"dateCreated": "2024-01-15T10:30:00Z",
"isDisabled": false
}
Foutantwoorden
Not Found (404):
{
"error": "Tenant met ID '12345678-1234-1234-1234-123456789012' niet gevonden"
}
Tenant aanmaken
POST /api/tenant
Maakt een nieuwe tenant aan in het systeem met alle benodigde infrastructuur.
Request Body
{
"name": "new-tenant",
"displayName": "New Tenant Corp",
"description": "Beschrijving van de nieuwe tenant",
"maxUsers": 50,
"maxAnalyst": 10,
"maxCases": 100000,
"timeZone": "America/New_York"
}
Request Velden
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
name |
string | Ja | Unieke systeemnaam (3-63 tekens, kleine letters, cijfers en koppeltekens) |
displayName |
string | Ja | Menselijk leesbare weergavenaam |
description |
string | Nee | Beschrijving van de tenant |
maxUsers |
integer | Ja | Maximaal aantal gebruikers |
maxAnalyst |
integer | Ja | Maximaal aantal analisten |
maxCases |
integer | Ja | Maximaal aantal cases |
timeZone |
string | Nee | Tijdzone voor de tenant |
Naamvereisten voor Tenant
- 3-63 tekens
- Alleen kleine letters, cijfers en koppeltekens
- Geen spaties of speciale tekens
- Moet uniek zijn over alle tenants
Response (201 Created)
{
"tenantId": "aabbccdd-1234-1234-1234-123456789012",
"name": "new-tenant",
"displayName": "New Tenant Corp",
"message": "Tenant 'New Tenant Corp' succesvol aangemaakt",
"storageContainerCreated": true
}
Foutantwoorden
Conflict (409):
{
"error": "Een tenant met de naam 'new-tenant' bestaat al"
}
License Limit (429):
{
"error": "Maximum aantal tenants bereikt. Uw licentie staat 10 tenants toe.",
"hint": "Upgrade uw licentie om meer tenants aan te maken"
}
Validatiefout (400):
{
"error": "Validatie mislukt",
"validationErrors": [
"Naam moet tussen 3 en 63 tekens lang zijn",
"Naam mag alleen kleine letters, cijfers en koppeltekens bevatten"
]
}
Tenant bijwerken
PUT /api/tenant
Werk de eigenschappen van een bestaande tenant bij. Alleen opgegeven velden worden bijgewerkt; null-waarden worden genegeerd.
Request Body
{
"tenantId": "12345678-1234-1234-1234-123456789012",
"displayName": "Acme Corporation Bijgewerkt",
"description": "Bijgewerkte beschrijving",
"maxUsers": 100,
"maxAnalyst": 25,
"maxCases": 200000,
"timeZone": "America/New_York",
"isAcademic": false,
"preRelease": true,
"isDisabled": false
}
Request Velden
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
tenantId |
GUID | Ja | De tenant die bijgewerkt wordt |
displayName |
string | Nee | Nieuwe weergavenaam (null = geen wijziging) |
description |
string | Nee | Nieuwe beschrijving (null = geen wijziging, "" = leegmaken) |
maxUsers |
integer | Nee | Maximaal aantal gebruikers (null = geen wijziging) |
maxAnalyst |
integer | Nee | Maximaal aantal analisten (null = geen wijziging) |
maxCases |
integer | Nee | Maximaal aantal cases (null = geen wijziging, -1 = onbeperkt) |
timeZone |
string | Nee | Tijdzone-ID (null = geen wijziging) |
isAcademic |
boolean | Nee | Academische vlag (null = geen wijziging) |
preRelease |
boolean | Nee | Pre-release functies (null = geen wijziging) |
isDisabled |
boolean | Nee | Tenant uitschakelen (null = geen wijziging) |
Opmerking: De tenant name kan na aanmaak niet worden gewijzigd.
Response (200 OK)
{
"tenantId": "12345678-1234-1234-1234-123456789012",
"name": "acme-corp",
"displayName": "Acme Corporation Bijgewerkt",
"message": "Tenant 'acme-corp' succesvol bijgewerkt",
"isDisabled": false
}
Foutantwoorden
Not Found (404):
{
"error": "Tenant met ID '12345678-1234-1234-1234-123456789012' niet gevonden"
}
Validatiefout (400):
{
"error": "Validatie mislukt",
"validationErrors": ["Weergavenaam mag niet langer zijn dan 255 tekens"]
}
Implementatie Voorbeelden
cURL
# Alle tenants weergeven
curl -X GET "https://your-mindzie-instance.com/api/tenant?page=1&pageSize=50" \
-H "Authorization: Bearer YOUR_GLOBAL_API_KEY"
# Specifieke tenant ophalen op ID
curl -X GET "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012" \
-H "Authorization: Bearer YOUR_GLOBAL_API_KEY"
# Tenant aanmaken
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 tenant",
"maxUsers": 50,
"maxAnalyst": 10,
"maxCases": 100000
}'
# Tenant bijwerken
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 Updated",
"maxUsers": 100,
"isDisabled": false
}'
Python
import requests
BASE_URL = 'https://your-mindzie-instance.com'
class TenantManager:
def __init__(self, global_api_key):
"""Initialiseer met een GLOBAL API key (niet tenant-specifiek)."""
self.headers = {
'Authorization': f'Bearer {global_api_key}',
'Content-Type': 'application/json'
}
def list_tenants(self, page=1, page_size=50):
"""Lijst van alle tenants in het systeem."""
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):
"""Haal een specifieke tenant op via 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):
"""Maak een nieuwe tenant aan."""
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):
"""Werk een bestaande tenant bij."""
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()
# Gebruik
manager = TenantManager('your-global-api-key')
# Alle tenants weergeven
result = manager.list_tenants()
print(f"Totaal aantal tenants: {result['totalCount']}")
for tenant in result['tenants']:
print(f"- {tenant['displayName']} ({tenant['name']})")
print(f" Gebruikers: {tenant['userCount']}/{tenant['maxUserCount']}")
# Nieuwe tenant aanmaken
new_tenant = manager.create_tenant(
name='test-tenant',
display_name='Test Tenant',
description='Aangemaakt via API',
max_users=25,
max_analyst=5,
max_cases=50000
)
print(f"Tenant aangemaakt: {new_tenant['tenantId']}")
# Tenant limieten bijwerken
manager.update_tenant(
tenant_id=new_tenant['tenantId'],
max_users=50,
max_analyst=10
)
print("Tenant limieten bijgewerkt")
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(`Mislukt: ${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(`Mislukt: ${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 || `Mislukt: ${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(`Mislukt: ${response.status}`);
return await response.json();
}
}
// Gebruik
const manager = new TenantManager('your-global-api-key');
// Tenants weergeven
const tenants = await manager.listTenants();
console.log(`Aantal gevonden tenants: ${tenants.totalCount}`);
// Tenant aanmaken
const newTenant = await manager.createTenant({
name: 'new-tenant',
displayName: 'Nieuwe Tenant',
maxUsers: 50,
maxAnalyst: 10,
maxCases: 100000
});
console.log(`Aangemaakt: ${newTenant.tenantId}`);
// Tenant bijwerken
await manager.updateTenant(newTenant.tenantId, {
displayName: 'Bijgewerkte Tenant Naam',
maxUsers: 100
});
Beste Praktijken
- Global API Keys: Gebruik alleen global API keys voor tenantbeheer - deze hebben significante systeem-brede bevoegdheden
- Licentie Bewustzijn: Houd het aantal tenants in de gaten ten opzichte van licentiebeperkingen voordat u nieuwe tenants aanmaakt
- Capaciteitsplanning: Stel passende limieten in voor gebruikers en analisten op basis van verwachte gebruik
- Naamgevingsconventies: Gebruik consistente, kleine letters met koppeltekens voor tenantnamen