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
/webhooksReturns the signing secret.
Body parameters
endpointstringrequiredPublic HTTPS URL.
eventsstring[]requiredEvent 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
/webhooksAll endpoints.
Request
curl -X GET 'https://api.iresendly.com/webhooks' \
-H 'Authorization: Bearer irs_xxxxxxxxx'Response
{
"object": "list",
"has_more": false,
"data": []
}Retrieve webhook
/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
/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
/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
}