Skip to content

Webhook Signatures

When a webhook has a signing secret, every delivery includes an X-Webhook-Signature header containing the HMAC-SHA256 hex digest of the request body.

{
"event": "snapshot.created",
"data": { "snapshotId": "a1b2c3d4-...", "machineName": "james-mbp" },
"timestamp": "2026-02-07T12:00:00.000Z"
}
EventData fields
snapshot.createdsnapshotId, machineName
snapshot.deletedsnapshotId
file.uploadedfileId, filename
file.deletedfileId, filename
member.invitedmemberId, role, invitedBy
member.removedmemberId, apiKeyId

Compute the HMAC-SHA256 of the raw request body with your webhook secret and compare it to X-Webhook-Signature.

import { createHmac, timingSafeEqual } from 'crypto';
function verify(body, secret, signature) {
const expected = createHmac('sha256', secret).update(body).digest('hex');
return timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}
import hmac, hashlib
def verify(body: bytes, secret: str, signature: str) -> bool:
expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)
PropertyValue
MethodPOST
Content-Typeapplication/json
Timeout10 seconds
RetriesNone (single attempt)
Stored responseFirst 1,000 characters

Check delivery status via GET /machine/webhooks/:id.