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 jeg 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