Ereignis-Referenz
Jeder Webhook-Ereignistyp und das exakte Payload, das TicketWave sendet.
Ereignis-Referenz
Pro Endpoint können sechs Ereignistypen abonniert werden. Jede Anfrage verwendet denselben Envelope — event, timestamp, guild_id und data — und nur das data-Objekt unterscheidet sich.
| Event | Wird ausgelöst, wenn |
|---|---|
ticket.created | Ein Ticket geöffnet wird |
ticket.closed | Ein Ticket geschlossen wird |
ticket.updated | Sich sonst etwas an einem offenen Ticket ändert |
message.sent | Ein Mitglied oder Staff in einem Ticket schreibt |
blacklist.added | Ein Mitglied auf die Blacklist gesetzt wird |
blacklist.removed | Ein Blacklist-Eintrag entfernt wird |
Felder, die nicht aufgelöst werden können, werden als null gesendet statt weggelassen zu werden — Du kannst Dich also darauf verlassen, dass die Keys vorhanden sind. Ein username ist null, wenn Discord den User nicht zurückgegeben hat.
Gemeinsame Felder
Jedes Ticket-Ereignis enthält diese Felder:
| Feld | Typ | Beschreibung |
|---|---|---|
ticket_id | string | Die lesbare Ticket-ID aus Deinem Muster, z. B. ticket-1042 |
ticket_num_id | number | Die laufende Ticketnummer, z. B. 1042 |
channel_id | string | Der Discord-Channel des Tickets |
category | string | null | Kategoriename, null, wenn das Ticket keine Kategorie hat |
user | object | null | Der Ticket-Besitzer als { id, username } |
ticket.created
Wird direkt gesendet, nachdem der Ticket-Channel existiert.
{
"event": "ticket.created",
"timestamp": "2026-08-26T08:23:11.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1042",
"ticket_num_id": 1042,
"channel_id": "998877665544332211",
"category": "🤖 Support",
"user": { "id": "987654321098765432", "username": "Luna" },
"created_at": "2026-08-26T08:23:11.000Z"
}
}Das wird ausgelöst, wenn das Ticket geöffnet wird, also bevor das Mitglied irgendetwas geschrieben hat. Wenn Du die erste Nachricht brauchst, höre zusätzlich auf message.sent.
ticket.closed
{
"event": "ticket.closed",
"timestamp": "2026-08-26T07:45:02.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1041",
"ticket_num_id": 1041,
"channel_id": "998877665544332211",
"category": "💸 Payment",
"user": { "id": "987654321098765432", "username": "Luna" },
"closed_by": { "id": "112233445566778899", "username": "Staff_01" },
"reason": "Issue resolved",
"closed_at": "2026-08-26T07:45:02.000Z"
}
}| Feld | Typ | Beschreibung |
|---|---|---|
closed_by | object | Wer es geschlossen hat. Automatische Schließungen melden den Bot |
reason | string | null | Der Schließgrund, null, wenn keiner angegeben wurde |
ticket.updated
Der Sammeltyp für Änderungen an einem offenen Ticket. action sagt Dir, was sich geändert hat, changes enthält die Details dieser konkreten Aktion.
{
"event": "ticket.updated",
"timestamp": "2026-08-26T14:02:19.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1038",
"ticket_num_id": 1038,
"channel_id": "998877665544332211",
"category": "🤖 Support",
"user": { "id": "987654321098765432", "username": "Luna" },
"action": "ticket_priority:add",
"changes": { "priority": "high" },
"reason": null,
"updated_by": { "id": "112233445566778899", "username": "Staff_01" }
}
}Mögliche action-Werte
action | Bedeutung | changes enthält |
|---|---|---|
ticket_claim:add | Ein Staff-Mitglied hat das Ticket übernommen | (leer) |
ticket_unclaim:add | Die Übernahme wurde aufgehoben | (leer) |
ticket_priority:add | Die Priorität wurde geändert | priority |
ticket_rename:add | Der Channel wurde umbenannt | new_name |
ticket_remind:add | Eine Erinnerung wurde gesendet | (leer) |
ticket_feedback:add | Das Mitglied hat das Ticket bewertet | star_count, feedback |
ticket_schedule_close:add | Ein Schließen wurde geplant | duration, schedule_time |
ticket_request_close:add | Staff hat das Mitglied gebeten, das Ticket zu schließen | duration, request_duration_time |
ticket_request_close_accept:add | Das Mitglied hat zugestimmt | (leer) |
ticket_request_close_deny:add | Das Mitglied hat abgelehnt | (leer) |
ticket_close_cancel:add | Ein laufendes Schließen wurde abgebrochen | (leer) |
ticket_additional_access:add | Ein User oder eine Rolle wurde zum Ticket hinzugefügt | entity_type, entity_id, reason |
ticket_additional_access:remove | Ein User oder eine Rolle wurde entfernt | entity_type, entity_id, reason |
Behandle diese Liste als offen. Neue Aktionen kommen hinzu, wenn TicketWave wächst, und sie werden als ticket.updated ausgeliefert. Reagiere nur auf die Aktionen, die Dich interessieren, und ignoriere den Rest, statt bei unbekannten Werten einen Fehler zu werfen.
Das Beantworten eines Ticket-Schritts erzeugt kein Ereignis. Ein Ticket mit vielen Schritten würde Deinen Endpoint sonst fluten, während das Mitglied das Formular noch ausfüllt.
message.sent
Wird für jede menschliche Nachricht innerhalb eines offenen Tickets gesendet. Nachrichten von Bots — einschließlich TicketWave selbst — werden übersprungen.
{
"event": "message.sent",
"timestamp": "2026-08-26T22:10:55.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1040",
"ticket_num_id": 1040,
"channel_id": "998877665544332211",
"message_id": "1234567890123456789",
"content": "Hello, how can I help you?",
"author": { "id": "112233445566778899", "username": "Staff_01" },
"is_staff": true,
"sent_at": "2026-08-26T22:10:55.000Z"
}
}| Feld | Typ | Beschreibung |
|---|---|---|
content | string | Der rohe Nachrichtentext. Leer bei Nachrichten nur mit Anhang |
author | object | { id, username } des Absenders |
is_staff | boolean | true, wenn der Absender eine konfigurierte Support-Rolle hat |
Das ist mit Abstand das Ereignis mit dem höchsten Volumen — ein aktiver Server erzeugt pro Nachricht eine Anfrage. Abonniere es nur, wenn Du wirklich Nachrichten-Daten brauchst, und stelle sicher, dass Dein Empfänger schnell antwortet.
blacklist.added
Nicht an ein Ticket gebunden, daher hat dieses Payload keine ticket_id.
{
"event": "blacklist.added",
"timestamp": "2026-08-26T18:33:47.000Z",
"guild_id": "123456789012345678",
"data": {
"user": { "id": "111223344556677889", "username": "BadActor" },
"reason": "Spam",
"added_by": { "id": "112233445566778899", "username": "Staff_01" }
}
}blacklist.removed
{
"event": "blacklist.removed",
"timestamp": "2026-08-26T18:40:12.000Z",
"guild_id": "123456789012345678",
"data": {
"user": { "id": "111223344556677889", "username": "BadActor" },
"removed_by": { "id": "112233445566778899", "username": "Staff_01" }
}
}Testereignisse
Der Button Send test event liefert eine echte, signierte Anfrage, deren data einfach so aussieht:
{
"event": "ticket.created",
"timestamp": "2026-08-26T12:00:00.000Z",
"guild_id": "123456789012345678",
"data": { "test": true }
}event ist der erste Typ, auf den der Endpoint abonniert ist. Prüfe auf data.test, wenn Du Testzustellungen in der Produktionslogik überspringen möchtest.
Nächste Schritte
- Example Server (Diese Payloads in Express verarbeiten)
- Webhooks (Signierung, Retries und Zustellhistorie)
How is this guide?
