Knowledge Base

Outgoing Webhooks

Note: This documentation is for version 2 of Outgoing Webhooks. For more information about version 1 Outgoing Webhooks, click here. Please note that all new webhook subscriptions are created for version 2, and cannot be made to use version 1.

Outgoing webhooks run upon the creation or development of an Issue, or upon changes to a Component's availability, notifying subscribed endpoints. A status page must have the Webhooks notifier enabled before users can add an endpoint via the Subscribe button.

Usage

A JSON payload is sent to the subscribed endpoint using the preferred HTTP verb. The payload structure depends on the type of event.

Core Payload

All webhook payloads will have the following core structure:

Example data:

{
  "created_at": 1543958160,
  "event": {
    "id": "5c06ee908fbb652ab878c197",
    "type": "event",
    "created_at": 1543958160,
    "kind": "SOMETHING_HAPPENED",
    "eventable": { },
    "contexts": {}
  },
  "subscription": {
    "id": "5c06ee908fbb652ab878c196",
    "type": "subscription",
    "created_at": 1543958160,
    "updated_at": 1543958160,
    "plugin": "webhook"
  },
  "status_page": {
    "name": "Company"
  },
  "_embedded": {
    "subscription": {
      "_links": {
        "update-form": {
          "href": "https://status.example.com/subscriptions/5c06ee9a8fbb652ab878c502/edit"
        }
      }
    },
    "status_page": {
      "_links": {
        "self-view": {
          "href": "https://status.example.com/"
        }
      }
    }
  }
}

JSON payloads use UNIX timestamps to represent time fields like created_at and updated_at.

created_at is the time at which this notification was generated.

event is an object representing the event that triggered this notification. The kind of event is given by event.kind (e.g. issue_created, restored, etc.). event.eventable is the object responsible for firing the event itself. event.contexts is an object containing extra objects that are related to eventable (e.g. event.contexts.components holds affected components when event.eventable is an issue).

subscription is an object representing the subscription that received this notification. Of course, for webhooks, subscription.plugin will always be webhook.

status_page is an object representing the status page itself, including the name/title of the page in status_page.name.

_embedded is a HAL embedded resource object, containing all relevant URL links to objects nested in the root notification object. Please note that Hund only stores embedded links, and not data, in the _embedded object. All nested data is left in its appropriate place in the root document (i.e. event, subscription, status_page, event.eventable, etc. are all nested within the root document itself for more intuitive traversal, rather than under _embedded as is customary, though not required, in HAL). For more concrete examples of the structure of _embedded, look below at other examples.

Since all webhooks contain a subscription and status_page object, the following HAL links are always supplied:

  • _embedded.subscription._links.update-form.href: a link to the subscription edit form from which this subscription can be edited/deleted.
  • status_page._links.self-view.href: a link to view the root of your status page.

Core Objects

There are various other objects that might be rendered in a number of different events (e.g. groups, components, issues, etc.). Their basic structures are described here.

Example data (Paged Array):

{
  "type": "paged_array",
  "total_count": 2,
  "data": [ ],
  "has_more": false
}

A "Paged Array" represents an array of objects that may have extra pages of results not given in the initial array. For webhooks, Paged Arrays will always be fully paged in, so no data will be missing from webhook requests.

total_count is the total number of objects across all pages of the represented array.

data is the array of objects itself.

has_more denotes whether there are more pages after this one to retrieve. For webhooks, this should always be false.

Example data (Component):

{
  "id": "5c06ee9b8fbb652ab878c509",
  "type": "component",
  "created_at": 1543958171,
  "updated_at": 1543958171,
  "name": "Component 113",
  "description": "**description**",
  "description_html": "\u003cp\u003e\u003cstrong\u003edescription\u003c/strong\u003e\u003c/p\u003e\n",
  "group": { },
  "percent_uptime": 100,
  "_links": {
    "self-view": {
      "href": "https://status.example.com/components/5c06ee9b8fbb652ab878c509"
    }
  }
}

description is the raw markdown version of the description, and description_html is the HTML rendering of description.

group is the Group that this Component belongs to. This will usually be an entire group object as described below, though in some cases it may be a string ID instead.

percent_uptime is the rolling monthly percent uptime of this Component.

_links.self-view.href is a link to view the Component on your status page. Note: this is a HAL link, thus _links will be moved to its appropriate location under _embedded when rendered in an actual notification. Please see some example notification payloads below to view where this link may be rendered depending on the event.

Example data (Group):

{
  "id": "5c06ee9b8fbb652ab878c508",
  "type": "group",
  "created_at": 1543958171,
  "updated_at": 1543958171,
  "name": "Group 114",
  "description": "**description**",
  "description_html": "\u003cp\u003e\u003cstrong\u003edescription\u003c/strong\u003e\u003c/p\u003e\n",
  "components": [
    "5c06ee9b8fbb652ab878c509"
  ]
}

As with components, description is the raw markdown version of the description, and description_html is the HTML rendering of description.

components are, of course, the Components that belong to this Group. For webhooks, this will be an array of string IDs.

Example data (Status):

{
  "id": "5c06ee9b8fbb652ab878c50c",
  "type": "status",
  "created_at": 1543958171,
  "updated_at": 1543958471,
  "watchdog": "5c06ee9b8fbb652ab878c503",
  "state": -1,
  "duration": 300,
  "began_at": 1543958171,
  "ended_at": 1543958471
}

watchdog is the ID of the Watchdog that generated this Status. Currently, this field is not of much use for webhooks.

state is the integer state of this Status, where -1 => "outage", 0 => "degraded", and 1 => "operational".

duration is the number of seconds that this Status has lasted for, until it is replaced by a new Status object of a different state.

began_at is the time at which this Status became effective for Components it applies to.

ended_at is the time at which this Status was replaced with a new Status update of a different state.

Example data (Issue):

{
  "id": "5c06ee978fbb652ab878c3b8",
  "type": "issue",
  "label": "assessed",
  "body": "**Lorem ipsum** _dolor sit amet_.",
  "html": "\u003cp\u003e\u003cstrong\u003eLorem ipsum\u003c/strong\u003e \u003cem\u003edolor sit amet\u003c/em\u003e.\u003c/p\u003e\n",
  "state_override": null,
  "created_at": 1543958167,
  "updated_at": 1543958167,
  "title": "Issue 34",
  "priority": 0,
  "components": [
    "5c06ee978fbb652ab878c3a5",
    "5c06ee978fbb652ab878c3ad",
    "5c06ee978fbb652ab878c3b5"
  ],
  "specialization": "general",
  "retrospective": false,
  "scheduled": false,
  "standing": true,
  "resolved": false,
  "cancelled": null,
  "began_at": 1543958167,
  "ended_at": null,
  "cancelled_at": null,
  "schedule": null,
  "updates": {
    "type": "paged_array",
    "total_count": 0,
    "data": [],
    "has_more": false
  }
}

label is the initial label applied to the issue. The "current" label of the entire issue may be updated by the labels of Issue Updates, though this must be taken from the latest Update in updates (described below).

body is the initial body text of the issue in raw markdown. html is an HTML rendered view of this markdown.

state_override is the integer state (-1, 0, 1 from the Status example above) which overrides the state of affected Components in component. A value of null indicates no override is present.

title is the title of the Issue.

priority is the integer priority of the Issue. Priority pertains to how notifications are triggered for this Issue: -1 indicates low priority, meaning no notifications whatsoever will be triggered for this issue; 0 indicates normal priority, which is the default behavior; and, 1 indicates high priority, meaning all subscriptions across all notifiers will receive notifications for this Issue regardless of their notification preferences.

components is an array of string Component IDs affected by this Issue. For all webhooks, this does not get promoted to a Paged Array, as the Component objects themselves are available elsewhere in the event object.

specialization denotes whether this Issue has special abilities or connotations. general is the default behavior, indicating no specialization. Other values include maintenance, which indicates an Issue shows affected components as "under maintenance," and information, which indicates that the Issue is an informational bulletin.

retrospective denotes whether this is a retrospective, backdated Issue.

scheduled denotes whether this Issue has a Schedule.

standing denotes whether this Issue is currently active and affecting its given Components.

resolved denotes whether this Issue is currently resolved, thus no longer affecting its given Components.

cancelled denotes whether this Issue has been cancelled. Note that this field is null if the Issue is not scheduled.

began_at is the time at which this Issue began affecting its given Components.

ended_at is the time at which this Issue stopped affecting its given Components. This field is null if it has not ended yet.

cancelled_at is the time at which this Issue was cancelled. This field is null if the Issue has not been cancelled or is not scheduled.

schedule is an object detailing the Schedule of this issue if it is scheduled. This field is null if the Issue is not Scheduled. Please see below for the structure of an Issue Schedule object.

updates is a Paged Array whose data field contains an array of Issue Update objects. This Paged Array will always be completely paged in, so expect has_more to always be false. The first element of this array is the latest Update for this Issue, and should be considered the current status of this Issue. Please see below for the structure of an Issue Update object.

Example data (Issue Schedule):

{
  "id": "5c06ee9a8fbb652ab878c4ee",
  "type": "schedule",
  "starts_at": 1543943770,
  "ends_at": 1543965370,
  "notify_subscribers_at": 1543942770,
  "started": true,
  "ended": false,
  "notified": false
}

starts_at is the time at which this scheduled Issue will begin.

ends_at is the time at which this scheduled Issue will end.

notify_subscribers_at is the time at which this scheduled Issue will fire a "heads-up" issue_upcoming notification, informing subscribers that the Issue will begin soon. This field is null if the Issue will not be sending an issue_upcoming notification.

started denotes whether this scheduled Issue has started.

ended denotes whether this scheduled Issue has ended.

notified denotes whether this scheduled Issue has fired an issue_upcoming notification.

Example data (Issue Update):

{
  "id": "5c06ee948fbb652ab878c2c6",
  "type": "update",
  "label": "identified",
  "body": "**Lorem ipsum** _dolor sit amet_.",
  "html": "\u003cp\u003e\u003cstrong\u003eLorem ipsum\u003c/strong\u003e \u003cem\u003edolor sit amet\u003c/em\u003e.\u003c/p\u003e\n",
  "state_override": null,
  "created_at": 1543958164,
  "updated_at": 1543958164,
  "issue": "5c06ee938fbb652ab878c2b5",
  "reopening": true
}

label is the label applied to this update, as well as the issue at large when this Update is the latest Update in the Issue. The label can be thought of as the "state" of the Issue as of this Update (e.g. "Problem Identified", "Monitoring", "Resolved").

body is the body text of this Update in raw markdown. html is an HTML rendering of this markdown.

state_override is the integer state (-1, 0, 1 from the Status example above) which overrides the state of affected Components in issue.component. A value of null indicates no override is present.

issue is the Issue object that this Update pertains to. For webhooks, this is always a string ID, since Updates are normally found embedded in whole Issue objects.

reopening denotes whether this Update reopened the Issue if it was already resolved in an Update before this one.

Status Event Payloads

Status events (i.e. restored, degraded) will have the following payloads:

Example data (degraded):

{
  "created_at": 1543958171,
  "event": {
    "id": "5c06ee9b8fbb652ab878c50d",
    "type": "event",
    "created_at": 1543958171,
    "kind": "degraded",
    "eventable": {
      "id": "5c06ee9b8fbb652ab878c50c",
      "type": "status",
      "created_at": 1543958171,
      "updated_at": 1543958171,
      "watchdog": "5c06ee9b8fbb652ab878c503",
      "state": -1,
      "duration": 0,
      "began_at": 1543958171
    },
    "contexts": {
      "component": {
        "id": "5c06ee9b8fbb652ab878c509",
        "type": "component",
        "created_at": 1543958171,
        "updated_at": 1543958171,
        "name": "Component 113",
        "description": null,
        "description_html": "",
        "group": {
          "id": "5c06ee9b8fbb652ab878c508",
          "type": "group",
          "created_at": 1543958171,
          "updated_at": 1543958171,
          "name": "Group 114",
          "description": null,
          "description_html": "",
          "components": [
            "5c06ee9b8fbb652ab878c509"
          ]
        },
        "percent_uptime": 100
      }
    }
  },
  "subscription": {
    "id": "5c06ee9a8fbb652ab878c502",
    "type": "subscription",
    "created_at": 1543958171,
    "updated_at": 1543958171,
    "plugin": "webhook"
  },
  "status_page": {
    "name": "Company"
  },
  "_embedded": {
    "event": {
      "_embedded": {
        "contexts": {
          "_embedded": {
            "component": {
              "_links": {
                "self-view": {
                  "href": "https://status.example.com/components/5c06ee9b8fbb652ab878c509"
                }
              }
            }
          }
        }
      }
    },
    "subscription": {
      "_links": {
        "update-form": {
          "href": "https://status.example.com/subscriptions/5c06ee9a8fbb652ab878c502/edit"
        }
      }
    },
    "status_page": {
      "_links": {
        "self-view": {
          "href": "https://status.example.com/"
        }
      }
    }
  }
}

For status events, the eventable field is a Status object, which is the object that was created resulting in the fired event. In other words, degraded will be the result of some sub-operational Status being created, such as the one above (event.eventable.state == -1). Of course, restored would then contain a Status with operational state.

Status events also contain a field contexts.component, which is the single Component object affected by this event.

Example data (restored):

{
  "created_at": 1543958164,
  "event": {
    "id": "5c06ee948fbb652ab878c2f1",
    "type": "event",
    "created_at": 1543958164,
    "kind": "restored",
    "eventable": {
      "id": "5c06ee948fbb652ab878c2f0",
      "type": "status",
      "created_at": 1543958164,
      "updated_at": 1543958164,
      "watchdog": "5c06ee948fbb652ab878c2e7",
      "state": 1,
      "duration": 0,
      "began_at": 1543958164
    },
    "contexts": {
      "component": {
        "id": "5c06ee948fbb652ab878c2ed",
        "type": "component",
        "created_at": 1543958164,
        "updated_at": 1543958164,
        "name": "Component 60",
        "description": null,
        "description_html": "",
        "group": {
          "id": "5c06ee948fbb652ab878c2ec",
          "type": "group",
          "created_at": 1543958164,
          "updated_at": 1543958164,
          "name": "Group 70",
          "description": null,
          "description_html": "",
          "components": [
            "5c06ee948fbb652ab878c2ed"
          ]
        },
        "percent_uptime": 99.9807098765
      }
    },
    "time_down": 500
  },
  "subscription": {
    "id": "5c06ee948fbb652ab878c2e6",
    "type": "subscription",
    "created_at": 1543958164,
    "updated_at": 1543958164,
    "plugin": "webhook"
  },
  "status_page": {
    "name": "Company"
  },
  "_embedded": {
    "event": {
      "_embedded": {
        "contexts": {
          "_embedded": {
            "component": {
              "_links": {
                "self-view": {
                  "href": "https://status.example.com/components/5c06ee948fbb652ab878c2ed"
                }
              }
            }
          }
        }
      }
    },
    "subscription": {
      "_links": {
        "update-form": {
          "href": "https://status.example.com/subscriptions/5c06ee948fbb652ab878c2e6/edit"
        }
      }
    },
    "status_page": {
      "_links": {
        "self-view": {
          "href": "https://status.example.com/"
        }
      }
    }
  }
}

The above two webhooks are almost identical save for a single field:

event.time_down is the number of seconds event.contexts.component was down for before becoming operational again.

Issue Event Payloads

Issue events (i.e. issue_created, issue_upcoming, issue_started, issue_ended, issue_cancelled, and subevents) will have the following payloads:

Example data (Unscheduled Issue):

{
  "created_at": 1543958167,
  "event": {
    "id": "5c06ee978fbb652ab878c3c0",
    "type": "event",
    "created_at": 1543958167,
    "kind": "issue_created",
    "eventable": {
      "id": "5c06ee978fbb652ab878c3b8",
      "type": "issue",
      "label": "assessed",
      "body": "**Lorem ipsum** _dolor sit amet_.",
      "html": "\u003cp\u003e\u003cstrong\u003eLorem ipsum\u003c/strong\u003e \u003cem\u003edolor sit amet\u003c/em\u003e.\u003c/p\u003e\n",
      "state_override": null,
      "created_at": 1543958167,
      "updated_at": 1543958167,
      "title": "Issue 34",
      "priority": 0,
      "components": [
        "5c06ee978fbb652ab878c3a5",
        "5c06ee978fbb652ab878c3ad"
      ],
      "specialization": "general",
      "retrospective": false,
      "scheduled": false,
      "standing": true,
      "resolved": false,
      "cancelled": null,
      "began_at": 1543958167,
      "ended_at": null,
      "cancelled_at": null,
      "schedule": null,
      "updates": {
        "type": "paged_array",
        "total_count": 0,
        "data": [],
        "has_more": false
      }
    },
    "contexts": {
      "components": {
        "type": "paged_array",
        "total_count": 2,
        "data": [
          {
            "id": "5c06ee978fbb652ab878c3a5",
            "type": "component",
            "created_at": 1543958167,
            "updated_at": 1543958167,
            "name": "Component 84",
            "description": null,
            "description_html": "",
            "group": {
              "id": "5c06ee978fbb652ab878c3a4",
              "type": "group",
              "created_at": 1543958167,
              "updated_at": 1543958167,
              "name": "Group 85",
              "description": null,
              "description_html": "",
              "components": [
                "5c06ee978fbb652ab878c3a5"
              ]
            },
            "percent_uptime": 100
          },
          {
            "id": "5c06ee978fbb652ab878c3ad",
            "type": "component",
            "created_at": 1543958167,
            "updated_at": 1543958167,
            "name": "Component 85",
            "description": null,
            "description_html": "",
            "group": {
              "id": "5c06ee978fbb652ab878c3ac",
              "type": "group",
              "created_at": 1543958167,
              "updated_at": 1543958167,
              "name": "Group 86",
              "description": null,
              "description_html": "",
              "components": [
                "5c06ee978fbb652ab878c3ad"
              ]
            },
            "percent_uptime": 100
          }
        ],
        "has_more": false
      }
    }
  },
  "subscription": {
    "id": "5c06ee978fbb652ab878c39f",
    "type": "subscription",
    "created_at": 1543958167,
    "updated_at": 1543958167,
    "plugin": "webhook"
  },
  "status_page": {
    "name": "Company"
  },
  "_embedded": {
    "event": {
      "_embedded": {
        "eventable": {
          "_links": {}
        },
        "contexts": {
          "_embedded": {
            "components": {
              "_embedded": {
                "data": [
                  {
                    "_links": {
                      "self-view": {
                        "href": "https://status.example.com/components/5c06ee978fbb652ab878c3a5"
                      }
                    }
                  },
                  {
                    "_links": {
                      "self-view": {
                        "href": "https://status.example.com/components/5c06ee978fbb652ab878c3ad"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      }
    },
    "subscription": {
      "_links": {
        "update-form": {
          "href": "https://status.example.com/subscriptions/5c06ee978fbb652ab878c39f/edit"
        }
      }
    },
    "status_page": {
      "_links": {
        "self-view": {
          "href": "https://status.example.com/"
        }
      }
    }
  }
}

Example data (Scheduled Issue):

{
  "created_at": 1543958170,
  "event": {
    "id": "5c06ee9a8fbb652ab878c4ef",
    "type": "event",
    "created_at": 1543958170,
    "kind": "issue_started",
    "eventable": {
      "id": "5c06ee9a8fbb652ab878c4dc",
      "type": "issue",
      "label": null,
      "body": "**Lorem ipsum** _dolor sit amet_.",
      "html": "\u003cp\u003e\u003cstrong\u003eLorem ipsum\u003c/strong\u003e \u003cem\u003edolor sit amet\u003c/em\u003e.\u003c/p\u003e\n",
      "state_override": null,
      "created_at": 1543958170,
      "updated_at": 1543958170,
      "title": "Issue 44",
      "priority": 0,
      "components": [
        "5c06ee9a8fbb652ab878c4c9",
        "5c06ee9a8fbb652ab878c4d1"
      ],
      "specialization": "general",
      "retrospective": false,
      "scheduled": true,
      "standing": true,
      "resolved": false,
      "cancelled": false,
      "began_at": 1543943770,
      "ended_at": null,
      "cancelled_at": null,
      "schedule": {
        "id": "5c06ee9a8fbb652ab878c4ee",
        "type": "schedule",
        "starts_at": 1543943770,
        "ends_at": 1543965370,
        "notify_subscribers_at": null,
        "started": true,
        "ended": false,
        "notified": false
      },
      "updates": {
        "type": "paged_array",
        "total_count": 0,
        "data": [],
        "has_more": false
      }
    },
    "contexts": {
      "components": {
        "type": "paged_array",
        "total_count": 2,
        "data": [
          {
            "id": "5c06ee9a8fbb652ab878c4c9",
            "type": "component",
            "created_at": 1543958170,
            "updated_at": 1543958170,
            "name": "Component 108",
            "description": null,
            "description_html": "",
            "group": {
              "id": "5c06ee9a8fbb652ab878c4c8",
              "type": "group",
              "created_at": 1543958170,
              "updated_at": 1543958170,
              "name": "Group 109",
              "description": null,
              "description_html": "",
              "components": [
                "5c06ee9a8fbb652ab878c4c9"
              ]
            },
            "percent_uptime": 100
          },
          {
            "id": "5c06ee9a8fbb652ab878c4d1",
            "type": "component",
            "created_at": 1543958170,
            "updated_at": 1543958170,
            "name": "Component 109",
            "description": null,
            "description_html": "",
            "group": {
              "id": "5c06ee9a8fbb652ab878c4d0",
              "type": "group",
              "created_at": 1543958170,
              "updated_at": 1543958170,
              "name": "Group 110",
              "description": null,
              "description_html": "",
              "components": [
                "5c06ee9a8fbb652ab878c4d1"
              ]
            },
            "percent_uptime": 100
          },
          {
            "id": "5c06ee9a8fbb652ab878c4d9",
            "type": "component",
            "created_at": 1543958170,
            "updated_at": 1543958170,
            "name": "Component 110",
            "description": null,
            "description_html": "",
            "group": {
              "id": "5c06ee9a8fbb652ab878c4d8",
              "type": "group",
              "created_at": 1543958170,
              "updated_at": 1543958170,
              "name": "Group 111",
              "description": null,
              "description_html": "",
              "components": [
                "5c06ee9a8fbb652ab878c4d9"
              ]
            },
            "percent_uptime": 100
          }
        ],
        "has_more": false
      }
    }
  },
  "subscription": {
    "id": "5c06ee9a8fbb652ab878c4c3",
    "type": "subscription",
    "created_at": 1543958170,
    "updated_at": 1543958170,
    "plugin": "webhook"
  },
  "status_page": {
    "name": "Company"
  },
  "_embedded": {
    "event": {
      "_embedded": {
        "eventable": {
          "_links": {}
        },
        "contexts": {
          "_embedded": {
            "components": {
              "_embedded": {
                "data": [
                  {
                    "_links": {
                      "self-view": {
                        "href": "https://status.example.com/components/5c06ee9a8fbb652ab878c4c9"
                      }
                    }
                  },
                  {
                    "_links": {
                      "self-view": {
                        "href": "https://status.example.com/components/5c06ee9a8fbb652ab878c4d1"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      }
    },
    "subscription": {
      "_links": {
        "update-form": {
          "href": "https://status.example.com/subscriptions/5c06ee9a8fbb652ab878c4c3/edit"
        }
      }
    },
    "status_page": {
      "_links": {
        "self-view": {
          "href": "https://status.example.com/"
        }
      }
    }
  }
}

For issue events, the eventable field is an Issue object, complete with its embedded Updates and Schedule (if it exists).

Issue events also contain a field contexts.components, which is a Paged Array of all Component objects affected by this Issue.

Issue Update Event Payloads

Issue Update events (i.e. issue_updated, issue_reopened, issue_resolved, and issue_addended) will have the following payloads:

Example data:

{
  "created_at": 1543958164,
  "event": {
    "id": "5c06ee948fbb652ab878c2bd",
    "type": "event",
    "created_at": 1543958164,
    "kind": "issue_reopened",
    "eventable": {
      "id": "5c06ee938fbb652ab878c2b5",
      "type": "issue",
      "label": "assessed",
      "body": "**Lorem ipsum** _dolor sit amet_.",
      "html": "\u003cp\u003e\u003cstrong\u003eLorem ipsum\u003c/strong\u003e \u003cem\u003edolor sit amet\u003c/em\u003e.\u003c/p\u003e\n",
      "state_override": null,
      "created_at": 1543958164,
      "updated_at": 1543958164,
      "title": "Issue 27",
      "priority": 0,
      "components": [
        "5c06ee938fbb652ab878c2a2",
        "5c06ee938fbb652ab878c2aa"
      ],
      "specialization": "general",
      "retrospective": false,
      "scheduled": false,
      "standing": true,
      "resolved": false,
      "cancelled": null,
      "began_at": 1543958164,
      "ended_at": null,
      "cancelled_at": null,
      "schedule": null,
      "updates": {
        "type": "paged_array",
        "total_count": 2,
        "data": [
          {
            "id": "5c06ee948fbb652ab878c2c6",
            "type": "update",
            "label": "identified",
            "body": "**Lorem ipsum** _dolor sit amet_.",
            "html": "\u003cp\u003e\u003cstrong\u003eLorem ipsum\u003c/strong\u003e \u003cem\u003edolor sit amet\u003c/em\u003e.\u003c/p\u003e\n",
            "state_override": null,
            "created_at": 1543958164,
            "updated_at": 1543958164,
            "issue": "5c06ee938fbb652ab878c2b5",
            "reopening": true
          },
          {
            "id": "5c06ee948fbb652ab878c2be",
            "type": "update",
            "label": "resolved",
            "body": "**Lorem ipsum** _dolor sit amet_.",
            "html": "\u003cp\u003e\u003cstrong\u003eLorem ipsum\u003c/strong\u003e \u003cem\u003edolor sit amet\u003c/em\u003e.\u003c/p\u003e\n",
            "state_override": null,
            "created_at": 1543958164,
            "updated_at": 1543958164,
            "issue": "5c06ee938fbb652ab878c2b5",
            "reopening": false
          }
        ],
        "has_more": false
      }
    },
    "contexts": {
      "components": {
        "type": "paged_array",
        "total_count": 2,
        "data": [
          {
            "id": "5c06ee938fbb652ab878c2a2",
            "type": "component",
            "created_at": 1543958163,
            "updated_at": 1543958164,
            "name": "Component 65",
            "description": null,
            "description_html": "",
            "group": {
              "id": "5c06ee938fbb652ab878c2a1",
              "type": "group",
              "created_at": 1543958163,
              "updated_at": 1543958163,
              "name": "Group 66",
              "description": null,
              "description_html": "",
              "components": [
                "5c06ee938fbb652ab878c2a2"
              ]
            },
            "percent_uptime": 100
          },
          {
            "id": "5c06ee938fbb652ab878c2aa",
            "type": "component",
            "created_at": 1543958163,
            "updated_at": 1543958164,
            "name": "Component 66",
            "description": null,
            "description_html": "",
            "group": {
              "id": "5c06ee938fbb652ab878c2a9",
              "type": "group",
              "created_at": 1543958163,
              "updated_at": 1543958163,
              "name": "Group 67",
              "description": null,
              "description_html": "",
              "components": [
                "5c06ee938fbb652ab878c2aa"
              ]
            },
            "percent_uptime": 100
          }
        ],
        "has_more": false
      },
      "update": {
        "id": "5c06ee948fbb652ab878c2c6",
        "type": "update",
        "label": "identified",
        "body": "**Lorem ipsum** _dolor sit amet_.",
        "html": "\u003cp\u003e\u003cstrong\u003eLorem ipsum\u003c/strong\u003e \u003cem\u003edolor sit amet\u003c/em\u003e.\u003c/p\u003e\n",
        "state_override": null,
        "created_at": 1543958164,
        "updated_at": 1543958164,
        "issue": "5c06ee938fbb652ab878c2b5",
        "reopening": true
      }
    }
  },
  "subscription": {
    "id": "5c06ee938fbb652ab878c29c",
    "type": "subscription",
    "created_at": 1543958163,
    "updated_at": 1543958163,
    "plugin": "webhook"
  },
  "status_page": {
    "name": "Company"
  },
  "_embedded": {
    "event": {
      "_embedded": {
        "eventable": {
          "_links": {}
        },
        "contexts": {
          "_embedded": {
            "components": {
              "_embedded": {
                "data": [
                  {
                    "_links": {
                      "self-view": {
                        "href": "https://status.example.com/components/5c06ee938fbb652ab878c2a2"
                      }
                    }
                  },
                  {
                    "_links": {
                      "self-view": {
                        "href": "https://status.example.com/components/5c06ee938fbb652ab878c2aa"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      }
    },
    "subscription": {
      "_links": {
        "update-form": {
          "href": "https://status.example.com/subscriptions/5c06ee938fbb652ab878c29c/edit"
        }
      }
    },
    "status_page": {
      "_links": {
        "self-view": {
          "href": "https://status.example.com/"
        }
      }
    }
  }
}

For issue update events, the eventable field is an Issue object, complete with its embedded Updates and Schedule (if it exists).

Issue Update events also contain a field contexts.components, which is a Paged Array of all Component objects affected by this Issue. The event also has a contexts.update field, which contains the Issue Update that triggered this event.

Usually, event.contexts.update will also be the first element in event.eventable.updates.data, ergo the latest Update. However, this is not guaranteed as multiple updates created in very quick succession could cause a newer Update to be the first element in event.eventable.updates.data.

Miscellaneous Payloads

Miscellaneous events such as notifier_tested (when the "Test Notifier" button is clicked on the Webhook Notifier in the dashboard) and subscription_edit_link_requested (when a specific webhook subscription requests an edit link via the "Subscribe" button on the status page) will have the following payloads:

Example data (notifier_tested):

{
  "created_at": 1543958161,
  "event": {
    "id": "5c06ee918fbb652ab878c1f8",
    "type": "event",
    "created_at": 1543958161,
    "kind": "notifier_tested",
    "eventable": {
      "id": "5c06ee918fbb652ab878c1f6",
      "type": "notifier",
      "updated_at": 1543958161,
      "plugin": "webhook"
    },
    "contexts": {}
  },
  "subscription": {
    "id": "5c06ee918fbb652ab878c1f7",
    "type": "subscription",
    "created_at": 1543958161,
    "updated_at": 1543958161,
    "plugin": "webhook"
  },
  "status_page": {
    "name": "Company"
  },
  "_embedded": {
    "subscription": {
      "_links": {
        "update-form": {
          "href": "https://status.example.com/subscriptions/5c06ee918fbb652ab878c1f7/edit"
        }
      }
    },
    "status_page": {
      "_links": {
        "self-view": {
          "href": "https://status.example.com/"
        }
      }
    }
  }
}

Example data (subscription_edit_link_requested):

{
  "created_at": 1543958160,
  "event": {
    "id": "5c06ee908fbb652ab878c197",
    "type": "event",
    "created_at": 1543958160,
    "kind": "subscription_edit_link_requested",
    "eventable": {
      "id": "5c06ee908fbb652ab878c196",
      "type": "subscription",
      "created_at": 1543958160,
      "updated_at": 1543958160,
      "plugin": "webhook"
    },
    "contexts": {}
  },
  "subscription": {
    "id": "5c06ee908fbb652ab878c196",
    "type": "subscription",
    "created_at": 1543958160,
    "updated_at": 1543958160,
    "plugin": "webhook"
  },
  "status_page": {
    "name": "Company"
  },
  "_embedded": {
    "event": {
      "_embedded": {
        "eventable": {
          "_links": {
            "update-form": {
              "href": "https://status.example.com/subscriptions/5c06ee908fbb652ab878c196/edit"
            }
          }
        }
      }
    },
    "subscription": {
      "_links": {
        "update-form": {
          "href": "https://status.example.com/subscriptions/5c06ee908fbb652ab878c196/edit"
        }
      }
    },
    "status_page": {
      "_links": {
        "self-view": {
          "href": "https://status.example.com/"
        }
      }
    }
  }
}

Although subscription_edit_link_requested notifications will send event.eventable as a Subscription object, the same Subscription can still be accessed from the root subscription field. Furthermore, the desired update-form link is available from _embedded.subscription._links, and is identical to the link nested in _embedded.event._embedded as seen above.

Note: only the endpoint that actually requested a subscription edit link will receive this event notification. This notification is not global, and so is not broadcasted to any other notifiers nor other webhook subscriptions.