KiroCloud API SDK & Referenz
KiroCloud API & SDK Dokumentation
Herzlich willkommen zur offiziellen und vollständigen KiroCloud API-Referenz. Auf dieser Seite findest du alles, was du benötigst, um KiroCloud tief in deine eigenen Systeme zu integrieren. Ob du einen Discord Bot betreibst, der Tickets verwalten soll, ein externes Monitoring-Tool anbinden möchtest, oder administrative Bulk-Aktionen über die Kommandozeile (CLI) ausführen willst – diese Dokumentation deckt alle Anwendungsfälle ab.
!IMPORTANT Alle in dieser Dokumentation beschriebenen Endpunkte erfordern einen gültigen API-Schlüssel, der in den HTTP-Headern mitgeschickt werden muss. Stelle sicher, dass du deinen API-Schlüssel niemals öffentlich teilst (z.B. in öffentlichen GitHub-Repositories).
1. Authentifizierung
Um Requests an die KiroCloud-API zu senden, musst du deinen generierten API-Schlüssel im Authorization Header als Bearer Token übergeben.
Den API-Schlüssel kannst du im Developer Hub generieren.
Header-Format
Authorization: Bearer kiro_adm_DEIN_SCHLUESSEL
Content-Type: application/json
Accept: application/json
2. Fertige SDK-Wrapper für deine Projekte
Damit du nicht für jeden Endpunkt eigene Requests bauen musst, haben wir fertige "KiroClient"-Klassen für die gängigsten Programmiersprachen vorbereitet. Du kannst diese Klassen 1:1 in dein Projekt kopieren und direkt verwenden.
2.1 Node.js / JavaScript (Fetch API)
Dieses Beispiel nutzt die native fetch API (Node.js v18+) und ist ideal für Discord.js Bots oder Web-Backends.
// kiroClient.js
export class KiroClient {
constructor(apiKey) {
this.apiKey = apiKey;
this.baseUrl = 'https://api.kirocloud.de/api/v1';
}
async _request(method, endpoint, body = null) {
const headers = {
'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json'
};
const options = { method, headers };
if (body) {
options.body = JSON.stringify(body);
}
const response = await fetch(`${this.baseUrl}${endpoint}`, options);
const data = await response.json();
if (!response.ok) {
throw new Error(`KiroCloud API Error: ${response.status} - ${data.statusMessage || JSON.stringify(data)}`);
}
return data;
}
// --- System & Metriken (Scope: system:read) ---
async getDiagnostics() {
return this._request('GET', '/admin/devs/diagnostics');
}
async getHealth() {
return this._request('GET', '/admin/system/health');
}
// --- Tickets (Scopes: tickets:read, tickets:write) ---
async getTickets() {
return this._request('GET', '/admin/tickets');
}
async getUnreadTickets() {
return this._request('GET', '/admin/tickets/unread');
}
async closeTicket(ticketId) {
return this._request('POST', `/admin/tickets/${ticketId}/close`);
}
async getTicketNotes(ticketId) {
return this._request('GET', `/admin/tickets/${ticketId}/notes`);
}
async addTicketNote(ticketId, content) {
return this._request('POST', `/admin/tickets/${ticketId}/notes`, { content });
}
async assignTicket(ticketId, userId) {
return this._request('POST', `/admin/tickets/${ticketId}/assign`, { userId });
}
// --- Bots (Scopes: bots:read, bots:write) ---
async getBotLogs(botId) {
return this._request('GET', `/admin/bots/${botId}/logs`);
}
async setBotPower(botId, action) {
// action: 'start' | 'stop' | 'restart' | 'kill'
return this._request('POST', `/admin/bots/${botId}/power`, { action });
}
async bulkActionBots(botIds, action) {
return this._request('POST', '/admin/bots/bulk', { botIds, action });
}
// --- Users (Scopes: users:read, users:write) ---
async getUsers() {
return this._request('GET', '/admin/users');
}
async searchUsers(query) {
return this._request('GET', `/admin/users/search?q=${encodeURIComponent(query)}`);
}
async getUserProfile(userId) {
return this._request('GET', `/admin/users/${userId}`);
}
async banUser(userId, reason) {
return this._request('POST', `/admin/users/${userId}/ban`, { reason });
}
}
2.2 Python (Requests)
Für Python verwenden wir die beliebte requests-Bibliothek (pip install requests). Ideal für Data Science, Skripte oder discord.py Bots.
# kiro_client.py
import requests
class KiroClient:
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.kirocloud.de/api/v1"
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def _request(self, method: str, endpoint: str, json_data=None):
url = f"{self.base_url}{endpoint}"
response = requests.request(method, url, headers=self.headers, json=json_data)
if not response.ok:
raise Exception(f"KiroCloud API Error: {response.status_code} - {response.text}")
return response.json()
# --- System ---
def get_diagnostics(self):
return self._request("GET", "/admin/devs/diagnostics")
def get_health(self):
return self._request("GET", "/admin/system/health")
# --- Tickets ---
def get_tickets(self):
return self._request("GET", "/admin/tickets")
def get_unread_tickets(self):
return self._request("GET", "/admin/tickets/unread")
def close_ticket(self, ticket_id: str):
return self._request("POST", f"/admin/tickets/{ticket_id}/close")
def add_ticket_note(self, ticket_id: str, content: str):
return self._request("POST", f"/admin/tickets/{ticket_id}/notes", {"content": content})
def assign_ticket(self, ticket_id: str, user_id: str):
return self._request("POST", f"/admin/tickets/{ticket_id}/assign", {"userId": user_id})
# --- Bots ---
def get_bot_logs(self, bot_id: str):
return self._request("GET", f"/admin/bots/{bot_id}/logs")
def set_bot_power(self, bot_id: str, action: str):
return self._request("POST", f"/admin/bots/{bot_id}/power", {"action": action})
def bulk_action_bots(self, bot_ids: list, action: str):
return self._request("POST", "/admin/bots/bulk", {"botIds": bot_ids, "action": action})
# --- Users ---
def search_users(self, query: str):
return self._request("GET", f"/admin/users/search?q={query}")
def get_user(self, user_id: str):
return self._request("GET", f"/admin/users/{user_id}")
def ban_user(self, user_id: str, reason: str):
return self._request("POST", f"/admin/users/{user_id}/ban", {"reason": reason})
2.3 PHP (cURL)
Für klassische Webanwendungen (z. B. Laravel, Symfony oder plain PHP).
<?php
class KiroClient {
private $apiKey;
private $baseUrl = 'https://api.kirocloud.de/api/v1';
public function __construct($apiKey) {
$this->apiKey = $apiKey;
}
private function request($method, $endpoint, $data = null) {
$ch = curl_init($this->baseUrl . $endpoint);
$headers = [
'Authorization: Bearer ' . $this->apiKey,
'Content-Type: application/json',
'Accept: application/json'
];
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
if ($data) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
}
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode >= 400) {
throw new Exception("KiroCloud API Error: $httpCode - $response");
}
return json_decode($response, true);
}
public function getDiagnostics() {
return $this->request('GET', '/admin/devs/diagnostics');
}
public function getTickets() {
return $this->request('GET', '/admin/tickets');
}
public function setBotPower($botId, $action) {
return $this->request('POST', "/admin/bots/$botId/power", ['action' => $action]);
}
public function banUser($userId, $reason) {
return $this->request('POST', "/admin/users/$userId/ban", ['reason' => $reason]);
}
}
2.4 Go (Golang)
Ein hochperformanter Ansatz für kompilierte Microservices.
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
type KiroClient struct {
APIKey string
BaseURL string
Client *http.Client
}
func NewKiroClient(apiKey string) *KiroClient {
return &KiroClient{
APIKey: apiKey,
BaseURL: "https://api.kirocloud.de/api/v1",
Client: &http.Client{},
}
}
func (k *KiroClient) Request(method, endpoint string, bodyData interface{}) ([]byte, error) {
var reqBody io.Reader
if bodyData != nil {
jsonBody, _ := json.Marshal(bodyData)
reqBody = bytes.NewBuffer(jsonBody)
}
req, err := http.NewRequest(method, k.BaseURL+endpoint, reqBody)
if err != nil {
return nil, err
}
req.Header.Set("Authorization", "Bearer "+k.APIKey)
req.Header.Set("Content-Type", "application/json")
resp, err := k.Client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
bodyBytes, _ := io.ReadAll(resp.Body)
if resp.StatusCode >= 400 {
return nil, fmt.Errorf("API Error %d: %s", resp.StatusCode, string(bodyBytes))
}
return bodyBytes, nil
}
2.5 Bash / cURL (Skripte & CI/CD)
Für schnelle Automatisierungen in der Shell (z. B. Cronjobs, GitHub Actions).
#!/bin/bash
API_KEY="kiro_adm_DEIN_SCHLUESSEL_HIER"
BASE_URL="https://api.kirocloud.de/api/v1"
# 1. System Health abfragen
curl -s -X GET "$BASE_URL/admin/system/health" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json" | jq '.'
# 2. Bot neustarten
curl -s -X POST "$BASE_URL/admin/bots/1234567890/power" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"action":"restart"}' | jq '.'
3. Endpunkte im Detail (Referenz)
Hier findest du eine detaillierte Beschreibung aller verfügbaren API-Endpunkte, sortiert nach ihren Kategorien. Jeder Endpunkt erfordert einen spezifischen Scope, den du beim Erstellen des API-Schlüssels zuweisen musst.
System & Metriken
Erfordert Scope: system:read
Diese Endpunkte liefern Live-Statistiken über die gesamte KiroCloud-Instanz. Perfekt geeignet, um Daten in externe Dashboards wie Grafana oder Datadog zu speisen.
GET /api/v1/admin/devs/diagnostics
Gibt tiefe Systemmetriken zurück, einschließlich Node.js Prozessdaten, Datenbank-Zählern und Redis-Speicherauslastung.
- Rückgabe:
200 OK - Response Format:
{ "success": true, "data": { "environment": { "nodeVersion": "v20.12.0", "uptimeSeconds": 34560 }, "processMemory": { "heapUsedMb": 120, "rssMb": 250 }, "tableCounts": { "users": 1500, "bots": 42 }, "redis": { "keys": 520, "usedMemory": "12.5M" } } }
GET /api/v1/admin/system/health
Führt einen Live-Gesundheitscheck der Datenbank, Redis und anderer kritischer Services durch.
- Rückgabe:
200 OKwenn gesund,503 Service Unavailablewenn etwas fehlschlägt.
Ticket-System
Erfordert Scopes: tickets:read, tickets:write
Mit diesen Endpunkten kannst du das gesamte Support-System fernsteuern. Beispielsweise kannst du deinen eigenen Discord-Bot so programmieren, dass User über einen Command in Discord Tickets öffnen können.
GET /api/v1/admin/tickets
Listet die neuesten Tickets auf.
- Scope:
tickets:read - Parameter:
?archived=true(optional)
GET /api/v1/admin/tickets/unread
Zählt und listet alle noch ungelesenen/unbeantworteten Tickets auf.
- Scope:
tickets:read
POST /api/v1/admin/tickets/:id/close
Schließt ein bestimmtes Ticket permanent.
- Scope:
tickets:write - Body: Keine Payload erforderlich.
- Fehler:
400bei ungültiger Ticket-ID,403bei fehlenden Rechten.
GET /api/v1/admin/tickets/:id/notes
Holt alle internen Team-Notizen für ein Ticket.
- Scope:
tickets:read
POST /api/v1/admin/tickets/:id/notes
Fügt eine interne Notiz zu einem Ticket hinzu.
- Scope:
tickets:write - Body:
{"content": "Der Nutzer hat sich im Voice-Chat gemeldet."}
POST /api/v1/admin/tickets/:id/assign
Weist ein Ticket einem bestimmten Team-Mitglied zu.
- Scope:
tickets:write - Body:
{"userId": "123456789"}
Bot-Management
Erfordert Scopes: bots:read, bots:write
Automatisiere das Deployment und die Skalierung der Discord-Bots, die in der KiroCloud gehostet werden.
POST /api/v1/admin/bots/:id/power
Steuert den Stromstatus eines Bots.
- Scope:
bots:write - Body:
{"action": "start" | "stop" | "restart" | "kill"} - Beispiel: Ein CI/CD-Runner kann nach erfolgreichem Code-Build diesen Endpunkt aufrufen, um den Bot automatisch neuzustarten, damit die Änderungen live gehen.
GET /api/v1/admin/bots/:id/logs
Ruft die letzten 200 Zeilen der Konsolenausgabe (Logs) des Bots ab.
- Scope:
bots:read - Rückgabe:
{ "success": true, "data": { "botId": "123", "status": "online", "logs": ["[INFO] Logged in as KiroBot", "[WARN] High latency"] } }
POST /api/v1/admin/bots/bulk
Führt Massenaktionen auf mehrere Bots gleichzeitig aus (z.B. alle Bots eines Nutzers neustarten).
- Scope:
bots:write - Body:
{"botIds": ["id1", "id2"], "action": "restart"}
User-Management
Erfordert Scopes: users:read, users:write
Externe Systeme (wie z. B. ein XenForo-Forum, eine externe Shop-Software oder ein eigenständiger Bot) können auf die User-Datenbank zugreifen.
GET /api/v1/admin/users
Listet alle registrierten Benutzer auf. Das Passwort und Tokens werden im Backend serverseitig herausgefiltert.
- Scope:
users:read
GET /api/v1/admin/users/search?q=query
Sucht nach Benutzern anhand ihres Benutzernamens, ihrer Discord-ID oder E-Mail.
- Scope:
users:read
GET /api/v1/admin/users/:id
Holt das komplette Profil eines spezifischen Benutzers (ohne sicherheitskritische Daten).
- Scope:
users:read
POST /api/v1/admin/users/:id/ban
Sperrt einen Benutzer permanent von der KiroCloud.
- Scope:
users:write - Body:
{"reason": "Verstoß gegen die Nutzungsbedingungen"}
4. Häufige Fehler & Statuscodes
Damit du Fehlermeldungen programmatisch gut abfangen kannst, verwendet unsere API strukturierte JSON-Fehler (Standard H3 Fehlerobjekte).
| Status Code | Code im Payload | Bedeutung | Lösung |
|---|---|---|---|
401 | API_KEY_MISSING | Der Authorization Header fehlt oder ist nicht im Bearer <Token> Format. | Füge den Header korrekt hinzu. |
401 | API_KEY_INVALID | Der Key wurde nicht gefunden, ist deaktiviert oder manipuliert. | Generiere einen neuen Key im Dashboard. |
401 | API_KEY_EXPIRED | Die Gültigkeit des Keys ist abgelaufen. | Erstelle einen neuen Key. |
403 | FORBIDDEN_SCOPE | Der Key hat keine Rechte für diesen Endpunkt. | Füge dem Key den benötigten Scope hinzu (z.B. bots:write). |
404 | NOT_FOUND | Die angeforderte Ressource (z.B. ein Bot oder Ticket) existiert nicht. | Prüfe die UUID/ID in der URL. |
429 | TOO_MANY_REQUESTS | Das API Rate-Limit wurde überschritten. | Implementiere in deinem Skript einen Backoff (Wartezeit) bevor du den Request wiederholst. |
!TIP Um 429-Fehler zu vermeiden, empfehlen wir für umfangreiche Datenabfragen (Polling) maximal 1 Request pro Sekunde pro Endpunkt. Für Echtzeit-Daten solltest du unsere Webhooks verwenden, anstatt die API sekündlich anzufragen!