trim($_POST['name']), 'key' => $created['key']]; audit_log($staff['id'], 'API-Schlüssel erstellt: ' . trim($_POST['name'])); redirect('/staff/api_keys.php'); } catch (AdminModelException $e) { $errors[] = $e->getMessage(); } } if ($action === 'toggle') { $pdo->prepare('UPDATE api_keys SET is_active = 1 - is_active WHERE id = ?')->execute([(int) $_POST['id']]); audit_log($staff['id'], 'API-Schlüssel umgeschaltet: #' . (int) $_POST['id']); redirect('/staff/api_keys.php'); } if ($action === 'delete') { $pdo->prepare('DELETE FROM api_keys WHERE id = ?')->execute([(int) $_POST['id']]); audit_log($staff['id'], 'API-Schlüssel gelöscht: #' . (int) $_POST['id']); flash('success', 'Schlüssel gelöscht. Systeme, die ihn nutzen, werden ab sofort abgewiesen.'); redirect('/staff/api_keys.php'); } } $keys = $pdo->query('SELECT k.*, s.name AS creator FROM api_keys k LEFT JOIN staff s ON s.id = k.created_by ORDER BY k.created_at DESC')->fetchAll(); $base = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https://' : 'http://') . ($_SERVER['HTTP_HOST'] ?? 'ihre-domain.de'); $pageTitle = 'API-Schlüssel'; $activePage = 'api_keys'; require __DIR__ . '/_header.php'; ?>
= e($newKey['key']) ?>Mit einem Schlüssel können Fremdsysteme (Website-Formular, Shop, Monitoring …) Tickets über die öffentliche API anlegen oder deren Status abfragen. Ereignisse an andere Systeme meldest du über Webhooks.
| Name | Schlüssel | Rechte | Erlaubte IPs | Status | Zuletzt genutzt | Erstellt | |
|---|---|---|---|---|---|---|---|
| = e($k['name']) ?> = e($k['creator'] ?? '') ?> |
= e($k['key_prefix']) ?>… |
= $k['can_create_tickets'] ? 'Tickets anlegen' : '' ?>= $k['can_create_tickets'] && $k['can_read_tickets'] ? ' ' : '' ?>= $k['can_read_tickets'] ? 'Tickets lesen' : '' ?> |
= e($k['ip_whitelist'] ?: 'alle') ?> | = $k['is_active'] ? 'Aktiv' : 'Deaktiviert' ?> | = e(cron_last_run_label($k['last_used_at'] ?? null)) ?> | = e(ui_date($k['created_at'] ?? null)) ?> | · |
| Noch keine API-Schlüssel angelegt. | |||||||
Ticket anlegen (JSON). Antwort: 201 mit der Ticketnummer. Höchstens 60 Tickets pro Minute.
= e("curl -X POST {$base}/api/public/v1/tickets.php \\\n -H \"X-API-Key: dh_…\" -H \"Content-Type: application/json\" \\\n -d '{\"name\":\"Max Muster\",\"email\":\"max@example.de\",\"subject\":\"Frage zur Rechnung\",\"message\":\"Hallo …\",\"helpTopicId\":1}'") ?>
Status abfragen:
= e("curl \"{$base}/api/public/v1/tickets.php?number=240915-0012&email=max@example.de\" -H \"X-API-Key: dh_…\"") ?>
Optionale Felder beim Anlegen: departmentId, priorityId, helpTopicId. Ticket-Regeln und SLA-Pläne gelten wie bei jedem anderen Ticket.