API-Authentifizierung¶
Die enconf REST-API ermöglicht den programmatischen Zugriff auf alle Hosting-Funktionen. Diese Seite beschreibt die verfügbaren Authentifizierungsmethoden, das Token-Format und die Ratenbegrenzung.
Basis-URL¶
Alle API-Endpunkte sind unter folgender Basis-URL erreichbar:
Port 3443
Das Panel läuft standardmäßig auf Port 3443. Die API ist über denselben Port erreichbar.
Interaktive API-Dokumentation¶
Eine vollständige, interaktive API-Referenz mit allen Endpunkten, Parametern und Beispiel-Responses ist direkt in Ihrem Panel verfügbar:
Dort können Sie alle API-Aufrufe direkt im Browser testen (Swagger UI). Authentifizieren Sie sich über den Authorize-Button mit Ihrem API-Key oder JWT-Token.
Für WHMCS / HostBill Entwickler
Die OpenAPI-Spezifikation (YAML) ist unter https://ihr-panel.de:3443/api/docs/openapi.yaml abrufbar und kann direkt in Ihre Entwicklungsumgebung importiert werden.
Authentifizierungsmethoden¶
Die API unterstützt zwei Authentifizierungsmethoden:
| Methode | Anwendungsfall | Gültigkeit |
|---|---|---|
| JWT-Token | Interaktive Nutzung, Frontend | Konfigurierbar (Standard: 24 Stunden) |
| API-Schlüssel | Automatisierung, Skripte, Integrationen | Bis Ablaufdatum oder manuelles Löschen |
JWT-Token (Login)¶
Für die interaktive Nutzung authentifizieren Sie sich per E-Mail und Passwort und erhalten ein JWT-Token.
Login-Anfrage¶
POST /api/v1/auth/login
Content-Type: application/json
{
"email": "kunde@beispiel.de",
"password": "IhrPasswort"
}
Erfolgreiche Antwort¶
{
"data": {
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": 42,
"email": "kunde@beispiel.de",
"name": "Max Mustermann",
"role": "customer"
}
},
"error": null,
"message": "Login successful"
}
Login mit 2FA¶
Wenn Zwei-Faktor-Authentifizierung aktiviert ist, erfordert der Login zusätzlich einen TOTP-Code:
POST /api/v1/auth/login
Content-Type: application/json
{
"email": "kunde@beispiel.de",
"password": "IhrPasswort",
"totp_code": "123456"
}
Falls der TOTP-Code fehlt und 2FA aktiviert ist, antwortet die API mit:
Token verwenden¶
Senden Sie das Token im Authorization-Header bei allen folgenden Anfragen:
Token-Gültigkeit¶
| Einstellung | Standardwert |
|---|---|
| Gültigkeitsdauer | 24 Stunden (konfigurierbar durch Admin) |
| Algorithmus | HS256 (HMAC-SHA256) |
Nach Ablauf des Tokens müssen Sie sich erneut anmelden.
API-Schlüssel¶
API-Schlüssel sind ideal für Automatisierung, Deployment-Skripte und Integrationen mit Drittanbieter-Systemen.
API-Schlüssel erstellen¶
POST /api/v1/auth/api-keys
Authorization: Bearer <jwt-token>
Content-Type: application/json
{
"name": "Deployment-Skript",
"expires_at": "2027-12-31T23:59:59Z"
}
| Feld | Pflicht | Beschreibung |
|---|---|---|
name |
Ja | Bezeichnung (1–100 Zeichen) |
expires_at |
Nein | Ablaufdatum im RFC 3339 Format |
Antwort¶
{
"data": {
"id": 1,
"name": "Deployment-Skript",
"key": "ncp_a1b2c3d4e5f6...",
"key_prefix": "ncp_a1b2c3d4e5f6",
"expires_at": "2027-12-31T23:59:59Z",
"created_at": "2026-03-31T10:00:00Z"
},
"error": null,
"message": "API key created"
}
Schlüssel nur einmal sichtbar
Das Feld key wird nur in dieser Antwort zurückgegeben. Speichern Sie den Schlüssel sofort sicher ab. Der Klartext kann nach der Erstellung nicht erneut abgerufen werden.
API-Schlüssel verwenden¶
Senden Sie den Schlüssel im Authorization-Header:
API-Schlüssel auflisten¶
Antwort:
{
"data": [
{
"id": 1,
"name": "Deployment-Skript",
"key_prefix": "ncp_a1b2c3d4e5f6",
"last_used_at": "2026-03-30T14:22:00Z",
"expires_at": "2027-12-31T23:59:59Z",
"created_at": "2026-03-31T10:00:00Z"
}
],
"error": null,
"message": ""
}
key_prefix
Der key_prefix zeigt die ersten 20 Zeichen des Schlüssels und dient zur Identifikation. Der vollständige Schlüssel wird nie erneut angezeigt.
API-Schlüssel löschen¶
Schlüssel-Format¶
API-Schlüssel verwenden folgendes Format:
- Präfix:
ncp_(NetCell Panel) - 32 Bytes zufällige Daten, hexadezimal kodiert
- Gesamtlänge: 68 Zeichen
Antwort-Format¶
Alle API-Antworten verwenden ein einheitliches JSON-Format:
| Feld | Typ | Beschreibung |
|---|---|---|
data |
Object/Array/null | Die angeforderten Daten |
error |
String/null | Fehlerbeschreibung (null bei Erfolg) |
message |
String | Lesbare Nachricht |
Fehlerantworten¶
| HTTP-Status | Bedeutung |
|---|---|
400 |
Ungültige Anfrage (fehlende oder falsche Parameter) |
401 |
Nicht authentifiziert (Token fehlt oder ungültig) |
403 |
Keine Berechtigung (Rolle unzureichend oder Ressource gehört anderem Kunden) |
404 |
Ressource nicht gefunden |
409 |
Konflikt (z. B. Duplikat) |
422 |
Validierungsfehler |
429 |
Zu viele Anfragen (Rate-Limit überschritten) |
500 |
Interner Serverfehler |
Beispiel-Fehlerantwort:
Rate-Limiting¶
Die API begrenzt die Anzahl der Anfragen pro Zeitraum, um Missbrauch zu verhindern:
| Endpunkt | Limit |
|---|---|
Login (/auth/login) |
10 Anfragen pro Minute pro IP |
| Passwort-Reset | 5 Anfragen pro Minute pro IP |
| Alle anderen Endpunkte | 120 Anfragen pro Minute pro Benutzer |
Bei Überschreitung des Rate-Limits antwortet die API mit HTTP-Status 429:
{
"data": null,
"error": "rate limit exceeded",
"message": "Too many requests. Please try again later."
}
Rate-Limit-Header
Die API sendet folgende Header mit jeder Antwort:
| Header | Beschreibung |
|---|---|
X-RateLimit-Limit |
Maximale Anfragen pro Zeitfenster |
X-RateLimit-Remaining |
Verbleibende Anfragen |
X-RateLimit-Reset |
Unix-Timestamp, wann das Limit zurückgesetzt wird |
Abonnement-Kontext¶
Kunden-Endpunkte erfordern den Kontext eines Abonnements. Übergeben Sie die Abonnement-ID als Query-Parameter:
Falls der Parameter fehlt und der Kunde mehrere Abonnements hat, wird das Standard-Abonnement verwendet.
Beispiele¶
cURL¶
# Login
TOKEN=$(curl -s -X POST https://panel.beispiel.de:3443/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"kunde@beispiel.de","password":"geheim"}' \
| jq -r '.data.token')
# Websites auflisten
curl -s https://panel.beispiel.de:3443/api/v1/sites?subscription_id=1 \
-H "Authorization: Bearer $TOKEN" | jq
# Mit API-Schlüssel
curl -s https://panel.beispiel.de:3443/api/v1/sites?subscription_id=1 \
-H "Authorization: Bearer ncp_a1b2c3d4..." | jq
Python¶
import requests
BASE_URL = "https://panel.beispiel.de:3443/api/v1"
# Login
resp = requests.post(f"{BASE_URL}/auth/login", json={
"email": "kunde@beispiel.de",
"password": "geheim"
})
token = resp.json()["data"]["token"]
headers = {"Authorization": f"Bearer {token}"}
# Websites auflisten
sites = requests.get(f"{BASE_URL}/sites",
headers=headers,
params={"subscription_id": 1}
)
print(sites.json())
PHP¶
<?php
$baseUrl = 'https://panel.beispiel.de:3443/api/v1';
$apiKey = 'ncp_a1b2c3d4...';
$ch = curl_init("$baseUrl/sites?subscription_id=1");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer $apiKey",
"Content-Type: application/json",
],
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
print_r($data);