TicketWave Logo
Webhooks

Referencia de eventos

Cada tipo de evento de webhook y el payload exacto que envía TicketWave.

Referencia de eventos

Se pueden suscribir seis tipos de eventos por endpoint. Cada solicitud usa el mismo contenedor — event, timestamp, guild_id y data — y solo cambia el objeto data.

EventFires when
ticket.createdSe abre un ticket
ticket.closedSe cierra un ticket
ticket.updatedCambia cualquier otra cosa en un ticket abierto
message.sentUn miembro o el staff escribe en un ticket
blacklist.addedUn miembro es añadido a la lista negra
blacklist.removedSe elimina una entrada de la lista negra

Los campos que no se pueden resolver se envían como null en lugar de omitirse, así que puedes confiar en que las claves existen. Un username es null cuando Discord no devolvió el usuario.

Campos compartidos

Todos los eventos de ticket incluyen estos campos:

FieldTypeDescription
ticket_idstringEl id legible del ticket según tu patrón, por ejemplo ticket-1042
ticket_num_idnumberEl número correlativo del ticket, por ejemplo 1042
channel_idstringEl canal de Discord del ticket
categorystring | nullNombre de la categoría, null si el ticket no tiene ninguna
userobject | nullEl propietario del ticket como { id, username }

ticket.created

Se envía justo después de que exista el canal del ticket.

{
  "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"
  }
}

Esto se activa cuando el ticket se abre, es decir, antes de que el miembro haya escrito nada. Si necesitas el primer mensaje, escucha también 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"
  }
}
FieldTypeDescription
closed_byobjectQuién lo cerró. Los cierres automáticos informan al bot
reasonstring | nullEl motivo del cierre, null si no se indicó ninguno

ticket.updated

El evento comodín para cambios en un ticket abierto. action te dice qué cambió, changes contiene los detalles de esa acción concreta.

{
  "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" }
  }
}

Posibles valores de action

actionMeaningchanges contains
ticket_claim:addUn miembro del staff reclamó el ticket(empty)
ticket_unclaim:addSe liberó la reclamación(empty)
ticket_priority:addCambió la prioridadpriority
ticket_rename:addSe renombró el canalnew_name
ticket_remind:addSe envió un recordatorio(empty)
ticket_feedback:addEl miembro valoró el ticketstar_count, feedback
ticket_schedule_close:addSe programó un cierreduration, schedule_time
ticket_request_close:addEl staff pidió al miembro que cerraraduration, request_duration_time
ticket_request_close_accept:addEl miembro aceptó(empty)
ticket_request_close_deny:addEl miembro rechazó(empty)
ticket_close_cancel:addSe canceló un cierre en curso(empty)
ticket_additional_access:addSe añadió un usuario o rol al ticketentity_type, entity_id, reason
ticket_additional_access:removeSe eliminó un usuario o rolentity_type, entity_id, reason

Trata esta lista como abierta. Se añaden nuevas acciones a medida que TicketWave crece, y llegan como ticket.updated. Haz un switch sobre las acciones que te interesen e ignora el resto en lugar de lanzar un error con valores desconocidos.

Responder a un paso del ticket no produce un evento. De lo contrario, un ticket con muchos pasos inundaría tu endpoint mientras el miembro sigue rellenando el formulario.


message.sent

Se envía por cada mensaje humano dentro de un ticket abierto. Los mensajes de bots — incluido el propio TicketWave — se omiten.

{
  "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"
  }
}
FieldTypeDescription
contentstringEl texto bruto del mensaje. Vacío en mensajes solo con adjuntos
authorobject{ id, username } del remitente
is_staffbooleantrue si el remitente tiene un rol de soporte configurado

Este es, con diferencia, el evento de mayor volumen: en un servidor activo se genera una solicitud por mensaje. Suscríbete solo si realmente necesitas datos a nivel de mensaje, y asegúrate de que tu receptor responda rápido.


blacklist.added

No está vinculado a un ticket, así que este payload no tiene 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" }
  }
}

Eventos de prueba

El botón Send test event entrega una solicitud real y firmada cuyo data es simplemente:

{
  "event": "ticket.created",
  "timestamp": "2026-08-26T12:00:00.000Z",
  "guild_id": "123456789012345678",
  "data": { "test": true }
}

El event es el primer tipo al que está suscrito el endpoint. Comprueba data.test si quieres omitir las entregas de prueba en la lógica de producción.

Siguientes pasos

How is this guide?