Skip to content

Webhooks

Webhooks let your own systems react to what happens on your servers. You register a URL, and Gamemanage sends it a POST request when an event fires. Every request is signed so you can confirm it came from us, and failed deliveries are retried.

Register a URL

Go to your panel settings, open the Webhooks tab, and add the URL you want to receive events. The URL must accept POST and respond with a 2xx status. Anything else counts as a failure and triggers a retry.

Events

These are the events Gamemanage sends:

  • server.down — the agent stopped reporting in and the server is considered offline
  • server.up — the server came back and the agent is reporting again
  • backup.completed — a scheduled backup finished
  • payment events — billing changes on your account, such as a successful charge or a failed payment

Payload

Each delivery is a single JSON object describing the event. The exact body depends on the event type, but every request includes the event name and a signature header you use to verify it.

{
  "event": "server.down",
  "server": "gm_live_xxxx",
  "timestamp": "2026-06-08T14:21:00Z"
}

Verify the signature

Every request carries an HMAC signature computed over the raw request body using the secret shown next to your webhook in the panel. Compute the same HMAC on your end over the bytes you received and compare it to the header. If they do not match, reject the request.

# pseudo-verification
signature = HMAC_SHA256(secret, raw_request_body)
if signature != header_signature:
    reject()

Note: Verify against the raw request body, not a re-serialized version of the parsed JSON. If your framework reformats the body before you read it (reordered keys, changed whitespace), the HMAC will not match even when the request is genuine.

Retries

If your endpoint returns a non-2xx status or times out, Gamemanage retries the delivery. Make your handler idempotent so a retried event does not get processed twice. Returning a 2xx as soon as you have stored the event, then doing the slow work afterward, keeps you from timing out and triggering avoidable retries.