TicketWave Logo
Webhooks

Oversikt

Motta TicketWave-hendelser som signerte HTTP-forespørsler i din egen applikasjon.

Webhooks

En webhook er en HTTP-forespørsel TicketWave sender til deg. Hver gang noe skjer på serveren din — en ticket åpnes, et medlem blir svartelistet — sender TicketWave en POST med en JSON-body til en URL du eier.

Det er forskjellen fra Log Channels: log channels skriver en embed inn i Discord for mennesker å lese, mens webhooks sender den rå hendelsen videre til koden din.

Webhooks er en premium-funksjon. Uten premium kan ikke endpoints opprettes, og ingen hendelser leveres.

Opprett et Endpoint

Åpne siden for endpoints

Server dashboard → WebhooksEndpoints.

Legg til et endpoint

Klikk Add Endpoint og fyll inn to felt:

FieldDescription
Endpoint URLhttps://-URL-en som mottar forespørslene
Event TypesHvilke hendelser dette endpointet skal motta

Et endpoint mottar bare typene du krysser av. Det er ikke lov å velge ingen — velg minst én.

Kopier signeringshemmeligheten

TicketWave genererer en signeringshemmelighet (whsec_…) i det øyeblikket endpointet opprettes. Åpne listen over endpoints, vis den med øye-ikonet og kopier den inn i konfigurasjonen til applikasjonen din.

Behandle hemmeligheten som et passord. Alle som har den kan forfalske forespørsler som består signaturkontrollen din. Oppbevar den i en miljøvariabel, aldri i repositoryet ditt.

Send en testhendelse

Bruk knappen Send test event (papirflyet) på raden for endpointet. Den leverer en ekte, fullt signert forespørsel med "test": true i payloaden, slik at du kan bekrefte at mottakeren din fungerer før en ekte ticket er avhengig av den.

Resultatet vises i Webhooks-historikken som enhver annen levering.

Krav til Endpoint

RequirementDetail
SchemeKun https://http:// avvises
HostMå kunne løses offentlig. Private, loopback-, link-local- og CGNAT-adresser avvises
ResponseEnhver 2xx-status regnes som suksess
TimeoutDu har 10 sekunder på å svare
RedirectsFølges ikke. En 3xx regnes som feil
LimitOpptil 5 endpoints per server

Host-sjekken skjer både når du lagrer endpointet og før hver eneste levering, så et domene som senere begynner å peke til en intern adresse, slutter å få leveranser.

Forespørselen

Hver levering er en POST med en JSON-body.

Headers

HeaderExampleMeaning
Content-Typeapplication/jsonAlltid JSON
User-AgentTicketWave-Webhooks/1.0.5Bot-versjonen som sendte den
X-TicketWave-Eventticket.createdHendelsestypen
X-TicketWave-Deliverywh_3f2a…Unik id for denne leveringen
X-TicketWave-Timestamp1786224191Unix-sekunder, del av signaturen
X-TicketWave-Signaturesha256=9f86d0…HMAC av forespørselen

Body

Hver payload bruker samme innpakning. Bare data varierer per hendelsestype:

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

Se Event Reference for data-objektet for hver type.

Verifisere signaturen

Alle som oppdager URL-en til endpointet ditt kan sende en POST-forespørsel til den. Signaturen er måten du skiller en ekte TicketWave-levering fra en forfalsket.

Verifiser alltid. Et uverifisert endpoint som oppretter eller lukker ting i systemet ditt, er en åpen dør.

Hvordan signaturen bygges

TicketWave slår sammen tidsstempelet og den forespørselsteksten med et punktum, og kjører HMAC-SHA256 over resultatet ved hjelp av hemmeligheten til endpointet ditt:

signed_payload = X-TicketWave-Timestamp + "." + raw_request_body
signature      = HMAC_SHA256(signed_payload, your_endpoint_secret)

Headeren inneholder denne digesten hex-enkodet og prefikset: sha256=<digest>.

Hva mottakeren din må gjøre

Les den rå bodyen. Verifiser mot de eksakte bytesene du mottok. Hvis rammeverket ditt parser JSON først og du serialiserer det på nytt, kan nøkkelrekkefølge eller mellomrom endre seg, og digesten vil ikke matche.

Beregn HMAC-en på nytt over timestamp + "." + rawBody med hemmeligheten din.

Sammenlign i konstant tid (crypto.timingSafeEqual i Node). En vanlig === lekker tidsinformasjon.

Sjekk at tidsstempelet er nylig — fem minutters slingringsmonn er et godt standardvalg. Tidsstempelet ligger i den signerte payloaden, så en angriper kan ikke spille av en gammel forespørsel på nytt med et ferskt tidsstempel.

En komplett implementasjon finnes på siden Example Server.

Retries

En levering som feiler, prøves automatisk på nytt.

Attempts3 (første forsøk pluss 2 retries)
Backoff1 sekund, deretter 5 sekunder
Retried onNettverksfeil, timeouts, 408, 429 og alle 5xx
Not retried onAlle andre 4xx — de betyr at endpointet ditt avviste forespørselen med vilje

På grunn av retries kan endpointet ditt motta samme hendelse to ganger. Bruk X-TicketWave-Delivery som en idempotensnøkkel: husk id-ene du har behandlet og ignorer gjentakelser.

Leveranser er ikke ordnet. Hvis to tickets opprettes samtidig, kan forespørslene komme i hvilken som helst rekkefølge — bruk timestamp-feltet i bodyen hvis rekkefølge er viktig for deg.

Leveringshistorikk

På dashboardets Webhooks-side listes hver levering med status, responskode, varighet og antall forsøk. Åpne en rad for å se den nøyaktige forespørselspayloaden som ble sendt, og responsen serveren din returnerte.

Mislykkede leveranser kan sendes på nytt fra detaljsiden med Retry Webhook. Den sender den opprinnelige payloaden til samme endpoint igjen og registrerer en ny levering.

Historikken lagres i 30 dager, og ryddes deretter automatisk opp.

Feilsøking

ProblemFix
Endpointet kan ikke lagresURL-en må være https:// og løses til en offentlig adresse
Alt vises som mislykket uten responskodeForespørselen nådde deg aldri — timeout, DNS-feil eller connection refused
Signaturen matcher aldriDu hasher den parserte bodyen i stedet for de rå bytesene, eller glemte prefikset timestamp + "."
Leveranser stopper etter en stundSjekk om hosten din begynte å returnere 4xx — de prøves ikke på nytt
En hendelse kommer aldriEndpointet er ikke abonnert på den typen, eller serveren mistet premium
Dupliserte hendelserForventet ved retries — dedupliser på X-TicketWave-Delivery

Neste steg

How is this guide?