TicketWave Logo
Webhooks

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.

EventWird ausgelöst, wenn
ticket.createdEin Ticket geöffnet wird
ticket.closedEin Ticket geschlossen wird
ticket.updatedSich sonst etwas an einem offenen Ticket ändert
message.sentEin Mitglied oder Staff in einem Ticket schreibt
blacklist.addedEin Mitglied auf die Blacklist gesetzt wird
blacklist.removedEin 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:

FeldTypBeschreibung
ticket_idstringDie lesbare Ticket-ID aus Deinem Muster, z. B. ticket-1042
ticket_num_idnumberDie laufende Ticketnummer, z. B. 1042
channel_idstringDer Discord-Channel des Tickets
categorystring | nullKategoriename, null, wenn das Ticket keine Kategorie hat
userobject | nullDer 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"
  }
}
FeldTypBeschreibung
closed_byobjectWer es geschlossen hat. Automatische Schließungen melden den Bot
reasonstring | nullDer 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

actionBedeutungchanges enthält
ticket_claim:addEin Staff-Mitglied hat das Ticket übernommen(leer)
ticket_unclaim:addDie Übernahme wurde aufgehoben(leer)
ticket_priority:addDie Priorität wurde geändertpriority
ticket_rename:addDer Channel wurde umbenanntnew_name
ticket_remind:addEine Erinnerung wurde gesendet(leer)
ticket_feedback:addDas Mitglied hat das Ticket bewertetstar_count, feedback
ticket_schedule_close:addEin Schließen wurde geplantduration, schedule_time
ticket_request_close:addStaff hat das Mitglied gebeten, das Ticket zu schließenduration, request_duration_time
ticket_request_close_accept:addDas Mitglied hat zugestimmt(leer)
ticket_request_close_deny:addDas Mitglied hat abgelehnt(leer)
ticket_close_cancel:addEin laufendes Schließen wurde abgebrochen(leer)
ticket_additional_access:addEin User oder eine Rolle wurde zum Ticket hinzugefügtentity_type, entity_id, reason
ticket_additional_access:removeEin User oder eine Rolle wurde entferntentity_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"
  }
}
FeldTypBeschreibung
contentstringDer rohe Nachrichtentext. Leer bei Nachrichten nur mit Anhang
authorobject{ id, username } des Absenders
is_staffbooleantrue, 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

How is this guide?