Corsair
PluginsPagerDuty

PagerDuty Webhooks

All available PagerDuty webhook events

The PagerDuty plugin handles incoming webhook events from PagerDuty. Webhooks are identified by the x-pagerduty-signature header.

New to Corsair? Learn about webhooks, hooks, and multi-tenancy.

Full Implementation: See the PagerDuty plugin source code.

Setup

app/api/webhook/route.ts
import { processWebhook } from "corsair";
import { corsair } from "@/server/corsair";

export async function POST(request: Request) {
    const headers = Object.fromEntries(request.headers);
    const body = await request.json();

    const result = await processWebhook(corsair, headers, body);
    return result.response;
}

Configure your webhook secret:

corsair.ts
pagerduty({
    webhookSecret: process.env.PAGERDUTY_WEBHOOK_SECRET, 
})

Available Webhooks

triggered

incidents.triggered

Event Type: Incident Triggered

Fires when a new incident is created (triggered).

When it fires:

  • A new alert triggers a new incident
  • An incident is manually created

Payload:

{
    event: {
        id: "event-id",
        event_type: "incident.triggered",
        occurred_at: "2024-01-01T00:00:00Z",
        data: {
            id: "INC123", 
            title: "Production database is down",
            status: "triggered",
            urgency: "high",
            service: { id: "SERVICE123", name: "Production DB" },
            assignees: [{ id: "USER123" }],
        },
    },
}

Example Usage:

pagerduty({
    webhookHooks: {
        incidents: {
            triggered: {
                after: async (ctx, result) => {
                    await inngest.send({
                        name: "pagerduty/incident-triggered",
                        data: {
                            tenantId: ctx.tenantId,
                            incidentId: result.data.event?.data?.id,
                            title: result.data.event?.data?.title,
                            urgency: result.data.event?.data?.urgency,
                        },
                    });
                },
            },
        },
    },
})

Key Fields:

FieldTypeDescription
event.data.idstringIncident ID
event.data.titlestringIncident title
event.data.statusstringCurrent status
event.data.urgencystringUrgency level
event.data.serviceobjectAffected service

acknowledged

incidents.acknowledged

Event Type: Incident Acknowledged

Fires when someone acknowledges an incident.

When it fires:

  • A responder acknowledges the incident
  • An auto-acknowledgment rule fires

Payload:

{
    event: {
        event_type: "incident.acknowledged",
        data: {
            id: "INC123",
            status: "acknowledged", 
            acknowledged_by: [{ id: "USER123" }],
        },
    },
}

Example Usage:

pagerduty({
    webhookHooks: {
        incidents: {
            acknowledged: {
                after: async (ctx, result) => {
                    await inngest.send({
                        name: "pagerduty/incident-acknowledged",
                        data: {
                            tenantId: ctx.tenantId,
                            incidentId: result.data.event?.data?.id,
                        },
                    });
                },
            },
        },
    },
})

Key Fields:

FieldTypeDescription
event.data.acknowledged_byarrayUsers who acknowledged

resolved

incidents.resolved

Event Type: Incident Resolved

Fires when an incident is resolved.

When it fires:

  • A responder resolves the incident
  • Auto-resolution fires

Payload:

{
    event: {
        event_type: "incident.resolved",
        data: {
            id: "INC123",
            status: "resolved", 
            resolve_reason: "Fixed by reverting deploy",
        },
    },
}

Key Fields:

FieldTypeDescription
event.data.resolve_reasonstringWhy the incident was resolved

assigned

incidents.assigned

Event Type: Incident Assigned

Fires when an incident is assigned to a user or escalation policy.

When it fires:

  • Manual reassignment
  • Escalation policy triggers

Payload:

{
    event: {
        event_type: "incident.delegated",
        data: {
            id: "INC123",
            assignees: [{ id: "USER456", name: "On-call Engineer" }], 
        },
    },
}

Key Fields:

FieldTypeDescription
event.data.assigneesarrayNew assignees