Webhook-dokumentation

Brug webhooks til at modtage realtidsnotifikationer fra Mahoje Hosting i din applikation.

Hvad er webhooks?

En webhook er en HTTP POST-forespørgsel som Mahoje Hosting sender til din server, når en hændelse opstår — fx når en postkasse oprettes, en betaling modtages, eller et site deployes. Du registrerer en URL og vælger de events du vil lytte på.

Payload-format

Alle webhooks sendes som JSON med Content-Type: application/json:

{
  "event": "mailbox.created",
  "timestamp": 1735000000000,
  "data": {
    "name": "info",
    "domain": "ditdomaene.dk"
  }
}

Signaturverificering

Hver forespørgsel indeholder headeren X-Mahoje-Signature med et HMAC-SHA256-fingeraftryk:

X-Mahoje-Signature: sha256=abc123...

Verificér signaturen i din handler (Node.js):

import { createHmac, timingSafeEqual } from "node:crypto";

function verifySignature(payload, signature, secret) {
  const expected = "sha256=" + createHmac("sha256", secret)
    .update(payload).digest("hex");
  const a = Buffer.from(signature);
  const b = Buffer.from(expected);
  if (a.length !== b.length) return false;
  return timingSafeEqual(a, b);
}

Python-eksempel:

import hmac, hashlib

def verify_signature(payload: bytes, signature: str, secret: str) -> bool:
    expected = "sha256=" + hmac.new(
        secret.encode(), payload, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(signature, expected)

Retry-adfærd

Hvis din server svarer med en fejlkode (ikke 2xx) eller timeout, forsøger vi automatisk igen:

  • Første forsøg øjeblikkeligt
  • Andet forsøg efter 5 sekunder
  • Tredje forsøg efter 30 sekunder
  • Fjerde (og sidste) forsøg efter 2 minutter

Din handler bør svare inden for 10 sekunder. Brug en kø til tunge operationer.

Event-typer

EventBeskrivelse
mailbox.createdEn postkasse er oprettet
mailbox.deletedEn postkasse er slettet
alias.createdEt alias er oprettet
alias.deletedEt alias er slettet
domain.activeDNS-zone er aktiv (NS-skift bekræftet)
payment.receivedBetaling modtaget
payment.failedBetaling fejlet
site.deployedPreview-site deployet