Skip to content

Depot sync

Registers the per-user Sync routes and the client-wide Sync report on 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.

GETsync:readtenant facehosteditmspremoteIdempotent

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

Source: [object Object]

Get user sync

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

200 response body

FieldTypeDescription
allowMeteredrequiredboolean
destinationrequiredSyncDestinationView

syncDestinationView names where this person's bytes are written.

destination.profileIdstring
destination.profileNamestring
destination.sourcerequiredstring
devicesrequiredarray of SyncDeviceView
devices[].agentIdrequiredstring
devices[].behindrequiredinteger

int64.

devices[].hostnamestring
devices[].lastSeqrequiredinteger

int64.

devices[].lastSyncAtstring (date-time) or null
displayNamestring
enabledrequiredboolean
enabledSourcerequiredSyncSourceView

syncSourceView is WHY a resolved setting has the value it has: which profile set it, which merge pass decided it, and at which rung of the ladder that profile is attached to this person.

enabledSource.passrequiredstring
enabledSource.profileIdstring
enabledSource.profileNamestring
enabledSource.scopestring
fileCountrequiredinteger

int64.

latestSeqrequiredinteger

int64.

maxVersionsrequiredinteger
namedUserIdrequiredstring
overQuotarequiredboolean
plaintextBytesrequiredinteger

int64.

quotaBytesrequiredinteger

int64.

quotaSourcerequiredSyncSourceView

syncSourceView is WHY a resolved setting has the value it has: which profile set it, which merge pass decided it, and at which rung of the ladder that profile is attached to this person.

quotaSource.passrequiredstring
quotaSource.profileIdstring
quotaSource.profileNamestring
quotaSource.scopestring
trashBytesrequiredinteger

int64.

uploadLimitKbpsrequiredinteger
usedBytesrequiredinteger

int64.

versionBytesrequiredinteger

int64.

versionRetentionDaysrequiredinteger
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/named-users/<userID>/sync' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/named-users/{userID}/sync/files

Section titled “GET /api/v1/named-users/{userID}/sync/files”

GETsync:filestenant facehosteditmspremoteIdempotent

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

Source: [object Object]

listUserSyncFiles lists one folder, the root, or the recycle bin.

?path=Reports/2026 one folder’s children, by whole path ?deleted=true the recycle bin, most recently deleted first

Paths are matched through the blind index, so this is equality on the whole path and there is no prefix or substring search. That is a property of storing the path encrypted, not an omission: see the migration header.

NameInTypeRequiredDescription
userIDpathstringYesA uuid.
pathquerystringNo
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 sync:files.
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 GET 'https://depot.example.com/api/v1/named-users/<userID>/sync/files?path=<path>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/named-users/{userID}/sync/files/{fileID}/restore

Section titled “POST /api/v1/named-users/{userID}/sync/files/{fileID}/restore”

POSTsync:managetenant facehosteditmspremoteIdempotent

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

Source: [object Object]

restoreUserSyncFile takes one file back out of the recycle bin.

The change log append is what makes this reach the person’s machines: a restore that only flipped DeletedAt would be true on the Depot and invisible on the laptop until something else happened to that file.

NameInTypeRequiredDescription
fileIDpathstringYesA uuid.
userIDpathstringYesA uuid.
StatusBodyDescription
200application/json, SyncFileViewSuccess.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold sync:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThat file is not in the recycle bin.
500application/problem+json, ProblemDetailsNo client store in request context.
507application/problem+json, ProblemDetailsThis person’s Outpost Sync folder is at its quota. Raise the quota, or empty their recycle bin and old versions, and try again.

200 response body

FieldTypeDescription
createdAtrequiredstring (date-time)
deletedrequiredboolean
deletedAtstring (date-time) or null
isFolderrequiredboolean
lastWriterAgentIdstring
namerequiredstring
publicIdrequiredstring
relPathrequiredstring
sizeBytesrequiredinteger

int64.

storedBytesrequiredinteger

int64.

updatedAtrequiredstring (date-time)
versionNorequiredinteger

int64.

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/named-users/<userID>/sync/files/<fileID>/restore' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/named-users/{userID}/sync/files/{fileID}/versions

Section titled “GET /api/v1/named-users/{userID}/sync/files/{fileID}/versions”

GETsync:filestenant facehosteditmspremoteIdempotent

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

Source: [object Object]

List user sync versions

NameInTypeRequiredDescription
fileIDpathstringYesA uuid.
userIDpathstringYesA 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 sync:files.
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 GET 'https://depot.example.com/api/v1/named-users/<userID>/sync/files/<fileID>/versions' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/named-users/{userID}/sync/files/{fileID}/versions/{versionNo}/restore

Section titled “POST /api/v1/named-users/{userID}/sync/files/{fileID}/versions/{versionNo}/restore”

POSTsync:managetenant facehosteditmspremoteIdempotent

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

Source: [object Object]

restoreUserSyncVersion makes a previous version the current contents.

THE OLD OBJECT IS PROMOTED, NOT COPIED. The current contents become a new history row, the chosen version’s key becomes the live row’s key, and that version row is then dropped. Nothing reads or writes a byte, which is why an admin console can do this at all - the bytes are encrypted with a DEK this process would otherwise have no reason to unwrap.

Dropping the version row is not bookkeeping, it is the invariant: no two rows may name one object, or the retention pruner deleting an expired version would delete the object the live file is using. The history stays complete either way, because what was current a moment ago is now the newest history row.

NameInTypeRequiredDescription
fileIDpathstringYesA uuid.
userIDpathstringYesA uuid.
versionNopathstringYes
StatusBodyDescription
200application/json, SyncFileViewSuccess.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold sync:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsA folder has no version history.
500application/problem+json, ProblemDetailsNo client store in request context.
507application/problem+json, ProblemDetailsThis person’s Outpost Sync folder is at its quota. Raise the quota, or empty their recycle bin and old versions, and try again.

200 response body

FieldTypeDescription
createdAtrequiredstring (date-time)
deletedrequiredboolean
deletedAtstring (date-time) or null
isFolderrequiredboolean
lastWriterAgentIdstring
namerequiredstring
publicIdrequiredstring
relPathrequiredstring
sizeBytesrequiredinteger

int64.

storedBytesrequiredinteger

int64.

updatedAtrequiredstring (date-time)
versionNorequiredinteger

int64.

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/named-users/<userID>/sync/files/<fileID>/versions/<versionNo>/restore' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETsync:readtenant facehosteditmspremoteIdempotentdownload

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

Source: [object Object]

getSyncReport is the client-wide rollup behind the console’s Reports section: one row per person who has any Sync data, plus the totals.

Driven from ListSyncUsers rather than from the roster of people, so a client with four thousand named users and six Sync users costs six rows. Somebody enabled but who has never uploaded is therefore absent, which is the right default for a storage report; the per-user tab is where “is it on for them” is answered.

NameInTypeRequiredDescription
formatquerystringNo
StatusBodyDescription
200application/octet-stream, string (binary)Success.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold sync:read.
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 GET 'https://depot.example.com/api/v1/reports/sync?format=<format>' \
-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.