The delivery
When a record changes in Salesforce, SFHooks POSTs a JSON body like the one below to your endpoint, with two extra headers: X-SFHooks-Timestamp (unix seconds) and X-SFHooks-Signature (t=<ts>,v1=<hex>). The signature is the HMAC-SHA256 of "<timestamp>.<raw body>" under your webhook's signing secret. Change the payload or the secret and watch the signature update.
Request body editable - the exact bytes that get signed
Not valid JSON - SFHooks always sends valid JSON, but the signature below is still computed over exactly what you typed.
What your endpoint receives recomputed live
The signature is recomputed in your browser with the Web Crypto API on every keystroke. Neither the secret nor the payload is sent anywhere - view source if you like.
Paste a request-bin URL (or your staging endpoint) and run the curl - you'll receive a byte-for-byte simulation of an SFHooks delivery, signature and all.
Verify it in four lines
Recompute the HMAC over the raw body and compare in constant time. A delivery may carry multiple v1 values during a zero-downtime secret rotation - accept the request if any of them matches.
Full details - rotation overlaps, gap reconciliation, and the "test": true marker on dashboard-sent test events - are in the signature docs.
This is a simulation - the real thing takes minutes
Connect your Salesforce org over OAuth, point a webhook at your endpoint, and press Send test event in the dashboard: the same payload shape arrives at your endpoint through the real pipeline - signed, retried if your endpoint blips, and logged per attempt. No managed package, no Apex.