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 → Webhooks → Endpoints.
Legg til et endpoint
Klikk Add Endpoint og fyll inn to felt:
| Field | Description |
|---|---|
| Endpoint URL | https://-URL-en som mottar forespørslene |
| Event Types | Hvilke 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
| Requirement | Detail |
|---|---|
| Scheme | Kun https:// — http:// avvises |
| Host | Må kunne løses offentlig. Private, loopback-, link-local- og CGNAT-adresser avvises |
| Response | Enhver 2xx-status regnes som suksess |
| Timeout | Du har 10 sekunder på å svare |
| Redirects | Følges ikke. En 3xx regnes som feil |
| Limit | Opptil 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
| Header | Example | Meaning |
|---|---|---|
Content-Type | application/json | Alltid JSON |
User-Agent | TicketWave-Webhooks/1.0.5 | Bot-versjonen som sendte den |
X-TicketWave-Event | ticket.created | Hendelsestypen |
X-TicketWave-Delivery | wh_3f2a… | Unik id for denne leveringen |
X-TicketWave-Timestamp | 1786224191 | Unix-sekunder, del av signaturen |
X-TicketWave-Signature | sha256=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 rå 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.
| Attempts | 3 (første forsøk pluss 2 retries) |
| Backoff | 1 sekund, deretter 5 sekunder |
| Retried on | Nettverksfeil, timeouts, 408, 429 og alle 5xx |
| Not retried on | Alle 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
| Problem | Fix |
|---|---|
| Endpointet kan ikke lagres | URL-en må være https:// og løses til en offentlig adresse |
| Alt vises som mislykket uten responskode | Forespørselen nådde deg aldri — timeout, DNS-feil eller connection refused |
| Signaturen matcher aldri | Du hasher den parserte bodyen i stedet for de rå bytesene, eller glemte prefikset timestamp + "." |
| Leveranser stopper etter en stund | Sjekk om hosten din begynte å returnere 4xx — de prøves ikke på nytt |
| En hendelse kommer aldri | Endpointet er ikke abonnert på den typen, eller serveren mistet premium |
| Dupliserte hendelser | Forventet ved retries — dedupliser på X-TicketWave-Delivery |
Neste steg
- Event Reference (Hver hendelse og payloaden dens)
- Example Server (En kjørbar Express-mottaker)
- Log Channels (De samme hendelsene, men postet inn i Discord)
How is this guide?
