Developer API

Webhooks

We POST JSON to your HTTPS endpoint, signed with Svix-compatible headers (svix-id, svix-timestamp, svix-signature). Respond with 2xx within 15 seconds. Failed deliveries are retried after 5s, 5m, 30m, 2h, 5h, 10h and 10h; endpoints failing for 5 days are disabled.

Event types

email.sent · email.scheduled · email.delivered · email.delivery_delayed · email.bounced · email.complained · email.opened · email.clicked · email.failed · email.suppressed · email.canceled · contact.created · contact.updated · contact.deleted · domain.created · domain.updated · domain.deleted

Payload

Every event has type, created_at and data. Email events include email_id, from, to, subject and tags; bounces add bounce, clicks add click.

{
  "type": "email.bounced",
  "created_at": "2026-10-15T10:01:12.000Z",
  "data": {
    "created_at": "2026-10-15T10:00:00.000Z",
    "email_id": "4ef9a417-02e9-4d39-ad75-9611e0fcc33c",
    "from": "Acme <hello@acme.com>",
    "to": [
      "missing@example.com"
    ],
    "subject": "Your receipt",
    "bounce": {
      "type": "Permanent",
      "subType": "General",
      "message": "550 5.1.1 user unknown"
    }
  }
}

Verify signatures

Use the endpoint's signing secret (whsec_…). With the svix package:

import { Webhook } from "svix"

const wh = new Webhook(process.env.IRESENDLY_WEBHOOK_SECRET)

export async function POST(req) {
  const payload = await req.text()
  const event = wh.verify(payload, {
    "svix-id": req.headers.get("svix-id"),
    "svix-timestamp": req.headers.get("svix-timestamp"),
    "svix-signature": req.headers.get("svix-signature"),
  })
  return new Response("ok")
}

Create webhook

POST/webhooks

Returns the signing secret.

Body parameters

endpointstringrequired

Public HTTPS URL.

eventsstring[]required

Event types to receive.

Request

curl -X POST 'https://api.iresendly.com/webhooks' \
  -H 'Authorization: Bearer irs_xxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
  "endpoint": "https://api.acme.com/webhooks/iresendly",
  "events": [
    "email.delivered",
    "email.bounced"
  ]
}'

Response

{
  "object": "webhook",
  "id": "4dd369bc-aa82-4ff3-97de-514ae3000ee0",
  "signing_secret": "whsec_xxxxxxxxxx"
}

List webhooks

GET/webhooks

All endpoints.

Request

curl -X GET 'https://api.iresendly.com/webhooks' \
  -H 'Authorization: Bearer irs_xxxxxxxxx'

Response

{
  "object": "list",
  "has_more": false,
  "data": []
}

Retrieve webhook

GET/webhooks/{id}

Includes the signing secret.

Request

curl -X GET 'https://api.iresendly.com/webhooks/{id}' \
  -H 'Authorization: Bearer irs_xxxxxxxxx'

Response

{
  "object": "webhook",
  "id": "4dd369bc-…",
  "endpoint": "https://api.acme.com/webhooks/iresendly",
  "status": "enabled"
}

Update webhook

PATCH/webhooks/{id}

endpoint, events or status (enabled/disabled).

Request

curl -X PATCH 'https://api.iresendly.com/webhooks/{id}' \
  -H 'Authorization: Bearer irs_xxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
  "status": "disabled"
}'

Response

{
  "object": "webhook",
  "id": "4dd369bc-…"
}

Delete webhook

DELETE/webhooks/{id}

Stops deliveries.

Request

curl -X DELETE 'https://api.iresendly.com/webhooks/{id}' \
  -H 'Authorization: Bearer irs_xxxxxxxxx'

Response

{
  "object": "webhook",
  "id": "4dd369bc-…",
  "deleted": true
}