Skip to content

Depot mspincidents

Registers the MSP-wide incident routes on the CONTROL-PLANE 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.

GETincident:readmsp facemspIdempotent

Source: [object Object]

List msp incidents

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, PagedResultMspIncidentViewSuccess.
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, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
itemsrequiredarray of MspIncidentView
items[].acknowledgedAtstring (date-time) or null
items[].affectsAllClientsrequiredboolean
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/msp/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:managemsp facemsp

Source: [object Object]

createMspIncident declares an estate-wide incident.

AcknowledgedAt is stamped at creation for incident.Service.CreateIncident’s reason: somebody opened the console, typed a title and pressed declare, so the incident has been acknowledged by definition.

Required, sent as application/json.

FieldTypeDescription
affectsAllClientsboolean or null
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, MspIncidentViewCreated.
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, ProblemDetailsThat component no longer exists.
409application/problem+json, ProblemDetailsAn incident with that id already exists.
500application/problem+json, ProblemDetailsCould not declare the incident.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

201 response body

FieldTypeDescription
acknowledgedAtstring (date-time) or null
affectsAllClientsrequiredboolean
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/msp/incidents' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"affectsAllClients": false,
"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:readmsp facemspIdempotent

Source: [object Object]

Get msp incident

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.
StatusBodyDescription
200application/json, MspIncidentViewSuccess.
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, ProblemDetailsCould not read the incident.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
acknowledgedAtstring (date-time) or null
affectsAllClientsrequiredboolean
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/msp/incidents/<incidentId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PATCHincident:managemsp facemspIdempotent

Source: [object Object]

patchMspIncident edits the descriptive half and the fan-out switch.

It CANNOT move the status; moving an MSP-wide incident is POST /updates, for incidents.go decision 2’s reason.

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
affectsAllClientsboolean or null
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, MspIncidentViewSuccess.
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, ProblemDetailsCould not read the incident.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
acknowledgedAtstring (date-time) or null
affectsAllClientsrequiredboolean
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/msp/incidents/<incidentId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"affectsAllClients": false,
"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:managemsp facemspIdempotent

Source: [object Object]

deleteMspIncident retires one.

A SOFT delete: it comes off every tenant’s page without coming out of the database.

NOTHING IS EMITTED. The tenant face does not emit on a delete either, and here it would be worse: the estate has already been told this incident exists, and a retraction to every tenant’s subscribers is an announcement nobody can recall. Taking it off the pages is the whole of the act.

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, ProblemDetailsCould not read the incident.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.
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/msp/incidents/<incidentId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

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

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

GETincident:readmsp facemspIdempotent

Source: [object Object]

List msp 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, ProblemDetailsCould not read the incident.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

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/msp/incidents/<incidentId>/components' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

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

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

PUTincident:managemsp facemspIdempotent

Source: [object Object]

replaceMspIncidentImpacts sets the whole set.

A PUT and not a POST because the body is the complete list, 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
affectsAllClientsboolean or null
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, ProblemDetailsCould not read the incident.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

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/msp/incidents/<incidentId>/components' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"affectsAllClients": false,
"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/msp/incidents/{incidentId}/postmortem

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

PUTincident:managemsp facemspIdempotent

Source: [object Object]

publishMspPostmortem 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.

IT EMITS NOTHING, matching the tenant face. A postmortem is read by whoever goes looking, days later; mailing every tenant’s subscribers a second time about an incident that ended last week is how a status page trains its readers to filter it.

NameInTypeRequiredDescription
incidentIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
bodystring or null
StatusBodyDescription
200application/json, MspIncidentViewSuccess.
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, ProblemDetailsCould not read the incident.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
acknowledgedAtstring (date-time) or null
affectsAllClientsrequiredboolean
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/msp/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"
}'

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

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

GETincident:readmsp facemspIdempotent

Source: [object Object]

listMspIncidentUpdates returns the whole timeline, private entries included.

This is the ADMIN face; the public page’s read 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, ProblemDetailsCould not read the incident.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

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/msp/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/msp/incidents/{incidentId}/updates

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

POSTincident:managemsp facemsp

Source: [object Object]

appendMspIncidentUpdate is the ONLY way an MSP-wide incident’s status moves.

The transition is checked BEFORE anything is written, because the update table is append-only: a statement written and then found to be illegal could not be taken back.

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, ProblemDetailsCould not read the incident.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.
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/msp/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:readmsp facemspIdempotent

Source: [object Object]

List msp maintenance windows

NameInTypeRequiredDescription
dirquerystring, one of asc, descNoSort direction.
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
qquerystringNoFree-text search term.
sortquerystring, one of created, scheduled, title, updatedNoSort key.
StatusBodyDescription
200application/json, PagedResultMspMaintenanceWindowViewSuccess.
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, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
itemsrequiredarray of MspMaintenanceWindowView
items[].affectsAllClientsrequiredboolean
items[].autoTransitionrequiredboolean
items[].bodystring
items[].completedAtstring (date-time) or null
items[].componentsarray of StatusComponentView
items[].components[].createdAtrequiredstring (date-time)
items[].components[].descriptionstring
items[].components[].groupNamestring
items[].components[].namerequiredstring
items[].components[].publicIdrequiredstring
items[].components[].showUptimerequiredboolean
items[].components[].sortOrderrequiredinteger
items[].components[].statusrequiredstring
items[].components[].updatedAtrequiredstring (date-time)
items[].createdAtrequiredstring (date-time)
items[].publicIdrequiredstring
items[].scheduledEndAtrequiredstring (date-time)
items[].scheduledStartAtrequiredstring (date-time)
items[].startedAtstring (date-time) or null
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/msp/maintenance-windows?dir=asc&page=0&pageSize=0&q=<q>&sort=created' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTincident:managemsp facemsp

Source: [object Object]

Create msp maintenance window

Required, sent as application/json.

FieldTypeDescription
affectsAllClientsboolean or null
autoTransitionboolean or null
bodystring or null
componentIdsrequiredarray of string
scheduledEndAtstring (date-time) or null
scheduledStartAtstring (date-time) or null
titlestring or null
StatusBodyDescription
201application/json, MspMaintenanceWindowViewCreated.
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, ProblemDetailsOne of those components no longer exists.
500application/problem+json, ProblemDetailsCould not schedule the planned work.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

201 response body

FieldTypeDescription
affectsAllClientsrequiredboolean
autoTransitionrequiredboolean
bodystring
completedAtstring (date-time) or null
componentsarray of StatusComponentView
components[].createdAtrequiredstring (date-time)
components[].descriptionstring
components[].groupNamestring
components[].namerequiredstring
components[].publicIdrequiredstring
components[].showUptimerequiredboolean
components[].sortOrderrequiredinteger
components[].statusrequiredstring
components[].updatedAtrequiredstring (date-time)
createdAtrequiredstring (date-time)
publicIdrequiredstring
scheduledEndAtrequiredstring (date-time)
scheduledStartAtrequiredstring (date-time)
startedAtstring (date-time) or null
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/msp/maintenance-windows' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"affectsAllClients": false,
"autoTransition": false,
"body": "string",
"componentIds": [
"string"
],
"scheduledEndAt": "2026-01-01T00:00:00Z",
"scheduledStartAt": "2026-01-01T00:00:00Z",
"title": "string"
}'

GET /api/v1/msp/maintenance-windows/{maintenanceId}

Section titled “GET /api/v1/msp/maintenance-windows/{maintenanceId}”

GETincident:readmsp facemspIdempotent

Source: [object Object]

Get msp maintenance window

NameInTypeRequiredDescription
maintenanceIdpathstringYesA uuid.
StatusBodyDescription
200application/json, MspMaintenanceWindowViewSuccess.
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, ProblemDetailsCould not read the planned work.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
affectsAllClientsrequiredboolean
autoTransitionrequiredboolean
bodystring
completedAtstring (date-time) or null
componentsarray of StatusComponentView
components[].createdAtrequiredstring (date-time)
components[].descriptionstring
components[].groupNamestring
components[].namerequiredstring
components[].publicIdrequiredstring
components[].showUptimerequiredboolean
components[].sortOrderrequiredinteger
components[].statusrequiredstring
components[].updatedAtrequiredstring (date-time)
createdAtrequiredstring (date-time)
publicIdrequiredstring
scheduledEndAtrequiredstring (date-time)
scheduledStartAtrequiredstring (date-time)
startedAtstring (date-time) or null
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/msp/maintenance-windows/<maintenanceId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PATCH /api/v1/msp/maintenance-windows/{maintenanceId}

Section titled “PATCH /api/v1/msp/maintenance-windows/{maintenanceId}”

PATCHincident:managemsp facemsp

Source: [object Object]

patchMspMaintenanceWindow edits the announcement.

It cannot move the status; see maintenance.go decision 1.

NameInTypeRequiredDescription
maintenanceIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
affectsAllClientsboolean or null
autoTransitionboolean or null
bodystring or null
componentIdsrequiredarray of string
scheduledEndAtstring (date-time) or null
scheduledStartAtstring (date-time) or null
titlestring or null
StatusBodyDescription
200application/json, MspMaintenanceWindowViewSuccess.
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.
500application/problem+json, ProblemDetailsCould not read the planned work.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
affectsAllClientsrequiredboolean
autoTransitionrequiredboolean
bodystring
completedAtstring (date-time) or null
componentsarray of StatusComponentView
components[].createdAtrequiredstring (date-time)
components[].descriptionstring
components[].groupNamestring
components[].namerequiredstring
components[].publicIdrequiredstring
components[].showUptimerequiredboolean
components[].sortOrderrequiredinteger
components[].statusrequiredstring
components[].updatedAtrequiredstring (date-time)
createdAtrequiredstring (date-time)
publicIdrequiredstring
scheduledEndAtrequiredstring (date-time)
scheduledStartAtrequiredstring (date-time)
startedAtstring (date-time) or null
statusrequiredstring
titlerequiredstring
updatedAtrequiredstring (date-time)
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X PATCH 'https://depot.example.com/api/v1/msp/maintenance-windows/<maintenanceId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"affectsAllClients": false,
"autoTransition": false,
"body": "string",
"componentIds": [
"string"
],
"scheduledEndAt": "2026-01-01T00:00:00Z",
"scheduledStartAt": "2026-01-01T00:00:00Z",
"title": "string"
}'

POST /api/v1/msp/maintenance-windows/{maintenanceId}/transition

Section titled “POST /api/v1/msp/maintenance-windows/{maintenanceId}/transition”

POSTincident:managemsp facemspIdempotent

Source: [object Object]

transitionMspMaintenanceWindow moves a window and stamps what actually happened.

ONE VERB ROUTE and not three, matching the tenant face and api-client.ts’s transitionMspMaintenanceWindow: start, complete and cancel are the same act with a different destination, and three routes would be three places to forget the transition check.

NameInTypeRequiredDescription
maintenanceIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
atstring (date-time) or null
statusstring or null
StatusBodyDescription
200application/json, MspMaintenanceWindowViewSuccess.
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, ProblemDetailsCould not read the planned work.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
affectsAllClientsrequiredboolean
autoTransitionrequiredboolean
bodystring
completedAtstring (date-time) or null
componentsarray of StatusComponentView
components[].createdAtrequiredstring (date-time)
components[].descriptionstring
components[].groupNamestring
components[].namerequiredstring
components[].publicIdrequiredstring
components[].showUptimerequiredboolean
components[].sortOrderrequiredinteger
components[].statusrequiredstring
components[].updatedAtrequiredstring (date-time)
createdAtrequiredstring (date-time)
publicIdrequiredstring
scheduledEndAtrequiredstring (date-time)
scheduledStartAtrequiredstring (date-time)
startedAtstring (date-time) or null
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 POST 'https://depot.example.com/api/v1/msp/maintenance-windows/<maintenanceId>/transition' \
-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",
"status": "string"
}'

GETincident:readmsp facemspIdempotent

Source: [object Object]

listMspStatusComponents answers the MSP’s own component list, searched, sorted and paged exactly as the tenant one is - down to the same allowlist and the same envelope.

Two faces over the same table that answered different parameters would be the drift this file exists to avoid.

NameInTypeRequiredDescription
dirquerystring, one of asc, descNoSort direction.
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
qquerystringNoFree-text search term.
sortquerystring, one of created, name, page, status, updatedNoSort key.
StatusBodyDescription
200application/json, PagedResultStatusComponentViewSuccess.
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, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
itemsrequiredarray of StatusComponentView
items[].createdAtrequiredstring (date-time)
items[].descriptionstring
items[].groupNamestring
items[].namerequiredstring
items[].publicIdrequiredstring
items[].showUptimerequiredboolean
items[].sortOrderrequiredinteger
items[].statusrequiredstring
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/msp/status-components?dir=asc&page=0&pageSize=0&q=<q>&sort=created' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTincident:managemsp facemsp

Source: [object Object]

Create msp status component

Required, sent as application/json.

FieldTypeDescription
descriptionstring or null
groupNamestring or null
namestring or null
showUptimeboolean or null
sortOrderinteger or null
statusstring or null
StatusBodyDescription
201application/json, StatusComponentViewCreated.
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, ProblemDetailsA component with that name already exists.
500application/problem+json, ProblemDetailsCould not save the status component.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

201 response body

FieldTypeDescription
createdAtrequiredstring (date-time)
descriptionstring
groupNamestring
namerequiredstring
publicIdrequiredstring
showUptimerequiredboolean
sortOrderrequiredinteger
statusrequiredstring
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/msp/status-components' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"description": "string",
"groupName": "string",
"name": "string",
"showUptime": false,
"sortOrder": 0,
"status": "string"
}'

GET /api/v1/msp/status-components/{componentId}

Section titled “GET /api/v1/msp/status-components/{componentId}”

GETincident:readmsp facemspIdempotent

Source: [object Object]

Get msp status component

NameInTypeRequiredDescription
componentIdpathstringYesA uuid.
StatusBodyDescription
200application/json, StatusComponentViewSuccess.
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, ProblemDetailsCould not read the status component.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
createdAtrequiredstring (date-time)
descriptionstring
groupNamestring
namerequiredstring
publicIdrequiredstring
showUptimerequiredboolean
sortOrderrequiredinteger
statusrequiredstring
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/msp/status-components/<componentId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PATCH /api/v1/msp/status-components/{componentId}

Section titled “PATCH /api/v1/msp/status-components/{componentId}”

PATCHincident:managemsp facemspIdempotent

Source: [object Object]

Patch msp status component

NameInTypeRequiredDescription
componentIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
descriptionstring or null
groupNamestring or null
namestring or null
showUptimeboolean or null
sortOrderinteger or null
statusstring or null
StatusBodyDescription
200application/json, StatusComponentViewSuccess.
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, ProblemDetailsA component with that name already exists.
500application/problem+json, ProblemDetailsCould not read the status component.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
createdAtrequiredstring (date-time)
descriptionstring
groupNamestring
namerequiredstring
publicIdrequiredstring
showUptimerequiredboolean
sortOrderrequiredinteger
statusrequiredstring
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/msp/status-components/<componentId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"description": "string",
"groupName": "string",
"name": "string",
"showUptime": false,
"sortOrder": 0,
"status": "string"
}'

DELETE /api/v1/msp/status-components/{componentId}

Section titled “DELETE /api/v1/msp/status-components/{componentId}”

DELETEincident:managemsp facemspIdempotent

Source: [object Object]

deleteMspStatusComponent removes a component outright, and its impacts with it.

A hard delete for statuscomponents.go’s reason: a component is configuration rather than evidence.

NameInTypeRequiredDescription
componentIdpathstringYesA 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, ProblemDetailsCould not read the status component.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.
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/msp/status-components/<componentId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETstatuspage:managemsp facemspIdempotent

Source: [object Object]

getMspOwnStatusPage answers the settings screen.

A DEPOT WITH NO SAVED ROW ANSWERS 200 AND A DISABLED PAGE, never 404. The store says so at the seam - GetMspStatusPage returns a zero value rather than ErrNotFound - because “never configured” and “switched off” are the same 404 to a visitor, and the settings screen wants a form either way.

StatusBodyDescription
200application/json, MspOwnStatusPageViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold statuspage:manage.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
createdAtstring (date-time)
enabledrequiredboolean
pageTitlerequiredstring
updatedAtstring (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/msp/status-page' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PUTstatuspage:managemsp facemspIdempotent

Source: [object Object]

putMspOwnStatusPage writes the practice’s own page settings.

THERE IS NO “a page needs an address before it can be turned on” REFUSAL here, unlike the tenant route, and its absence is the point rather than an omission: that check exists because a tenant page with no slug is a page nothing can reach, which reads on the screen as “it is on and it does not work”. The MSP’s page is reached at /status on the MSP host whether or not anybody has typed a title, so enabling it always produces a working page. An empty title is rendered from the organisation name and then from a default, which is the statuspage package’s fallback and not this route’s to duplicate.

Required, sent as application/json.

FieldTypeDescription
enabledboolean or null
pageTitlestring or null
StatusBodyDescription
200application/json, MspOwnStatusPageViewSuccess.
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 statuspage:manage.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsCould not save the status page settings.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
createdAtstring (date-time)
enabledrequiredboolean
pageTitlerequiredstring
updatedAtstring (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/msp/status-page' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"enabled": false,
"pageTitle": "string"
}'

GETstatuspage:managemsp facemspIdempotent

Source: [object Object]

listMspStatusPages answers the estate screen: one row per client, with the page switch and the address.

A CLIENT WITH NO ROW STILL APPEARS, disabled and with no slug. Never having turned a page on is the ordinary state, and a roster that showed only the clients with rows would be a list an operator could not use to find the customer they came to switch on.

StatusBodyDescription
200application/json, objectSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold statuspage:manage.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.
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/msp/status-pages' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETstatuspage:managemsp facemspIdempotent

Source: [object Object]

Get msp status page

NameInTypeRequiredDescription
clientIdpathstringYesA uuid.
StatusBodyDescription
200application/json, MspStatusPageRowSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold statuspage:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsCould not read the client.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
clientNamerequiredstring
clientPublicIdrequiredstring
createdAtstring (date-time)
enabledrequiredboolean
pageTitlerequiredstring
slugrequiredstring
updatedAtstring (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/msp/status-pages/<clientId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PUTstatuspage:managemsp facemspIdempotent

Source: [object Object]

putMspStatusPage writes one client’s page settings from the estate screen.

It is the SAME merge and the SAME slug rules as the tenant route, deliberately sharing statusPageRequest and slugPattern rather than restating them: two writers that disagreed about what a slug is would be two ways to publish a page under an address the resolver cannot find.

NameInTypeRequiredDescription
clientIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
enabledboolean or null
generaterequiredboolean
pageTitlestring or null
slugstring or null
StatusBodyDescription
200application/json, MspStatusPageRowSuccess.
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 statuspage:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThat status page address is already taken.
500application/problem+json, ProblemDetailsCould not read the client.
503application/problem+json, ProblemDetailsMSP-wide incidents are not available on this Depot.

200 response body

FieldTypeDescription
clientNamerequiredstring
clientPublicIdrequiredstring
createdAtstring (date-time)
enabledrequiredboolean
pageTitlerequiredstring
slugrequiredstring
updatedAtstring (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/msp/status-pages/<clientId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"enabled": false,
"generate": false,
"pageTitle": "string",
"slug": "string"
}'

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.