Tickets-API

Whitelabel-Support-Ticket-System. Embedde unser Widget auf deiner Website oder bau dein eigenes UI auf der REST-API.

Base-URL: https://www.theredstonee.de/api/tickets/v1

Format: JSON. Alle Requests/Responses sind UTF-8.

Quick Start

1. Tenant erstellen unter tickets-api/

2. Du bekommst zwei Keys: pk_live_* (public, nur Create) und sk_live_* (secret, alles).

3. Widget einbauen oder API direkt nutzen:

HTML JavaScript cURL PHP Python
<script src="https://www.theredstonee.de/widget/tickets.js"
        data-key="pk_live_DEIN_KEY" async></script>
await fetch('https://www.theredstonee.de/api/tickets/v1/create.php', {
    method: 'POST',
    headers: {
        'Authorization': 'Bearer pk_live_DEIN_KEY',
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        name: 'Max Mustermann',
        email: 'max@example.com',
        subject: 'Hilfe benötigt',
        message: 'Es funktioniert nicht...',
    }),
});
curl -X POST https://www.theredstonee.de/api/tickets/v1/create.php \
  -H 'Authorization: Bearer pk_live_DEIN_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Max","email":"max@example.com","subject":"Hi","message":"Test"}'
<?php
$ch = curl_init('https://www.theredstonee.de/api/tickets/v1/create.php');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer pk_live_DEIN_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'name'    => 'Max',
        'email'   => 'max@example.com',
        'subject' => 'Hi',
        'message' => 'Test',
    ]),
    CURLOPT_RETURNTRANSFER => true,
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests

res = requests.post(
    'https://www.theredstonee.de/api/tickets/v1/create.php',
    headers={'Authorization': 'Bearer pk_live_DEIN_KEY'},
    json={
        'name': 'Max',
        'email': 'max@example.com',
        'subject': 'Hi',
        'message': 'Test',
    },
).json()

Authentifizierung

Bearer-Token im Authorization-Header. Zwei Key-Typen:

Key-PrefixZweckSichtbarkeitEndpoints
pk_live_*Public Key — fürs WidgetDarf im Frontend stehencreate, ticket (eigene), reply (eigene), close-request, upload (eigene), file (eigene), widget-config
sk_live_*Secret Key — Backend/APINiemals im FrontendAlle Endpoints, inkl. list, status, me

Für Aktionen mit pk_live_ auf einem konkreten Ticket (lesen/antworten) musst du zusätzlich die E-Mail-Adresse des Tickets als email-Parameter mitschicken — sonst 403.

Endpoints

POST/create.php

Erstellt ein neues Ticket. Auth: pk oder sk.

Body (JSON):

FeldTypPflichtBeschreibung
namestringName des Absenders, max 100
emailstringGültige E-Mail-Adresse
subjectstringBetreff, max 200
messagestringNachricht, min 5 / max 10000
page_urlstringURL der Seite (für Tracking)

Response: {"ok": true, "ticket": {...}}

GET/list.php

Listet Tickets. Auth: sk only.

Query-Parameter:

ParamTypDefaultBeschreibung
statusstringFilter: open / in_progress / closed
limitint50Max 200
offsetint0Pagination

Response: {"ok": true, "total": N, "offset": 0, "limit": 50, "tickets": [...]}

GET/ticket.php?id=tkt_xxx

Liest ein einzelnes Ticket. Mit pk: zusätzlich email-Parameter nötig.

POST/reply.php

Fügt eine Antwort an. pk = als Kunde, sk = als Owner/Support.

FeldTypPflichtBeschreibung
ticket_idstringID des Tickets
messagestringAntwort-Text
emailstringpk onlyE-Mail des Kunden (Match-Pflicht)
author_namestringsk onlyName des Antwortenden (z.B. "Anna Support")

POST/status.php

Ändert den Status. Auth: sk only.

Body: {"ticket_id":"tkt_x", "status":"closed"} — erlaubt: open, in_progress, closed.

POST/close-request.php

Kunde fragt das Schließen des Tickets an. Owner muss bestätigen via Status-Change.

POST/upload.php

Datei-Upload (multipart/form-data). Max 5 MB. Allowed: jpg, png, gif, webp, pdf, txt, log, json, csv, zip.

curl -X POST https://www.theredstonee.de/api/tickets/v1/upload.php \
  -H 'Authorization: Bearer pk_live_KEY' \
  -F 'ticket_id=tkt_xxx' \
  -F 'email=max@example.com' \
  -F 'file=@screenshot.png'

GET/file.php?ticket_id=X&file_id=Y

Lädt eine angehängte Datei. Mit pk: zusätzlich email-Parameter.

GET/me.php

Tenant-Info + Stats. Auth: sk only.

JS-Widget

Drop-in Snippet mit Konfigurations-Attributen:

<script src="https://www.theredstonee.de/widget/tickets.js"
        data-key="pk_live_KEY"
        data-color="#3b82f6"
        data-position="right"
        data-brand="Mein Shop"
        data-lang="de"
        data-text-title="Wie können wir helfen?"
        data-text-submit="Senden"
        async></script>

Alle data-*-Attribute sind optional — Defaults kommen aus deinem Dashboard.

AttributWerteBeschreibung
data-keypk_live_*Pflicht
data-color#hexPrimärfarbe (überschreibt Dashboard)
data-positionright / leftPosition
data-brandStringBrand-Name im Header
data-langde / enSprache
data-text-*Stringtitle, subtitle, bubble, name, email, subject, message, submit, success, error

Webhooks

Wenn du im Dashboard eine Webhook-URL setzt, POSTen wir JSON bei jedem Event.

Payload-Format:

{
    "event": "ticket.created",
    "tenant_id": "tnt_xxx",
    "data": { /* event-spezifisch */ },
    "ts": "2026-05-24 15:30:00"
}

Events:

Eventdata enthält
ticket.createdVollständiges Ticket-Objekt
ticket.replyticket_id, reply, is_customer
ticket.statusticket_id, status
ticket.close_requestedticket_id

Slack-kompatibel: setze eine Slack-Incoming-Webhook-URL. Wir senden minimal-formatiert.

Fehler-Codes

HTTPBedeutung
400Validierungsfehler (fehlende/ungültige Felder)
401Ungültiger oder fehlender Key
403Tenant noch nicht freigegeben oder fehlende Berechtigung
404Ticket nicht gefunden
413Datei zu groß (> 5 MB)
415Datei-Typ nicht erlaubt
429Rate-Limit überschritten
500Server-Fehler

Alle Fehler-Responses haben das Format: {"ok": false, "error": "Beschreibung"}

Rate-Limits

Pro Key, gleitendes 60-Sekunden-Fenster:

Bei Überschreitung: 429. Warte 60 Sekunden und versuche es erneut.

Noch Fragen? Schreib uns ein Ticket oder check den Discord.