docs/api/KiroCloud API SDK & Referenz

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 OK wenn gesund, 503 Service Unavailable wenn 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: 400 bei ungültiger Ticket-ID, 403 bei 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 CodeCode im PayloadBedeutungLösung
401API_KEY_MISSINGDer Authorization Header fehlt oder ist nicht im Bearer <Token> Format.Füge den Header korrekt hinzu.
401API_KEY_INVALIDDer Key wurde nicht gefunden, ist deaktiviert oder manipuliert.Generiere einen neuen Key im Dashboard.
401API_KEY_EXPIREDDie Gültigkeit des Keys ist abgelaufen.Erstelle einen neuen Key.
403FORBIDDEN_SCOPEDer Key hat keine Rechte für diesen Endpunkt.Füge dem Key den benötigten Scope hinzu (z.B. bots:write).
404NOT_FOUNDDie angeforderte Ressource (z.B. ein Bot oder Ticket) existiert nicht.Prüfe die UUID/ID in der URL.
429TOO_MANY_REQUESTSDas 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!

Cookie-Einstellungen

Wir verwenden Cookies, um deine Erfahrung zu verbessern und unsere Dienste optimal anzubieten. Du kannst deine Einstellungen jederzeit anpassen.

main/e609418