Skip to content

Depot software

Registers the catalog CRUD and the installer upload.

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

GETsoftware:readshared facehosteditmspremoteIdempotent

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

Source: [object Object]

List software packages

NameInTypeRequiredDescription
categoryquerystringNo
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.
queryquerystringNoOlder spelling of q, kept so saved links keep working.
sortquerystring, one of category, created, name, publisherNoSort key.
sourcequerystringNo
StatusBodyDescription
200application/json, PagedResultSoftwarePackageSummaryViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold software:read.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsThe software catalog is not available on this Depot.

200 response body

FieldTypeDescription
itemsrequiredarray of SoftwarePackageSummaryView
items[].approvalStatusrequiredstring, one of approved, not_allowed, unreviewed
items[].builtInrequiredboolean
items[].categoryrequiredstring
items[].installedCountrequiredinteger
items[].licenseTyperequiredstring
items[].managedByProviderrequiredboolean
items[].namerequiredstring
items[].publicIdrequiredstring
items[].publisherrequiredstring
items[].requiresApprovalrequiredboolean
items[].selfServiceVisiblerequiredboolean
items[].sourceRefrequiredstring
items[].sourceTyperequiredstring, one of apt, brew, choco, custom_upload, direct_url, dnf, manifest, pkg, winget
items[].updatedAtrequiredstring (date-time)
items[].versionCountrequiredinteger
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/software/packages?category=<category>&dir=asc&page=0&pageSize=0&q=<q>&query=<query>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTsoftware:manageshared facehosteditmspremote

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

Source: [object Object]

Create software package

Required, sent as application/json.

FieldTypeDescription
approvalStatusstring or null
autoUpdateboolean or null
categorystring or null
defaultInstallArgsstring or null
defaultUninstallArgsstring or null
descriptionstring or null
detectionarray of DetectionRuleView or null
detection[].expectedstring
detection[].kindrequiredstring
detection[].pathrequiredstring
detection[].valueNamestring
iconTextstring or null
licenseTypestring or null
namestring or null
pinnedVersionstring or null
publisherstring or null
requiresApprovalboolean or null
selfServiceVisibleboolean or null
sourceRefstring or null
sourceSha256string or null
sourceTypestring or null
successExitCodesarray of integer or null
tagsarray of string or null
timeoutSecondsinteger or null
StatusBodyDescription
201application/json, SoftwarePackageDetailViewCreated.
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 software:manage.
404application/problem+json, ProblemDetailsPackage not found.
409application/problem+json, ProblemDetailsThat application is already in the catalog.
500application/problem+json, ProblemDetailsCould not create the package.
503application/problem+json, ProblemDetailsThe software catalog is not available on this Depot.

201 response body

FieldTypeDescription
approvalStatusrequiredstring, one of approved, not_allowed, unreviewed
autoUpdaterequiredboolean
builtInrequiredboolean
categoryrequiredstring
defaultInstallArgsrequiredstring
defaultUninstallArgsrequiredstring
descriptionrequiredstring
detectionrequiredarray of DetectionRuleView
detection[].expectedstring
detection[].kindrequiredstring
detection[].pathrequiredstring
detection[].valueNamestring
iconTextrequiredstring
installedCountrequiredinteger
licenseTyperequiredstring
managedByProviderrequiredboolean
namerequiredstring
pinnedVersionrequiredstring
publicIdrequiredstring
publisherrequiredstring
requiresApprovalrequiredboolean
selfServiceVisiblerequiredboolean
sourceRefrequiredstring
sourceSha256requiredstring
sourceTyperequiredstring, one of apt, brew, choco, custom_upload, direct_url, dnf, manifest, pkg, winget
successExitCodesrequiredarray of integer
tagsrequiredarray of string
timeoutSecondsrequiredinteger
updatedAtrequiredstring (date-time)
versionCountrequiredinteger
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/software/packages' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"approvalStatus": "string",
"autoUpdate": false,
"category": "string",
"defaultInstallArgs": "string",
"defaultUninstallArgs": "string",
"description": "string",
"detection": [
{
"expected": "string",
"kind": "string",
"path": "string",
"valueName": "string"
}
],
"iconText": "string",
"licenseType": "string",
"name": "string",
"pinnedVersion": "string",
"publisher": "string",
"requiresApproval": false,
"selfServiceVisible": false,
"sourceRef": "string",
"sourceSha256": "string",
"sourceType": "string",
"successExitCodes": [
0
],
"tags": [
"string"
],
"timeoutSeconds": 0
}'

GETsoftware:readshared facehosteditmspremoteIdempotent

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

Source: [object Object]

Get software package

NameInTypeRequiredDescription
packageIdpathstringYesA uuid.
StatusBodyDescription
200application/json, SoftwarePackageDetailViewSuccess.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold software:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsCould not read the package.
503application/problem+json, ProblemDetailsThe software catalog is not available on this Depot.

200 response body

FieldTypeDescription
approvalStatusrequiredstring, one of approved, not_allowed, unreviewed
autoUpdaterequiredboolean
builtInrequiredboolean
categoryrequiredstring
defaultInstallArgsrequiredstring
defaultUninstallArgsrequiredstring
descriptionrequiredstring
detectionrequiredarray of DetectionRuleView
detection[].expectedstring
detection[].kindrequiredstring
detection[].pathrequiredstring
detection[].valueNamestring
iconTextrequiredstring
installedCountrequiredinteger
licenseTyperequiredstring
managedByProviderrequiredboolean
namerequiredstring
pinnedVersionrequiredstring
publicIdrequiredstring
publisherrequiredstring
requiresApprovalrequiredboolean
selfServiceVisiblerequiredboolean
sourceRefrequiredstring
sourceSha256requiredstring
sourceTyperequiredstring, one of apt, brew, choco, custom_upload, direct_url, dnf, manifest, pkg, winget
successExitCodesrequiredarray of integer
tagsrequiredarray of string
timeoutSecondsrequiredinteger
updatedAtrequiredstring (date-time)
versionCountrequiredinteger
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/software/packages/<packageId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PUTsoftware:manageshared facehosteditmspremoteIdempotent

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

Source: [object Object]

Update software package

NameInTypeRequiredDescription
packageIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
approvalStatusstring or null
autoUpdateboolean or null
categorystring or null
defaultInstallArgsstring or null
defaultUninstallArgsstring or null
descriptionstring or null
detectionarray of DetectionRuleView or null
detection[].expectedstring
detection[].kindrequiredstring
detection[].pathrequiredstring
detection[].valueNamestring
iconTextstring or null
licenseTypestring or null
namestring or null
pinnedVersionstring or null
publisherstring or null
requiresApprovalboolean or null
selfServiceVisibleboolean or null
sourceRefstring or null
sourceSha256string or null
sourceTypestring or null
successExitCodesarray of integer or null
tagsarray of string or null
timeoutSecondsinteger or null
StatusBodyDescription
200application/json, SoftwarePackageDetailViewSuccess.
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 the required permission.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsWhat a package IS cannot be changed after it is created, because every deployment that already named it would silently start installing something else. Retire this entry and add a new one.
500application/problem+json, ProblemDetailsCould not read the package.
503application/problem+json, ProblemDetailsThe software catalog is not available on this Depot.

200 response body

FieldTypeDescription
approvalStatusrequiredstring, one of approved, not_allowed, unreviewed
autoUpdaterequiredboolean
builtInrequiredboolean
categoryrequiredstring
defaultInstallArgsrequiredstring
defaultUninstallArgsrequiredstring
descriptionrequiredstring
detectionrequiredarray of DetectionRuleView
detection[].expectedstring
detection[].kindrequiredstring
detection[].pathrequiredstring
detection[].valueNamestring
iconTextrequiredstring
installedCountrequiredinteger
licenseTyperequiredstring
managedByProviderrequiredboolean
namerequiredstring
pinnedVersionrequiredstring
publicIdrequiredstring
publisherrequiredstring
requiresApprovalrequiredboolean
selfServiceVisiblerequiredboolean
sourceRefrequiredstring
sourceSha256requiredstring
sourceTyperequiredstring, one of apt, brew, choco, custom_upload, direct_url, dnf, manifest, pkg, winget
successExitCodesrequiredarray of integer
tagsrequiredarray of string
timeoutSecondsrequiredinteger
updatedAtrequiredstring (date-time)
versionCountrequiredinteger
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/software/packages/<packageId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"approvalStatus": "string",
"autoUpdate": false,
"category": "string",
"defaultInstallArgs": "string",
"defaultUninstallArgs": "string",
"description": "string",
"detection": [
{
"expected": "string",
"kind": "string",
"path": "string",
"valueName": "string"
}
],
"iconText": "string",
"licenseType": "string",
"name": "string",
"pinnedVersion": "string",
"publisher": "string",
"requiresApproval": false,
"selfServiceVisible": false,
"sourceRef": "string",
"sourceSha256": "string",
"sourceType": "string",
"successExitCodes": [
0
],
"tags": [
"string"
],
"timeoutSeconds": 0
}'

DELETE /api/v1/software/packages/{packageId}

Section titled “DELETE /api/v1/software/packages/{packageId}”

DELETEsoftware:manageshared facehosteditmspremoteIdempotent

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

Source: [object Object]

Delete software package

NameInTypeRequiredDescription
packageIdpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold the required permission.
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 package.
503application/problem+json, ProblemDetailsThe software catalog is 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/software/packages/<packageId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/software/packages/{packageId}/versions

Section titled “GET /api/v1/software/packages/{packageId}/versions”

GETsoftware:readshared facehosteditmspremoteIdempotent

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

Source: [object Object]

List software versions

NameInTypeRequiredDescription
packageIdpathstringYesA uuid.
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 software:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsCould not read the package.
503application/problem+json, ProblemDetailsThe software catalog is 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/software/packages/<packageId>/versions' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/software/packages/{packageId}/versions

Section titled “POST /api/v1/software/packages/{packageId}/versions”

POSTsoftware:manageshared facehosteditmspremote

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

Source: [object Object]

uploadSoftwareVersion takes one installer as a multipart body: a JSON “metadata” part, then the file as “installer”.

MULTIPART AND STREAMED, unlike the ticket attachment route next door, and both halves are deliberate. Multipart because there are two things to send and the metadata has to arrive FIRST so a bad version string is refused before two gigabytes cross the wire; streamed through r.MultipartReader rather than ParseMultipartForm because that one buffers and spools the whole form before a handler sees any of it, which for this size is the difference between a temp file and an out-of-memory.

The bytes are spooled to a temp file all the same, because the destination needs an exact Content-Length before the first byte goes out and a multipart part does not declare one. The digest is computed on the way past, so the spool is read once and hashed once.

A version row may also be written with NO file, which is what pins a winget or choco package to one version. The store enforces the other half: a custom_upload package’s version cannot exist without kind, digest and key.

NameInTypeRequiredDescription
packageIdpathstringYesA uuid.
storageProfileIdquerystringNo

Required, sent as multipart/form-data.

The body is object.

StatusBodyDescription
201application/json, SoftwareVersionViewCreated.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold the required permission.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThat version is already recorded for this package.
413application/problem+json, ProblemDetailsThe request was refused.
500application/problem+json, ProblemDetailsCould not read the package.
503application/problem+json, ProblemDetailsThe software catalog is not available on this Depot.
507application/problem+json, ProblemDetailsThe storage this catalog writes to is full. Raise the quota or remove old installers.

201 response body

FieldTypeDescription
createdAtrequiredstring (date-time)
fileNamerequiredstring
installerKindrequiredstring
publicIdrequiredstring
sha256requiredstring
silentArgsstring
sizeBytesrequiredinteger

int64.

uploadedByrequiredstring
versionrequiredstring
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/software/packages/<packageId>/versions?storageProfileId=<storageProfileId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-b 'outpost_console=<console-session>' \
--data '{}'

DELETE /api/v1/software/versions/{versionId}

Section titled “DELETE /api/v1/software/versions/{versionId}”

DELETEsoftware:manageshared facehosteditmspremoteIdempotent

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

Source: [object Object]

deleteSoftwareVersion removes a version row and the bytes it points at.

THE OBJECT GOES FIRST, which is the opposite order to a ticket attachment, and the difference is that there is no sweeper on this side. An attachment whose object outlives its row is reconciled by the storage accountant; an installer in that state is billed forever with nothing in any database pointing at it, because SumInstallerBytesByProfile counts ROWS. So a failed object delete is fatal here: the row stays, the operator can see the version and try again, and nothing is orphaned.

NameInTypeRequiredDescription
versionIdpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThat installer belongs to the shared catalog, so it is managed for every client at once and cannot be removed here.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsCould not read the version.
502application/problem+json, ProblemDetailsThe stored installer could not be removed, so the version was kept. Try again.
503application/problem+json, ProblemDetailsThe software catalog is 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/software/versions/<versionId>' \
-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.