Every webhook delivery is a POST request with a JSON payload. This page documents the canonical payload structure and the data shape for each event type.
All webhook deliveries share this envelope:
json
1 {
2 "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
3 "created_at": "2026-04-25T10:15:30.123456+00:00",
4 "event_type": "email_delivered",
5 "data": { }
6 }
Field Type Description idstring (UUID) Unique identifier for this delivery created_atstring (ISO 8601) Timestamp when the event was dispatched event_typestring One of the supported event types dataobject Event-specific payload (see below)
Every delivery includes these headers:
Header Example Description Content-Typeapplication/jsonAlways JSON X-Synapse-Signaturesha256=a1b2c3d4...HMAC-SHA256 signature for verification X-Synapse-Eventemail_deliveredThe event type (same as event_type in the body) User-AgentSynapse-Webhooks/1.0Identifies the request as coming from Synapse
Fired when the email is accepted by the delivery provider for sending.
json
1 {
2 "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
3 "created_at": "2026-04-25T10:15:30+00:00",
4 "event_type": "email_sent",
5 "data": {
6 "email_log_id": "9a8b7c6d-5e4f-3a2b-1c0d-ef9876543210",
7 "contact_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
9 "subject": "Welcome to Acme",
10 "status": "sent"
11 }
12 }
Fired when the recipient's mail server confirms delivery.
json
1 {
2 "id": "a2b3c4d5-e6f7-8901-bcde-f12345678901",
3 "created_at": "2026-04-25T10:15:45+00:00",
4 "event_type": "email_delivered",
5 "data": {
6 "email_log_id": "9a8b7c6d-5e4f-3a2b-1c0d-ef9876543210",
7 "contact_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
9 "subject": "Welcome to Acme",
10 "status": "delivered"
11 }
12 }
Fired on a temporary delivery delay (soft bounce, busy server). The provider will retry automatically.
json
1 {
2 "id": "b3c4d5e6-f789-0123-cdef-234567890abc",
3 "created_at": "2026-04-25T10:16:00+00:00",
4 "event_type": "email_delivery_delayed",
5 "data": {
6 "email_log_id": "9a8b7c6d-5e4f-3a2b-1c0d-ef9876543210",
7 "contact_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
9 "subject": "Welcome to Acme",
10 "status": "delayed"
11 }
12 }
Fired when the recipient opens the email (pixel tracking).
json
1 {
2 "id": "c4d5e6f7-8901-2345-def0-3456789abcde",
3 "created_at": "2026-04-25T11:30:00+00:00",
4 "event_type": "email_opened",
5 "data": {
6 "email_log_id": "9a8b7c6d-5e4f-3a2b-1c0d-ef9876543210",
7 "contact_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
9 "subject": "Welcome to Acme",
10 "status": "opened"
11 }
12 }
Fired when the recipient clicks a link in the email.
json
1 {
2 "id": "d5e6f789-0123-4567-ef01-456789abcdef",
3 "created_at": "2026-04-25T11:32:00+00:00",
4 "event_type": "email_clicked",
5 "data": {
6 "email_log_id": "9a8b7c6d-5e4f-3a2b-1c0d-ef9876543210",
7 "contact_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
9 "subject": "Welcome to Acme",
10 "status": "clicked"
11 }
12 }
Fired when the email bounces (hard or soft bounce).
json
1 {
2 "id": "e6f78901-2345-6789-0123-56789abcdef0",
3 "created_at": "2026-04-25T10:16:05+00:00",
4 "event_type": "email_bounced",
5 "data": {
6 "email_log_id": "9a8b7c6d-5e4f-3a2b-1c0d-ef9876543210",
7 "contact_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
9 "subject": "Welcome to Acme",
10 "status": "bounced"
11 }
12 }
Fired when the recipient marks the email as spam.
json
1 {
2 "id": "f7890123-4567-89ab-cdef-6789abcdef01",
3 "created_at": "2026-04-25T12:00:00+00:00",
4 "event_type": "email_spam_reported",
5 "data": {
6 "email_log_id": "9a8b7c6d-5e4f-3a2b-1c0d-ef9876543210",
7 "contact_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
9 "subject": "Welcome to Acme",
10 "status": "spam_reported"
11 }
12 }
Fired when delivery permanently fails (not retryable).
json
1 {
2 "id": "08901234-5678-9abc-def0-789abcdef012",
3 "created_at": "2026-04-25T10:20:00+00:00",
4 "event_type": "email_failed",
5 "data": {
6 "email_log_id": "9a8b7c6d-5e4f-3a2b-1c0d-ef9876543210",
7 "contact_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
9 "subject": "Welcome to Acme",
10 "status": "failed"
11 }
12 }
Fired when the email is suppressed because the contact is on the suppression list.
json
1 {
2 "id": "19012345-6789-abcd-ef01-89abcdef0123",
3 "created_at": "2026-04-25T10:15:31+00:00",
4 "event_type": "email_suppressed",
5 "data": {
6 "email_log_id": "9a8b7c6d-5e4f-3a2b-1c0d-ef9876543210",
7 "contact_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
9 "subject": "Welcome to Acme",
10 "status": "suppressed"
11 }
12 }
All event payloads share the same data shape:
Field Type Description email_log_idstring (UUID) The Synapse email log record ID contact_idstring (UUID) The contact who received the email emailstring The recipient's email address subjectstring The email subject line statusstring The event status (matches the event type)
Additional fields may be added to the data object in future versions. Design your webhook handler to ignore unknown fields for forward compatibility.