SendGrid fixture
Event Webhook (batched)
SendGrid batches multiple email events into a single webhook delivery — the payload is an array, not an object. Handle each event in the array independently.
When does it fire?
Emails sent through SendGrid generate events: processed, delivered, open, click, bounce, dropped, deferred, spamreport, unsubscribe. Default batching is up to 30 seconds.
Request headers
Content-Type: application/json
X-Twilio-Email-Event-Webhook-Signature: MEUCIQDx4hKkBHd9...
X-Twilio-Email-Event-Webhook-Timestamp: 1715600000Payload
[
{
"email": "[email protected]",
"timestamp": 1715600000,
"event": "delivered",
"sg_event_id": "rWVYmVk9bWFil1ZRz5_LBQ",
"sg_message_id": "14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0",
"smtp-id": "<[email protected]>",
"response": "250 OK"
},
{
"email": "[email protected]",
"timestamp": 1715600060,
"event": "open",
"sg_event_id": "8X4kQX4tQK_6OBP-XAJD2A",
"sg_message_id": "14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0",
"useragent": "Mozilla/5.0",
"ip": "192.0.2.1"
}
]Key fields
[].eventdelivered | open | click | bounce | dropped | spamreport | unsubscribe — switch on this.
[].sg_event_idUnique per event — dedup key.
[].sg_message_idPer-message ID — useful for joining open/click events back to the original send.
[]Always an array. Iterate even if you expect a single event.
Test it with cURL
Replace your-endpoint with your HookSense endpoint slug — or any URL you want to test against.
curl -X POST https://hooksense.com/w/your-endpoint \
-H "Content-Type: application/json" \
-H "X-Twilio-Email-Event-Webhook-Signature: MEUCIQDx4hKkBHd9..." \
-H "X-Twilio-Email-Event-Webhook-Timestamp: 1715600000" \
-d '[
{
"email": "[email protected]",
"timestamp": 1715600000,
"event": "delivered",
"sg_event_id": "rWVYmVk9bWFil1ZRz5_LBQ",
"sg_message_id": "14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0",
"smtp-id": "<[email protected]>",
"response": "250 OK"
},
{
"email": "[email protected]",
"timestamp": 1715600060,
"event": "open",
"sg_event_id": "8X4kQX4tQK_6OBP-XAJD2A",
"sg_message_id": "14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0",
"useragent": "Mozilla/5.0",
"ip": "192.0.2.1"
}
]'Capture this in HookSense
Fire the cURL above at your HookSense endpoint and inspect the request in real time — with headers, body, signature verification, and replay.
Get a free endpoint