Webhooks can be used to receive notifications when certain events occur in incident.io. This might be useful for annotating graphs in a monitoring tool with incidents, or keeping track of follow-ups in another system. Our webhooks are powered by Svix.
To start using webhooks, you’ll need to create a webhook endpoint. You can do this in the same way that you’d create any other endpoint in your application. If you’d like to play around with our webhooks, we’d recommend using Svix play which allows you to set up an endpoint and inspect the payloads via their web interface. There are also other services (e.g. ngrok) which have great debugging tools to help getting started with webhooks.
Once you have a webhook endpoint set up, you can head to Settings > Webhooks to configure your endpoint. In here you'll be able to choose which types of events you'd like to recieve, send test events, see recent event deliveries, and retry any failed events.
When processing webhooks, please return a 2xx status code (e.g. 200 OK
or 204 No Content
). If the endpoint returns a non-2xx status code, we’ll try to resend the event with a backoff over the next 24 hours. If attempts to a specific endpoint repeatedly fail over a 5 day period, we’ll mark the endpoint as disabled and notify you via email. If you do miss some messages (e.g. due to unexpected downtime), Svix offer a number of options for replaying messages which you can access via Settings > Webhooks.
It’s important to know whether a webhook has come from incident.io, or a third party that might be trying to exploit a vulnerability. To avoid this, we send a signature
in the header of our webhooks, which you can verify using the Signing secret
from the webhook endpoint settings page. The webhooks we send will have three headers that you’ll want to look at:
{
"webhook-id": "123",
"webhook-timestamp": 1676033031,
"webhook-signature": "v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE="
}
These are signed using a HMAC signature in the following format:
${webhook-id}.${webhook-timestamp}.${request_body}
You can verify the signature either using the Svix client libraries, or manually by following these instructions.
A common use-case for webhooks is to keep another system up-to-date with everything that’s happening in incident.io. As we deliver webhooks individually over HTTPS, we cannot guarantee that they’ll be delivered in the correct order. That means that, to keep the other system up-to-date, we’d recommend that you build an application which:
This means you aren’t relying on the order in which you receive webhooks to make sure your system remains up-to-date.
In general, we try to send webhooks with all the relevant information in the payload (e.g. the name, summary, status etc.). However, private incidents are the exception. For private incidents, we only send the ID of the resource that’s been changed. If your integration needs to access the full data, you’ll need to create an API Key that can view private incidents. You can then use that key to get the details about the specific incident or follow-up. This is to make sure we don’t leak information about private incidents to a system that shouldn’t have access to them.
This webhook is emitted whenever a user is given access to a private incident.
OK response.
{- "event_type": "private_incident.membership_granted_v1",
- "private_incident.membership_granted_v1": {
- "actor_user_id": "abc123",
- "incident_id": "abc123",
- "user_id": "abc123"
}
}
This webhook is emitted whenever a user's access to a private incident is revoked.
OK response.
{- "event_type": "private_incident.membership_revoked_v1",
- "private_incident.membership_revoked_v1": {
- "actor_user_id": "abc123",
- "incident_id": "abc123",
- "user_id": "abc123"
}
}
This webhook is emitted whenever a follow-up is created.
OK response.
{- "event_type": "public_incident.action_created_v1",
- "public_incident.action_created_v1": {
- "assignee": {
- "email": "lisa@incident.io",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Lisa Karlin Curtis",
- "role": "viewer",
- "slack_user_id": "U02AYNF2XJM"
}, - "completed_at": "2021-08-17T13:28:57.801578Z",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Call the fire brigade",
- "external_issue_reference": {
- "issue_name": "INC-123",
- "provider": "asana"
}, - "follow_up": true,
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "incident_id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "status": "outstanding",
- "updated_at": "2021-08-17T13:28:57.801578Z"
}
}
This webhook is emitted whenever a follow-up is updated.
OK response.
{- "event_type": "public_incident.action_updated_v1",
- "public_incident.action_updated_v1": {
- "assignee": {
- "email": "lisa@incident.io",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Lisa Karlin Curtis",
- "role": "viewer",
- "slack_user_id": "U02AYNF2XJM"
}, - "completed_at": "2021-08-17T13:28:57.801578Z",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Call the fire brigade",
- "external_issue_reference": {
- "issue_name": "INC-123",
- "provider": "asana"
}, - "follow_up": true,
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "incident_id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "status": "outstanding",
- "updated_at": "2021-08-17T13:28:57.801578Z"
}
}
This webhook is emitted whenever a follow-up is created.
OK response.
{- "event_type": "public_incident.follow_up_created_v1",
- "public_incident.follow_up_created_v1": {
- "assignee": {
- "email": "lisa@incident.io",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Lisa Karlin Curtis",
- "role": "viewer",
- "slack_user_id": "U02AYNF2XJM"
}, - "completed_at": "2021-08-17T13:28:57.801578Z",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Call the fire brigade",
- "external_issue_reference": {
- "issue_name": "INC-123",
- "provider": "asana"
}, - "follow_up": true,
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "incident_id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "status": "outstanding",
- "updated_at": "2021-08-17T13:28:57.801578Z"
}
}
This webhook is emitted whenever a follow-up is updated.
OK response.
{- "event_type": "public_incident.follow_up_updated_v1",
- "public_incident.follow_up_updated_v1": {
- "assignee": {
- "email": "lisa@incident.io",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Lisa Karlin Curtis",
- "role": "viewer",
- "slack_user_id": "U02AYNF2XJM"
}, - "completed_at": "2021-08-17T13:28:57.801578Z",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Call the fire brigade",
- "external_issue_reference": {
- "issue_name": "INC-123",
- "provider": "asana"
}, - "follow_up": true,
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "incident_id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "status": "outstanding",
- "updated_at": "2021-08-17T13:28:57.801578Z"
}
}
This webhook is emitted whenever a new incident is created.
OK response.
{- "event_type": "public_incident.incident_created_v2",
- "public_incident.incident_created_v2": {
- "created_at": "2021-08-17T13:28:57.801578Z",
- "creator": {
- "api_key": {
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "My test API key"
}, - "user": {
- "email": "lisa@incident.io",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Lisa Karlin Curtis",
- "role": "viewer",
- "slack_user_id": "U02AYNF2XJM"
}
}, - "custom_field_entries": [
- {
- "custom_field": {
- "description": "Which team is impacted by this issue",
- "field_type": "single_select",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Affected Team",
- "options": [
- {
- "custom_field_id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "sort_key": 10,
- "value": "Product"
}
]
}, - "values": [
- {
- "value_catalog_entry": {
- "aliases": [
- "lawrence@incident.io",
- "lawrence"
], - "external_id": "761722cd-d1d7-477b-ac7e-90f9e079dc33",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Primary On-call"
}, - "value_numeric": "123.456",
- "value_option": {
- "custom_field_id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "sort_key": 10,
- "value": "Product"
}, - "value_text": "This is my text field, I hope you like it"
}
]
}
], - "duration_metrics": [
- {
- "duration_metric": {
- "id": "01FCNDV6P870EA6S7TK1DSYD5H",
- "name": "Lasted"
}, - "value_seconds": 1
}
], - "external_issue_reference": {
- "issue_name": "INC-123",
- "provider": "asana"
}, - "has_debrief": false,
- "id": "01FDAG4SAP5TYPT98WGR2N7W91",
- "incident_role_assignments": [
- {
- "assignee": {
- "email": "lisa@incident.io",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Lisa Karlin Curtis",
- "role": "viewer",
- "slack_user_id": "U02AYNF2XJM"
}, - "role": {
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "The person currently coordinating the incident",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "instructions": "Take point on the incident; Make sure people are clear on responsibilities",
- "name": "Incident Lead",
- "required": false,
- "role_type": "lead",
- "shortform": "lead",
- "updated_at": "2021-08-17T13:28:57.801578Z"
}
}
], - "incident_status": {
- "category": "triage",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Impact has been **fully mitigated**, and we're ready to learn from this incident.",
- "id": "01FCNDV6P870EA6S7TK1DSYD5H",
- "name": "Closed",
- "rank": 4,
- "updated_at": "2021-08-17T13:28:57.801578Z"
}, - "incident_timestamp_values": [
- {
- "incident_timestamp": {
- "id": "01FCNDV6P870EA6S7TK1DSYD5H",
- "name": "Impact started",
- "rank": 1
}, - "value": {
- "value": "2021-08-17T13:28:57.801578Z"
}
}
], - "incident_type": {
- "create_in_triage": "always",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Customer facing production outages",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "is_default": false,
- "name": "Production Outage",
- "private_incidents_only": false,
- "updated_at": "2021-08-17T13:28:57.801578Z"
}, - "mode": "standard",
- "most_recent_update_message": "We're working on a fix, hoping to ship in the next 30 minutes",
- "name": "Our database is sad",
- "reference": "INC-123",
- "related_incidents": [
- "INC-237"
], - "severity": {
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Issues with **low impact**.",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Minor",
- "rank": 1,
- "updated_at": "2021-08-17T13:28:57.801578Z"
}, - "slack_channel_id": "C02AW36C1M5",
- "slack_channel_name": "inc-165-green-parrot",
- "slack_team_id": "T02A1FSLE8J",
- "summary": "Our database is really really sad, and we don't know why yet.",
- "updated_at": "2021-08-17T13:28:57.801578Z",
- "visibility": "public",
- "workload_minutes_late": 40.7,
- "workload_minutes_sleeping": 0,
- "workload_minutes_total": 60.7,
- "workload_minutes_working": 20
}
}
This webhook is emitted whenever an incident's status changes.
OK response.
{- "event_type": "public_incident.incident_status_updated_v2",
- "public_incident.incident_status_updated_v2": {
- "incident": {
- "created_at": "2021-08-17T13:28:57.801578Z",
- "creator": {
- "api_key": {
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "My test API key"
}, - "user": {
- "email": "lisa@incident.io",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Lisa Karlin Curtis",
- "role": "viewer",
- "slack_user_id": "U02AYNF2XJM"
}
}, - "custom_field_entries": [
- {
- "custom_field": {
- "description": "Which team is impacted by this issue",
- "field_type": "single_select",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Affected Team",
- "options": [
- {
- "custom_field_id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "sort_key": 10,
- "value": "Product"
}
]
}, - "values": [
- {
- "value_catalog_entry": {
- "aliases": [
- "lawrence@incident.io",
- "lawrence"
], - "external_id": "761722cd-d1d7-477b-ac7e-90f9e079dc33",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Primary On-call"
}, - "value_numeric": "123.456",
- "value_option": {
- "custom_field_id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "sort_key": 10,
- "value": "Product"
}, - "value_text": "This is my text field, I hope you like it"
}
]
}
], - "duration_metrics": [
- {
- "duration_metric": {
- "id": "01FCNDV6P870EA6S7TK1DSYD5H",
- "name": "Lasted"
}, - "value_seconds": 1
}
], - "external_issue_reference": {
- "issue_name": "INC-123",
- "provider": "asana"
}, - "has_debrief": false,
- "id": "01FDAG4SAP5TYPT98WGR2N7W91",
- "incident_role_assignments": [
- {
- "assignee": {
- "email": "lisa@incident.io",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Lisa Karlin Curtis",
- "role": "viewer",
- "slack_user_id": "U02AYNF2XJM"
}, - "role": {
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "The person currently coordinating the incident",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "instructions": "Take point on the incident; Make sure people are clear on responsibilities",
- "name": "Incident Lead",
- "required": false,
- "role_type": "lead",
- "shortform": "lead",
- "updated_at": "2021-08-17T13:28:57.801578Z"
}
}
], - "incident_status": {
- "category": "triage",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Impact has been **fully mitigated**, and we're ready to learn from this incident.",
- "id": "01FCNDV6P870EA6S7TK1DSYD5H",
- "name": "Closed",
- "rank": 4,
- "updated_at": "2021-08-17T13:28:57.801578Z"
}, - "incident_timestamp_values": [
- {
- "incident_timestamp": {
- "id": "01FCNDV6P870EA6S7TK1DSYD5H",
- "name": "Impact started",
- "rank": 1
}, - "value": {
- "value": "2021-08-17T13:28:57.801578Z"
}
}
], - "incident_type": {
- "create_in_triage": "always",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Customer facing production outages",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "is_default": false,
- "name": "Production Outage",
- "private_incidents_only": false,
- "updated_at": "2021-08-17T13:28:57.801578Z"
}, - "mode": "standard",
- "name": "Our database is sad",
- "reference": "INC-123",
- "severity": {
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Issues with **low impact**.",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Minor",
- "rank": 1,
- "updated_at": "2021-08-17T13:28:57.801578Z"
}, - "slack_channel_id": "C02AW36C1M5",
- "slack_channel_name": "inc-165-green-parrot",
- "slack_team_id": "T02A1FSLE8J",
- "summary": "Our database is really really sad, and we don't know why yet.",
- "updated_at": "2021-08-17T13:28:57.801578Z",
- "visibility": "public",
- "workload_minutes_late": 40.7,
- "workload_minutes_sleeping": 0,
- "workload_minutes_total": 60.7,
- "workload_minutes_working": 20
}, - "message": "We're working on a fix, hoping to ship in the next 30 minutes",
- "new_status": {
- "category": "triage",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Impact has been **fully mitigated**, and we're ready to learn from this incident.",
- "id": "01FCNDV6P870EA6S7TK1DSYD5H",
- "name": "Closed",
- "rank": 4,
- "updated_at": "2021-08-17T13:28:57.801578Z"
}, - "previous_status": {
- "category": "triage",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Impact has been **fully mitigated**, and we're ready to learn from this incident.",
- "id": "01FCNDV6P870EA6S7TK1DSYD5H",
- "name": "Closed",
- "rank": 4,
- "updated_at": "2021-08-17T13:28:57.801578Z"
}
}
}
This webhook is emitted whenever an incident is updated.
OK response.
{- "event_type": "public_incident.incident_updated_v2",
- "public_incident.incident_updated_v2": {
- "created_at": "2021-08-17T13:28:57.801578Z",
- "creator": {
- "api_key": {
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "My test API key"
}, - "user": {
- "email": "lisa@incident.io",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Lisa Karlin Curtis",
- "role": "viewer",
- "slack_user_id": "U02AYNF2XJM"
}
}, - "custom_field_entries": [
- {
- "custom_field": {
- "description": "Which team is impacted by this issue",
- "field_type": "single_select",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Affected Team",
- "options": [
- {
- "custom_field_id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "sort_key": 10,
- "value": "Product"
}
]
}, - "values": [
- {
- "value_catalog_entry": {
- "aliases": [
- "lawrence@incident.io",
- "lawrence"
], - "external_id": "761722cd-d1d7-477b-ac7e-90f9e079dc33",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Primary On-call"
}, - "value_numeric": "123.456",
- "value_option": {
- "custom_field_id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "sort_key": 10,
- "value": "Product"
}, - "value_text": "This is my text field, I hope you like it"
}
]
}
], - "duration_metrics": [
- {
- "duration_metric": {
- "id": "01FCNDV6P870EA6S7TK1DSYD5H",
- "name": "Lasted"
}, - "value_seconds": 1
}
], - "external_issue_reference": {
- "issue_name": "INC-123",
- "provider": "asana"
}, - "has_debrief": false,
- "id": "01FDAG4SAP5TYPT98WGR2N7W91",
- "incident_role_assignments": [
- {
- "assignee": {
- "email": "lisa@incident.io",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Lisa Karlin Curtis",
- "role": "viewer",
- "slack_user_id": "U02AYNF2XJM"
}, - "role": {
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "The person currently coordinating the incident",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "instructions": "Take point on the incident; Make sure people are clear on responsibilities",
- "name": "Incident Lead",
- "required": false,
- "role_type": "lead",
- "shortform": "lead",
- "updated_at": "2021-08-17T13:28:57.801578Z"
}
}
], - "incident_status": {
- "category": "triage",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Impact has been **fully mitigated**, and we're ready to learn from this incident.",
- "id": "01FCNDV6P870EA6S7TK1DSYD5H",
- "name": "Closed",
- "rank": 4,
- "updated_at": "2021-08-17T13:28:57.801578Z"
}, - "incident_timestamp_values": [
- {
- "incident_timestamp": {
- "id": "01FCNDV6P870EA6S7TK1DSYD5H",
- "name": "Impact started",
- "rank": 1
}, - "value": {
- "value": "2021-08-17T13:28:57.801578Z"
}
}
], - "incident_type": {
- "create_in_triage": "always",
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Customer facing production outages",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "is_default": false,
- "name": "Production Outage",
- "private_incidents_only": false,
- "updated_at": "2021-08-17T13:28:57.801578Z"
}, - "mode": "standard",
- "most_recent_update_message": "We're working on a fix, hoping to ship in the next 30 minutes",
- "name": "Our database is sad",
- "reference": "INC-123",
- "related_incidents": [
- "INC-237"
], - "severity": {
- "created_at": "2021-08-17T13:28:57.801578Z",
- "description": "Issues with **low impact**.",
- "id": "01FCNDV6P870EA6S7TK1DSYDG0",
- "name": "Minor",
- "rank": 1,
- "updated_at": "2021-08-17T13:28:57.801578Z"
}, - "slack_channel_id": "C02AW36C1M5",
- "slack_channel_name": "inc-165-green-parrot",
- "slack_team_id": "T02A1FSLE8J",
- "summary": "Our database is really really sad, and we don't know why yet.",
- "updated_at": "2021-08-17T13:28:57.801578Z",
- "visibility": "public",
- "workload_minutes_late": 40.7,
- "workload_minutes_sleeping": 0,
- "workload_minutes_total": 60.7,
- "workload_minutes_working": 20
}
}