Every webhook is a POST with Content-Type: application/json. For a generic URL, the body is { event: "submission.created", submission: { id, form_name, data, ip_address, referer, created_at } }, where data holds your form fields as a key-value object. The X-Splitforms-Signature header is 'sha256=' followed by the hex HMAC-SHA256 of the raw request body, computed with the per-webhook secret — use it to verify the request really came from splitforms. There's also an X-Splitforms-Event header (currently always 'submission.created'). If your URL matches a known Slack, Discord, Telegram, or WhatsApp (CallMeBot) endpoint, splitforms detects it and sends that platform's native message format instead of the generic JSON shape.