Skip to content
Spinbox is experimental: APIs change and data may be lost. Status lists what is built and what proves it.

AdminService

View Markdown

AdminService manages installation-wide settings, user management, and resource presets. Only accessible to instance administrators.

POST /spin.v1.AdminService/AddAllowedEmail

Add allowed email/domain

Request

FieldTypeWhat it is
patternstringEmail address (user@example.com) or domain (example.com)
typeAllowedEmailType
descriptionstringOptional description

Response

FieldTypeWhat it is
entryAllowedEmail

POST /spin.v1.AdminService/CreateNetworkPolicy

Request

FieldTypeWhat it is
policyNetworkPolicyRule

Response

No fields: {}.

POST /spin.v1.AdminService/CreateResourcePreset

Create a resource preset

Request

FieldTypeWhat it is
namestringRequired: display name
descriptionstringOptional: description
cpuCoresinteger (int32)Required: CPU cores
memoryMbinteger (int32)Required: memory in MB
diskGbinteger (int32)Required: disk in GB
burstBurstModeRequired
isDefaultbooleanOptional: make this the default
enabledbooleanOptional: enable the preset (default true)
sortOrderinteger (int32)Optional: display order
burstFloorCpuCoresinteger (int32)Required for a burst mode: what its workspaces start with, at most the preset’s size.
burstFloorMemoryMbinteger (int32)
bandwidthMbpsinteger (int32)What a workspace of it may carry each way, in megabits a second; 0 is unshaped.
rpoSecondsinteger (int32)How far behind the object store a workspace of it may fall, in seconds; 0 is the installation’s.

Response

FieldTypeWhat it is
presetResourcePreset

POST /spin.v1.AdminService/DecideConfigChange

Apply a change the file proposes, or dismiss it. Either is remembered until the file says something else again. Audited with the admin who decided.

Request

FieldTypeWhat it is
kindConfigItemKind
namestring
saysstringConfigChange.says, as listed.
applybooleanTrue writes what the file says; false keeps what the installation has.

Response

No fields: {}.

POST /spin.v1.AdminService/DeleteNetworkPolicy

Refused while a workspace runs under the policy or it is the installation’s default.

Request

FieldTypeWhat it is
namestring

Response

No fields: {}.

POST /spin.v1.AdminService/DeleteResourcePreset

Delete a resource preset

Request

FieldTypeWhat it is
idstringRequired: preset ID to delete

Response

No fields: {}.

POST /spin.v1.AdminService/ExplainStorageKey

What one key in the store is, and whose: a key read off the bucket’s console says nothing a person can act on.

Request

FieldTypeWhat it is
keystring

Response

FieldTypeWhat it is
whatstringWhat the object is, in words.
volumeStoredVolumeWhose it is, when it is a volume’s.

POST /spin.v1.AdminService/GetBill

What the installation cost in a month, as its cloud’s bill says: by day and service, what the month is forecast to end at, and its budget. As the control plane last read the bill - a few times a day (internal/controlplane/domain/bill) - never the cloud itself, where every question to its billing is billed.

Request

FieldTypeWhat it is
monthTimestampThe month, as any instant in it (UTC’s); unset is the month in progress.

Response

FieldTypeWhat it is
monthTimestampThe month’s first instant, UTC.
readAtTimestampWhen the bill was last read; unset where it never was - no scope (bill_scope), or a cloud that sends none - and then nothing below is known.
currencystringISO 4217; every amount here is in millionths of it.
totalMicrosstring (int64)The month so far, every day and service.
forecastMicrosstring or null (int64)What the month is forecast to end at; unset where the cloud has no forecast yet.
budgetLimitMicrosstring or null (int64)The installation’s budget and what the cloud counts against it; unset where it has none.
budgetActualMicrosstring or null (int64)
budgetForecastMicrosstring or null (int64)
dayslist of BillDayOldest first.

POST /spin.v1.AdminService/GetCosts

A month of the bill shared out to the workspaces that caused it: the runners’ by what each workspace held of them, the volumes’ bucket by what its volumes kept. What nobody caused is said apart and never spread: the runners’ capacity nobody held, the bucket’s bytes no workspace keeps, and the platform’s own cost by service (internal/controlplane/domain/finops).

Request

FieldTypeWhat it is
monthTimestampThe month, as any instant in it (UTC’s); unset is the month in progress.

Response

FieldTypeWhat it is
monthTimestampThe month’s first instant, UTC.
currencystringISO 4217; every amount here is in millionths of it.
workspaceslist of WorkspaceCostCostliest first.
idleMicrosstring (int64)What the runners cost that no workspace held.
unstoredMicrosstring (int64)What the volumes’ bucket cost for bytes no workspace keeps: the images, what nothing references any more.
platformlist of ServiceCostEvery other cost - the control plane, the proxy, keys, logs - by service, costliest first.

POST /spin.v1.AdminService/GetFleetVersions

What is running where: this control plane, each host’s runner and machine, and the extension releases workspaces are on. An installation is updated in halves, and this is the one page that says which halves it is in.

Request

No fields: {}.

Response

FieldTypeWhat it is
controlPlaneVersionstring
machineVersionstringThe spin-machine release this control plane pins, which a host should be running.
hostslist of FleetHostVersion
extensionslist of ExtensionVersion

POST /spin.v1.AdminService/GetInstallationSettings

Get installation settings

Request

No fields: {}.

Response

FieldTypeWhat it is
settingsInstallationSettings

POST /spin.v1.AdminService/GetMonitoring

The Grafana the control plane serves over the installation’s metrics, and the release’s dashboards in it.

Request

No fields: {}.

Response

FieldTypeWhat it is
grafanaGrafanaUnset where the control plane serves none: the installation keeps no metrics, or this machine has no Grafana.

POST /spin.v1.AdminService/GetPlatformImages

Whether the base image and the supervisor this control plane’s image carries are published.

Request

No fields: {}.

Response

FieldTypeWhat it is
imageslist of PlatformImageEmpty until the object store is configured: there is nowhere to publish to.
baseImageslist of BaseImageEvery base image published, one per machine release, newest first.
supervisorReleaseslist of ExtensionReleaseEvery release of the supervisor, newest first.
agentReleaseslist of ExtensionReleaseEvery release of the agent CLIs (Claude Code and Codex, one extension), newest first.

POST /spin.v1.AdminService/GetRegistrationMode

Get registration mode (open, whitelist, closed)

Request

No fields: {}.

Response

FieldTypeWhat it is
modeRegistrationMode

POST /spin.v1.AdminService/GetSecuritySettings

Get security settings

Request

No fields: {}.

Response

FieldTypeWhat it is
settingsSecuritySettings

POST /spin.v1.AdminService/GetStorageSettings

Where the installation’s object store is. The secret is never read back.

Request

No fields: {}.

Response

FieldTypeWhat it is
settingsStorageSettings
volumesExistbooleanWhether volumes exist, whose history is in this store: it can then be changed, but not for another bucket or directory.

POST /spin.v1.AdminService/GetStorageUsage

What the store holds, by what each object is for: every volume’s objects and the layers its commits name, with the workspace, image or extension release it is. As the storage-gc job last read it - daily, or when an admin runs it - never the bucket itself.

Request

No fields: {}.

Response

FieldTypeWhat it is
volumeslist of StoredVolumeHeaviest first.
unreferencedLayersStorageTallyLayers no commit in the store names: the storage GC’s to collect.
otherStorageTallyEverything outside volumes/ and layers/: the control plane’s election records.
measuredAtTimestamp

POST /spin.v1.AdminService/GetTelemetryStatus

What the collector has sent and failed to send over its last minute, as the watch on its machine read it from the collector itself.

Request

No fields: {}.

Response

FieldTypeWhat it is
reportedAtTimestampUnset: the watch has not reported since this control plane started - no collector, or not yet.
windowSecondsinteger (int32)How long the counts below are over.
spansTelemetryFlowInto the installation’s store, after the traces policy chose which to keep.
samplesTelemetryFlowInto the installation’s store of metrics.

POST /spin.v1.AdminService/GetVSCodeServers

The VS Code servers workspaces are given (the vscode-server extension): each release, and the publish this control plane ran since it started, if it ran one.

Request

No fields: {}.

Response

FieldTypeWhat it is
releaseslist of ExtensionReleaseNewest first.
publishVSCodeServerPublish
unavailablestringWhy this control plane cannot publish - no object store, or a build with no machine tools to make the image with - and empty when it can.

POST /spin.v1.AdminService/ListAllowedEmails

List allowed emails/domains

Request

FieldTypeWhat it is
pagePageRequest

Response

FieldTypeWhat it is
entrieslist of AllowedEmail
pagePageResponse

POST /spin.v1.AdminService/ListAuditLog

Read the audit log, newest first. There is no RPC that writes one: an entry is written by the operation it records, so a log an API could add to would be one an API could forge.

Request

FieldTypeWhat it is
pagePageRequest
actorIdstringEach filter is optional and they are combined with AND; an empty request is the whole log, newest first.
actionstring
resourceTypestring
sinceTimestampsince bounds the listing at the older end; an audit log is read forward from an incident, and the whole of one is not what a page wants.

Response

FieldTypeWhat it is
entrieslist of AuditEntry
pagePageResponse
actionslist of stringactions and resource_types are every value this installation can record, so a reader building a filter does not have to know them. They come from the code rather than from a DISTINCT over the log: the log is the one table that only grows, and a vocabulary that is empty until something happens is a filter that is empty when it matters.
resourceTypeslist of string
totalCappedbooleantotal_capped says page.total_count is where counting stopped, not the count: the log is counted up to a bound, since counting all of it is reading all of it on every page.

POST /spin.v1.AdminService/ListConfigChanges

What the config file says now and the installation does not, for an administrator to decide: the file seeds an installation once, and after that its changes are proposals.

Request

No fields: {}.

Response

FieldTypeWhat it is
changeslist of ConfigChange

POST /spin.v1.AdminService/ListJobRuns

One job’s runs, newest first.

Request

FieldTypeWhat it is
jobstring
limitinteger (int32)At most this many, newest first; zero is the default of 50.

Response

FieldTypeWhat it is
runslist of JobRun

POST /spin.v1.AdminService/ListJobs

The control plane’s periodic work - backups, cleanups, the object store’s garbage collection - with how often each runs and how its last run went.

Request

No fields: {}.

Response

FieldTypeWhat it is
jobslist of Job

POST /spin.v1.AdminService/ListRekeys

The disks being re-keyed, and the ones a revoked host’s keys marked for it.

Request

No fields: {}.

Response

FieldTypeWhat it is
rekeyslist of VolumeRekey

POST /spin.v1.AdminService/ListResourcePresets

List resource presets

Request

FieldTypeWhat it is
includeDisabledbooleanInclude disabled presets (admin only)
pagePageRequest

Response

FieldTypeWhat it is
presetslist of ResourcePreset
pagePageResponse

POST /spin.v1.AdminService/ListUserAPIKeys

List another user’s API keys. The secret is never stored, so this is what an admin can know about a key: what it is called, when it was made, when it was last used.

Request

FieldTypeWhat it is
userIdstring
pagePageRequest

Response

FieldTypeWhat it is
apiKeyslist of APIKey
pagePageResponse

POST /spin.v1.AdminService/ListUsers

List all users

Request

FieldTypeWhat it is
pagePageRequest
querystringOptional: filter by name or email
adminsOnlybooleanOptional: only return admin users

Response

FieldTypeWhat it is
userslist of User
pagePageResponse

POST /spin.v1.AdminService/PublishVSCodeServers

Publish the servers of the newest stable VS Code releases, or of the commits named, as a new release. Answers once the publish has begun - it downloads a gigabyte - and GetVSCodeServers says how it goes.

Request

FieldTypeWhat it is
newestinteger (int32)The newest stable releases to carry: 2 is the current one and the one before it.
commitslist of stringCommits to carry besides, each the second line of code --version.

Response

No fields: {}.

POST /spin.v1.AdminService/RekeyVolume

Re-key a workspace’s disk: copy it whole under a key of its own, point the workspace at the copy, and delete the disk - which shreds the key assumed taken and every snapshot of the disk, since those are what that key opens. The workspace must be stopped or quarantined. Refused for a disk something descends from. Audited.

Request

FieldTypeWhat it is
workspaceIdstring

Response

FieldTypeWhat it is
targetVolumeIdstring

POST /spin.v1.AdminService/RemoveAllowedEmail

Remove allowed email/domain

Request

FieldTypeWhat it is
idstring

Response

No fields: {}.

POST /spin.v1.AdminService/RemoveStoredVolume

Remove an image, an extension release, an unclaimed volume or an orphan from the store: its row, then its volume, whose key is shredded; storage-gc collects its layers on its next run. Refused for one that is kept (StoredVolume.kept_because), one placed on a host, and a workspace’s disk. Audited.

Request

FieldTypeWhat it is
volumeIdstring

Response

No fields: {}.

POST /spin.v1.AdminService/RetryPlatformImages

Look again now rather than when the next retry is due.

Request

No fields: {}.

Response

No fields: {}.

POST /spin.v1.AdminService/RevokeUserAPIKey

Revoke another user’s API key - the offboarding an admin cannot do by asking the user, who may already be gone. It is audited with the admin who did it.

Request

FieldTypeWhat it is
userIdstring
idstring

Response

No fields: {}.

POST /spin.v1.AdminService/RunJobNow

Run a job now rather than when it is next due. Refused while it is running: a second run alongside the first would do the same work twice. Audited with the admin who asked.

Request

FieldTypeWhat it is
jobstring

Response

No fields: {}.

POST /spin.v1.AdminService/SetRegistrationMode

Set registration mode

Request

FieldTypeWhat it is
modeRegistrationMode

Response

FieldTypeWhat it is
modeRegistrationMode

POST /spin.v1.AdminService/UntagImage

Take a ref off what it names: no new workspace gets those bytes by it, the disks cloned from them go on reading them, and a later publish under the ref tags the new bytes. Audited.

Request

FieldTypeWhat it is
refstring

Response

No fields: {}.

POST /spin.v1.AdminService/UpdateInstallationSettings

Update installation settings

Request

FieldTypeWhat it is
settingsInstallationSettings
updateMaskFieldMaskRequired: only the named fields of settings are written, so a form that edits one setting cannot reset the others to their zero values.

Response

FieldTypeWhat it is
settingsInstallationSettings

POST /spin.v1.AdminService/UpdateNetworkPolicy

Request

FieldTypeWhat it is
policyNetworkPolicyRule

Response

No fields: {}.

POST /spin.v1.AdminService/UpdateResourcePreset

Update a resource preset

Request

FieldTypeWhat it is
idstringRequired: preset ID to update
namestringOptional: new display name
descriptionstringOptional: new description
cpuCoresinteger (int32)Optional: new CPU cores
memoryMbinteger (int32)Optional: new memory
diskGbinteger (int32)Optional: new disk
burstBurstModeOptional: new burst mode
isDefaultbooleanOptional: make this the default
enabledbooleanOptional: enable/disable
sortOrderinteger (int32)Optional: new display order
burstFloorCpuCoresinteger (int32)Optional: new burst floor
burstFloorMemoryMbinteger (int32)Optional: new burst floor
bandwidthMbpsinteger or null (int32)Optional: a new bandwidth. Present, since zero - unshaped - is an answer and not “keep”.
rpoSecondsinteger or null (int32)Optional: a new RPO. Present, since zero - the installation’s - is an answer and not “keep”.

Response

FieldTypeWhat it is
presetResourcePreset

POST /spin.v1.AdminService/UpdateSecuritySettings

Update security settings

Request

FieldTypeWhat it is
settingsSecuritySettings

Response

FieldTypeWhat it is
settingsSecuritySettings

POST /spin.v1.AdminService/UpdateStorageSettings

Set where the object store is, checked against it before it is written; every control plane restarts within seconds to open it. Another store while volumes exist is refused.

Request

FieldTypeWhat it is
bucketstring
endpointstring
regionstring
accessKeyIdstring
secretAccessKeystring or nullAbsent keeps the secret there is.
dirstring
principalstring

Response

FieldTypeWhat it is
settingsStorageSettings

POST /spin.v1.AdminService/UpdateUser

Update user (can toggle is_instance_admin, disable user)

Request

FieldTypeWhat it is
idstringRequired: user ID
isInstanceAdminboolean or nullToggle admin status
disabledboolean or nullDisable/enable user
disabledReasonstring or nullReason for disabling (shown to user)

Response

FieldTypeWhat it is
userUser

Generated by task reference from spin/internal/controlplane/apidocs/spin.v1.openapi.json at 8eee32b9d.

Documents Spinbox v20261019.02. This page as Markdown, for a model or a terminal.