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.