Skip to content

Email Webhook Events

SendAPI fires HTTP POST requests to your webhook URL for all significant email lifecycle events.

Event: email.sent

Fired when an email has been accepted and dispatched to the sending infrastructure.

json
{
  "event": "email.sent",
  "timestamp": "2026-03-09T14:30:01Z",
  "data": {
    "id": 185,
    "to": "alice@example.com",
    "subject": "Welcome to SendAPI",
    "sent_at": "2026-03-09T14:30:01Z"
  }
}

Event: email.delivered

Fired when the receiving mail server confirms delivery.

json
{
  "event": "email.delivered",
  "timestamp": "2026-03-09T14:30:05Z",
  "data": {
    "id": 185,
    "to": "alice@example.com",
    "delivered_at": "2026-03-09T14:30:05Z"
  }
}

Event: email.opened

Fired when the tracking pixel is loaded by the recipient.

json
{
  "event": "email.opened",
  "timestamp": "2026-03-09T14:45:00Z",
  "data": {
    "id": 185,
    "to": "alice@example.com",
    "opened_at": "2026-03-09T14:45:00Z"
  }
}

Event: email.clicked

Fired when the recipient clicks a tracked link in the email.

json
{
  "event": "email.clicked",
  "timestamp": "2026-03-09T14:46:00Z",
  "data": {
    "id": 185,
    "to": "alice@example.com",
    "url": "https://myapp.com/dashboard",
    "clicked_at": "2026-03-09T14:46:00Z"
  }
}

Event: email.bounced

Fired when the email is permanently rejected by the receiving server (hard bounce).

json
{
  "event": "email.bounced",
  "timestamp": "2026-03-09T14:30:10Z",
  "data": {
    "id": 185,
    "to": "invalid@notadomain.xyz",
    "bounce_type": "hard",
    "error": "550 5.1.1 User unknown",
    "bounced_at": "2026-03-09T14:30:10Z"
  }
}

Event: email.complained

Fired when the recipient marks the email as spam.

json
{
  "event": "email.complained",
  "timestamp": "2026-03-09T15:00:00Z",
  "data": {
    "id": 185,
    "to": "alice@example.com",
    "complained_at": "2026-03-09T15:00:00Z"
  }
}

Bounce Handling

Bounce events are forwarded to you in real time. SendAPI does not currently maintain an automatic suppression list — you're responsible for honouring your own list and avoiding repeated sends to addresses that have hard-bounced. We recommend storing bounced addresses on your side and skipping future sends to them to protect your sender reputation.

Released under the MIT License.