Skip to content

Depot incidents

Registers the incident routes on the TENANT mux.

This page is generated from the Depot route table. Every operation carries the permission it needs and the anchor an agent can link to.

POSTincident:managetenant facehosteditmspremote

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

promoteAlertToIncident declares an incident from an alert and links the two.

It lives on the ALERT’s URL because that is where an operator is standing when they decide a condition is customer-facing, and the body is the ordinary incident create body: the alert fills only what was left empty.

NameInTypeRequiredDescription
alertIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
componentsrequiredarray of IncidentImpactRequest
components[].componentIdrequiredstring
components[].impactrequiredstring
initialUpdatestring or null
initialUpdateIsPublicboolean or null
internalNotesstring or null
isPublicboolean or null
publicSummarystring or null
rolesrequiredarray of IncidentRoleRequest
roles[].rolerequiredstring
roles[].userIdrequiredstring
severitystring or null
startedAtstring (date-time) or null
templateIdstring or null
templateVarsIncidentTemplateVarsDTO

incidentTemplateVarsDTO is the closed render context.

templateVars.clientNamerequiredstring
templateVars.componentsrequiredstring
templateVars.severityrequiredstring
templateVars.startedAtrequiredstring
templateVars.statusrequiredstring
templateVars.titlerequiredstring
titlestring or null
StatusBodyDescription
201application/json, IncidentViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThe request conflicts with the current state.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.

201 response body

FieldTypeDescription
acknowledgedAtstring (date-time) or null
createdAtrequiredstring (date-time)
createdBystring
deletedAtstring (date-time) or null
internalNotesstring
isPublicrequiredboolean
postmortemBodystring
postmortemPublishedAtstring (date-time) or null
publicIdrequiredstring
publicSummarystring
resolvedAtstring (date-time) or null
severityrequiredstring
startedAtrequiredstring (date-time)
statusrequiredstring
titlerequiredstring
updatedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/alerts/<alertId>/promote' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"components": [
{
"componentId": "string",
"impact": "string"
}
],
"initialUpdate": "string",
"initialUpdateIsPublic": false,
"internalNotes": "string",
"isPublic": false,
"publicSummary": "string",
"roles": [
{
"role": "string",
"userId": "string"
}
],
"severity": "string",
"startedAt": "2026-01-01T00:00:00Z",
"templateId": "string",
"templateVars": {
"clientName": "string",
"components": "string",
"severity": "string",
"startedAt": "string",
"status": "string",
"title": "string"
},
"title": "string"
}'

GETincident:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

listIncidents pages the console’s list.

IncludeDeleted IS NEVER SET FROM THE QUERY STRING. The filter field exists so a purge report or a support tool can ask, and the console cannot: a retired incident that could be listed by adding one parameter would be back on the screen the moment somebody copied a URL, and “we took that off the page” would stop being true.

NameInTypeRequiredDescription
componentIdquerystringNo
dirquerystring, one of asc, descNoSort direction.
openOnlyquerystringNo
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
publicOnlyquerystringNo
qquerystringNoFree-text search term.
sortquerystring, one of created, severity, started, title, updatedNoSort key.
StatusBodyDescription
200application/json, PagedResultIncidentViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:read.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
itemsrequiredarray of IncidentView
items[].acknowledgedAtstring (date-time) or null
items[].createdAtrequiredstring (date-time)
items[].createdBystring
items[].deletedAtstring (date-time) or null
items[].internalNotesstring
items[].isPublicrequiredboolean
items[].postmortemBodystring
items[].postmortemPublishedAtstring (date-time) or null
items[].publicIdrequiredstring
items[].publicSummarystring
items[].resolvedAtstring (date-time) or null
items[].severityrequiredstring
items[].startedAtrequiredstring (date-time)
items[].statusrequiredstring
items[].titlerequiredstring
items[].updatedAtrequiredstring (date-time)
pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/incidents?componentId=<componentId>&dir=asc&openOnly=<openOnly>&page=0&pageSize=0&publicOnly=<publicOnly>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTincident:managetenant facehosteditmspremote

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

Create incident

Required, sent as application/json.

FieldTypeDescription
componentsrequiredarray of IncidentImpactRequest
components[].componentIdrequiredstring
components[].impactrequiredstring
initialUpdatestring or null
initialUpdateIsPublicboolean or null
internalNotesstring or null
isPublicboolean or null
publicSummarystring or null
rolesrequiredarray of IncidentRoleRequest
roles[].rolerequiredstring
roles[].userIdrequiredstring
severitystring or null
startedAtstring (date-time) or null
templateIdstring or null
templateVarsIncidentTemplateVarsDTO

incidentTemplateVarsDTO is the closed render context.

templateVars.clientNamerequiredstring
templateVars.componentsrequiredstring
templateVars.severityrequiredstring
templateVars.startedAtrequiredstring
templateVars.statusrequiredstring
templateVars.titlerequiredstring
titlestring or null
StatusBodyDescription
201application/json, IncidentViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches.
409application/problem+json, ProblemDetailsThe request conflicts with the current state.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.

201 response body

FieldTypeDescription
acknowledgedAtstring (date-time) or null
createdAtrequiredstring (date-time)
createdBystring
deletedAtstring (date-time) or null
internalNotesstring
isPublicrequiredboolean
postmortemBodystring
postmortemPublishedAtstring (date-time) or null
publicIdrequiredstring
publicSummarystring
resolvedAtstring (date-time) or null
severityrequiredstring
startedAtrequiredstring (date-time)
statusrequiredstring
titlerequiredstring
updatedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/incidents' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"components": [
{
"componentId": "string",
"impact": "string"
}
],
"initialUpdate": "string",
"initialUpdateIsPublic": false,
"internalNotes": "string",
"isPublic": false,
"publicSummary": "string",
"roles": [
{
"role": "string",
"userId": "string"
}
],
"severity": "string",
"startedAt": "2026-01-01T00:00:00Z",
"templateId": "string",
"templateVars": {
"clientName": "string",
"components": "string",
"severity": "string",
"startedAt": "string",
"status": "string",
"title": "string"
},
"title": "string"
}'

GETincident:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

Get incident

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
StatusBodyDescription
200application/json, IncidentViewSuccess.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
acknowledgedAtstring (date-time) or null
createdAtrequiredstring (date-time)
createdBystring
deletedAtstring (date-time) or null
internalNotesstring
isPublicrequiredboolean
postmortemBodystring
postmortemPublishedAtstring (date-time) or null
publicIdrequiredstring
publicSummarystring
resolvedAtstring (date-time) or null
severityrequiredstring
startedAtrequiredstring (date-time)
statusrequiredstring
titlerequiredstring
updatedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/incidents/<incidentId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PATCHincident:managetenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

patchIncident edits the descriptive half.

It CANNOT move the status; see decision 2 in the file header.

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
componentsrequiredarray of IncidentImpactRequest
components[].componentIdrequiredstring
components[].impactrequiredstring
initialUpdatestring or null
initialUpdateIsPublicboolean or null
internalNotesstring or null
isPublicboolean or null
publicSummarystring or null
rolesrequiredarray of IncidentRoleRequest
roles[].rolerequiredstring
roles[].userIdrequiredstring
severitystring or null
startedAtstring (date-time) or null
templateIdstring or null
templateVarsIncidentTemplateVarsDTO

incidentTemplateVarsDTO is the closed render context.

templateVars.clientNamerequiredstring
templateVars.componentsrequiredstring
templateVars.severityrequiredstring
templateVars.startedAtrequiredstring
templateVars.statusrequiredstring
templateVars.titlerequiredstring
titlestring or null
StatusBodyDescription
200application/json, IncidentViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
acknowledgedAtstring (date-time) or null
createdAtrequiredstring (date-time)
createdBystring
deletedAtstring (date-time) or null
internalNotesstring
isPublicrequiredboolean
postmortemBodystring
postmortemPublishedAtstring (date-time) or null
publicIdrequiredstring
publicSummarystring
resolvedAtstring (date-time) or null
severityrequiredstring
startedAtrequiredstring (date-time)
statusrequiredstring
titlerequiredstring
updatedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X PATCH 'https://depot.example.com/api/v1/incidents/<incidentId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"components": [
{
"componentId": "string",
"impact": "string"
}
],
"initialUpdate": "string",
"initialUpdateIsPublic": false,
"internalNotes": "string",
"isPublic": false,
"publicSummary": "string",
"roles": [
{
"role": "string",
"userId": "string"
}
],
"severity": "string",
"startedAt": "2026-01-01T00:00:00Z",
"templateId": "string",
"templateVars": {
"clientName": "string",
"components": "string",
"severity": "string",
"startedAt": "string",
"status": "string",
"title": "string"
},
"title": "string"
}'

DELETEincident:managetenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

deleteIncident retires one.

A SOFT delete: it comes off the lists and off the page without coming out of the database.

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X DELETE 'https://depot.example.com/api/v1/incidents/<incidentId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/incidents/{incidentId}/action-items

Section titled “GET /api/v1/incidents/{incidentId}/action-items”

GETincident:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

List incident action items

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
StatusBodyDescription
200application/json, array of IncidentActionItemViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
[].assigneeNamestring
[].assigneeUserIdstring
[].createdAtrequiredstring (date-time)
[].dueAtstring (date-time) or null
[].publicIdrequiredstring
[].statusrequiredstring
[].ticketIdstring
[].titlerequiredstring
[].updatedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/incidents/<incidentId>/action-items' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/incidents/{incidentId}/action-items

Section titled “POST /api/v1/incidents/{incidentId}/action-items”

POSTincident:managetenant facehosteditmspremote

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

Create incident action item

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
assigneeUserIdstring or null
dueAtstring (date-time) or null
statusstring or null
titlestring or null
StatusBodyDescription
201application/json, IncidentActionItemViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.

201 response body

FieldTypeDescription
assigneeNamestring
assigneeUserIdstring
createdAtrequiredstring (date-time)
dueAtstring (date-time) or null
publicIdrequiredstring
statusrequiredstring
ticketIdstring
titlerequiredstring
updatedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/incidents/<incidentId>/action-items' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"assigneeUserId": "string",
"dueAt": "2026-01-01T00:00:00Z",
"status": "string",
"title": "string"
}'

PATCH /api/v1/incidents/{incidentId}/action-items/{itemId}

Section titled “PATCH /api/v1/incidents/{incidentId}/action-items/{itemId}”

PATCHincident:managetenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

Update incident action item

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
itemIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
assigneeUserIdstring or null
dueAtstring (date-time) or null
statusstring or null
titlestring or null
StatusBodyDescription
200application/json, IncidentActionItemViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.

200 response body

FieldTypeDescription
assigneeNamestring
assigneeUserIdstring
createdAtrequiredstring (date-time)
dueAtstring (date-time) or null
publicIdrequiredstring
statusrequiredstring
ticketIdstring
titlerequiredstring
updatedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X PATCH 'https://depot.example.com/api/v1/incidents/<incidentId>/action-items/<itemId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"assigneeUserId": "string",
"dueAt": "2026-01-01T00:00:00Z",
"status": "string",
"title": "string"
}'

POST /api/v1/incidents/{incidentId}/action-items/{itemId}/ticket

Section titled “POST /api/v1/incidents/{incidentId}/action-items/{itemId}/ticket”

POSTincident:managetenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

spawnActionItemTicket opens an ORDINARY ticket for the item and links all three rows.

An item that already has a ticket is returned unchanged rather than given a second one: the console offers this from two places, and two tickets for one agreed fix is how remediation ends up half-done in each.

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
itemIdpathstringYesA uuid.
StatusBodyDescription
200application/json, IncidentActionItemViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.

200 response body

FieldTypeDescription
assigneeNamestring
assigneeUserIdstring
createdAtrequiredstring (date-time)
dueAtstring (date-time) or null
publicIdrequiredstring
statusrequiredstring
ticketIdstring
titlerequiredstring
updatedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X POST 'https://depot.example.com/api/v1/incidents/<incidentId>/action-items/<itemId>/ticket' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETincident:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

List incident alert links

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
StatusBodyDescription
200application/json, array of IncidentAlertLinkViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
[].alertIdrequiredstring
[].alertTitlestring
[].linkedAtrequiredstring (date-time)
[].linkedBystring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/incidents/<incidentId>/alerts' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/incidents/{incidentId}/alerts

Section titled “POST /api/v1/incidents/{incidentId}/alerts”

POSTincident:managetenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

Link incident alert

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
alertIdstring or null
kindstring or null
ticketIdstring or null
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X POST 'https://depot.example.com/api/v1/incidents/<incidentId>/alerts' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"alertId": "string",
"kind": "string",
"ticketId": "string"
}'

DELETE /api/v1/incidents/{incidentId}/alerts/{alertId}

Section titled “DELETE /api/v1/incidents/{incidentId}/alerts/{alertId}”

DELETEincident:managetenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

Unlink incident alert

NameInTypeRequiredDescription
alertIdpathstringYesA uuid.
incidentIdpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X DELETE 'https://depot.example.com/api/v1/incidents/<incidentId>/alerts/<alertId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/incidents/{incidentId}/components

Section titled “GET /api/v1/incidents/{incidentId}/components”

GETincident:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

List incident impacts

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
StatusBodyDescription
200application/json, array of IncidentImpactViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
[].componentIdrequiredstring
[].componentNamestring
[].endedAtstring (date-time) or null
[].impactrequiredstring
[].startedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/incidents/<incidentId>/components' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PUT /api/v1/incidents/{incidentId}/components

Section titled “PUT /api/v1/incidents/{incidentId}/components”

PUTincident:managetenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

replaceIncidentImpacts sets the whole set.

A PUT and not a POST because the body is the complete list: the console renders checkboxes, and the store preserves each surviving component’s StartedAt so re-saving an unchanged list does not restart an outage clock.

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
componentsrequiredarray of IncidentImpactRequest
components[].componentIdrequiredstring
components[].impactrequiredstring
initialUpdatestring or null
initialUpdateIsPublicboolean or null
internalNotesstring or null
isPublicboolean or null
publicSummarystring or null
rolesrequiredarray of IncidentRoleRequest
roles[].rolerequiredstring
roles[].userIdrequiredstring
severitystring or null
startedAtstring (date-time) or null
templateIdstring or null
templateVarsIncidentTemplateVarsDTO

incidentTemplateVarsDTO is the closed render context.

templateVars.clientNamerequiredstring
templateVars.componentsrequiredstring
templateVars.severityrequiredstring
templateVars.startedAtrequiredstring
templateVars.statusrequiredstring
templateVars.titlerequiredstring
titlestring or null
StatusBodyDescription
200application/json, array of IncidentImpactViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.

200 response body

FieldTypeDescription
[].componentIdrequiredstring
[].componentNamestring
[].endedAtstring (date-time) or null
[].impactrequiredstring
[].startedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X PUT 'https://depot.example.com/api/v1/incidents/<incidentId>/components' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"components": [
{
"componentId": "string",
"impact": "string"
}
],
"initialUpdate": "string",
"initialUpdateIsPublic": false,
"internalNotes": "string",
"isPublic": false,
"publicSummary": "string",
"roles": [
{
"role": "string",
"userId": "string"
}
],
"severity": "string",
"startedAt": "2026-01-01T00:00:00Z",
"templateId": "string",
"templateVars": {
"clientName": "string",
"components": "string",
"severity": "string",
"startedAt": "string",
"status": "string",
"title": "string"
},
"title": "string"
}'

PUT /api/v1/incidents/{incidentId}/postmortem

Section titled “PUT /api/v1/incidents/{incidentId}/postmortem”

PUTincident:managetenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

publishPostmortem writes the analysis and moves the incident into ‘postmortem’, which is the only way into that status and is reachable only from ‘resolved’.

An incident cannot be analysed before it has ended.

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
bodystring or null
StatusBodyDescription
200application/json, IncidentViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.

200 response body

FieldTypeDescription
acknowledgedAtstring (date-time) or null
createdAtrequiredstring (date-time)
createdBystring
deletedAtstring (date-time) or null
internalNotesstring
isPublicrequiredboolean
postmortemBodystring
postmortemPublishedAtstring (date-time) or null
publicIdrequiredstring
publicSummarystring
resolvedAtstring (date-time) or null
severityrequiredstring
startedAtrequiredstring (date-time)
statusrequiredstring
titlerequiredstring
updatedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X PUT 'https://depot.example.com/api/v1/incidents/<incidentId>/postmortem' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"body": "string"
}'

GETincident:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

List incident roles

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
StatusBodyDescription
200application/json, array of IncidentRoleViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
[].assignedAtrequiredstring (date-time)
[].rolerequiredstring
[].userIdrequiredstring
[].userNamestring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/incidents/<incidentId>/roles' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PUTincident:managetenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

replaceIncidentRoles writes the whole set in one transaction, which is what makes a commander handover a swap rather than a moment with two.

A body naming two commanders answers 409 from the partial unique index, not a half-applied set.

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
componentsrequiredarray of IncidentImpactRequest
components[].componentIdrequiredstring
components[].impactrequiredstring
initialUpdatestring or null
initialUpdateIsPublicboolean or null
internalNotesstring or null
isPublicboolean or null
publicSummarystring or null
rolesrequiredarray of IncidentRoleRequest
roles[].rolerequiredstring
roles[].userIdrequiredstring
severitystring or null
startedAtstring (date-time) or null
templateIdstring or null
templateVarsIncidentTemplateVarsDTO

incidentTemplateVarsDTO is the closed render context.

templateVars.clientNamerequiredstring
templateVars.componentsrequiredstring
templateVars.severityrequiredstring
templateVars.startedAtrequiredstring
templateVars.statusrequiredstring
templateVars.titlerequiredstring
titlestring or null
StatusBodyDescription
200application/json, array of IncidentRoleViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.

200 response body

FieldTypeDescription
[].assignedAtrequiredstring (date-time)
[].rolerequiredstring
[].userIdrequiredstring
[].userNamestring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X PUT 'https://depot.example.com/api/v1/incidents/<incidentId>/roles' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"components": [
{
"componentId": "string",
"impact": "string"
}
],
"initialUpdate": "string",
"initialUpdateIsPublic": false,
"internalNotes": "string",
"isPublic": false,
"publicSummary": "string",
"roles": [
{
"role": "string",
"userId": "string"
}
],
"severity": "string",
"startedAt": "2026-01-01T00:00:00Z",
"templateId": "string",
"templateVars": {
"clientName": "string",
"components": "string",
"severity": "string",
"startedAt": "string",
"status": "string",
"title": "string"
},
"title": "string"
}'
Section titled “GET /api/v1/incidents/{incidentId}/tickets”

GETincident:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

List incident ticket links

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
StatusBodyDescription
200application/json, array of IncidentTicketLinkViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
[].kindrequiredstring, one of action_item, attached, change, problem
[].linkedAtrequiredstring (date-time)
[].linkedBystring
[].ticketIdrequiredstring
[].ticketReferencestring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/incidents/<incidentId>/tickets' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/incidents/{incidentId}/tickets

Section titled “POST /api/v1/incidents/{incidentId}/tickets”

POSTincident:managetenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

Link incident ticket

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
alertIdstring or null
kindstring or null
ticketIdstring or null
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X POST 'https://depot.example.com/api/v1/incidents/<incidentId>/tickets' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"alertId": "string",
"kind": "string",
"ticketId": "string"
}'

DELETE /api/v1/incidents/{incidentId}/tickets/{ticketId}

Section titled “DELETE /api/v1/incidents/{incidentId}/tickets/{ticketId}”

DELETEincident:managetenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

Unlink incident ticket

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
ticketIdpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X DELETE 'https://depot.example.com/api/v1/incidents/<incidentId>/tickets/<ticketId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/incidents/{incidentId}/updates

Section titled “GET /api/v1/incidents/{incidentId}/updates”

GETincident:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

listIncidentUpdates returns the whole timeline, private entries included.

This is the ADMIN face; the public page’s read is the statuspage package’s and passes includePrivate false.

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
StatusBodyDescription
200application/json, PagedResultIncidentUpdateViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
itemsrequiredarray of IncidentUpdateView
items[].bodyrequiredstring
items[].createdAtrequiredstring (date-time)
items[].createdBystring
items[].isPublicrequiredboolean
items[].publicIdrequiredstring
items[].statusrequiredstring
pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/incidents/<incidentId>/updates?page=0&pageSize=0' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/incidents/{incidentId}/updates

Section titled “POST /api/v1/incidents/{incidentId}/updates”

POSTincident:managetenant facehosteditmspremote

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

appendIncidentUpdate is the ONLY way an incident’s status moves.

The response carries both halves - the entry that was written and the incident as it now stands - because the console needs the second to re-render the header and a follow-up GET would race the next operator’s update.

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
atstring (date-time) or null
bodystring or null
isPublicboolean or null
statusstring or null
StatusBodyDescription
201application/json, objectCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis incident has been deleted.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsThe request was refused.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/incidents/<incidentId>/updates' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"at": "2026-01-01T00:00:00Z",
"body": "string",
"isPublic": false,
"status": "string"
}'

GETincident:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

Incident metrics

StatusBodyDescription
200application/json, IncidentMetricsViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold incident:read.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
byComponentrequiredarray of IncidentComponentCountRow
byComponent[].componentIdrequiredstring
byComponent[].countrequiredinteger
byComponent[].namerequiredstring
byMonthrequiredarray of IncidentMonthCountView
byMonth[].countrequiredinteger
byMonth[].monthrequiredstring
bySeverityrequiredobject
fromrequiredstring (date-time)
mttaSecondsrequirednumber

double.

mttrSecondsrequirednumber

double.

torequiredstring (date-time)
uptimerequiredarray of ComponentUptimeView
uptime[].componentIdrequiredstring
uptime[].downSecondsrequiredinteger

int64.

uptime[].namerequiredstring
uptime[].uptimePercentrequirednumber

double.

Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/incidents/metrics' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

Content is licensed CC BY 4.0. Code samples are MIT. Outpost and the Outpost mark are trademarks of Outpost Business Solutions, PBC and are not covered by either license.