Skip to content

Delete a Workspace

DELETE
/apis/nodus.dev/v1/namespaces/{namespace}/workspaces/{name}
curl --request DELETE \
--url https://example.com/apis/nodus.dev/v1/namespaces/example/workspaces/example
namespace
required
string

The project.

name
required
string

The object’s name.

dryRun
string
fieldValidation
string
fieldManager
string
propagationPolicy
string
Idempotency-Key
string
If-Match
string

OK

Media type application/json

Workspace is a person’s GPU or CPU development machine with SSH, VS Code in the browser or on the desktop, JupyterLab, a persistent home Volume and schedules. Each running period is a session, recorded as an Attempt with its receipt (nodus get attempts -l nodus.dev/workspace=<name>).

object
apiVersion
string
kind
string
metadata
object
annotations
object
key
additional properties
string
creationTimestamp
string
deletionGracePeriodSeconds
integer format: int64
deletionTimestamp
string
finalizers
Array<string>
nullable
generateName
string
generation
integer format: int64
labels
object
key
additional properties
string
managedFields
Array<object>
nullable
object
apiVersion
string
fieldsType
string
fieldsV1
object
key
additional properties
manager
string
operation
string
subresource
string
time
string
name
string
namespace
string
ownerReferences
Array<object>
nullable
object
apiVersion
required
string
blockOwnerDeletion
boolean
controller
boolean
kind
required
string
name
required
string
uid
required
string
resourceVersion
string
selfLink
string
uid
string
spec

WorkspaceSpec is the desired Workspace.

object
connections

Connections inject their env and egress hosts (at most 4).

Array<string>
nullable
env

Env sets environment variables (at most 256). The NODUS_ prefix is reserved.

Array<object>
nullable

EnvVar is one environment variable: a literal value or a Secret key.

object
name
required

Name matches ^[A-Za-z_][A-Za-z0-9_]*$.

string
value

Value is the literal value.

string
valueFrom

EnvVarSource names where an env value comes from.

object
secretKeyRef

SecretKeySelector selects one key of a Secret.

object
key
required

Key is the key within it.

string
name
required

Name is the Secret.

string
ephemeral

Ephemeral runs without a home Volume: local files are lost when the Workspace stops.

boolean
idleTimeout

IdleTimeout stops the Workspace after this long with no SSH session, tool traffic or Process (default 1h; 0s never stops it for idleness; otherwise 10m to 24h).

string
image

Image is the container image: a catalog image such as nodus/workspace-pytorch-cuda (the GPU default), nodus/workspace-cpu (the CPU default) or nodus/workspace-rocm, or your own image. It can change while the Workspace is stopped and applies on the next start.

string
imagePullSecrets

ImagePullSecrets name Registry Secrets used to pull a private image (at most 4).

Array<string>
nullable
maxCostUSD

MaxCostUSD stops the Workspace once its charges reach this amount; it may only be raised.

string
network

Network sets egress for the container.

object
egress

Egress is the outbound network policy.

object
allow

Allow lists DNS names or *.suffix patterns (AllowList only; at most 128).

Array<string>
nullable
policy

Policy is Deny, AllowList or Open.

string
presets

Presets add curated host lists such as python-packages or huggingface.

Array<string>
nullable
placement

Placement constrains where work may run.

object
dedicated

Dedicated is reserved; only true is accepted.

boolean
interruptible

Interruptible is Never, Allow (the scheduler decides by expected cost) or Prefer.

string
maxRateUSDPerHour

MaxRateUSDPerHour filters out offerings above this customer rate.

string
offerings

Offerings restricts placement to these Offerings.

Array<string>
nullable
pool

Pool is a BYOC Pool in the project.

string
profile

Profile is Balanced, Cost or Speed.

string
queueTimeout

QueueTimeout is how long the Job may wait for capacity before failing with CapacityUnavailable (default 24h; 0s waits forever).

string
regions

Regions are region classes (us, eu, …); empty means any.

Array<string>
nullable
resources

Resources are capacity floors. For GPU work the offering’s host shape applies if larger.

object
cpu

CPU is the vCPU floor.

string
disk

Disk is the ephemeral disk floor.

string
gpu

GPURequest asks for accelerators. A family (H100) matches any of its variants and never another family.

object
count

Count is the GPUs per node: 1, 2, 4 or 8.

integer format: int32
exact

Exact pins the exact variant instead of matching the family.

boolean
interconnect

Interconnect is Any or NVLink.

string
minMemory

MinMemory is the per-GPU memory floor.

string
type

Type lists 1–8 accelerator ids or families from the catalog.

Array<string>
nullable
memory

Memory is the host memory floor.

string
nodes

Nodes above 1 is shorthand for spec.distributed.nodes and is stored in that form.

integer format: int32
schedule

WorkspaceSchedule is one working window: the Workspace is ready by readyBy and stops at stopAt.

object
readyBy

ReadyBy is when the Workspace must be ready; it starts 15 minutes earlier. At least 15 minutes from now.

string
stopAt

StopAt is when the Workspace stops; after readyBy.

string
secrets

Secrets mount Secrets as env vars and 0400 files under /run/secrets// (at most 32).

Array<object>
nullable

SecretMount mounts one Secret, optionally pinned to a version. The bare name is accepted on write.

object
name
required

Name is the Secret.

string
version

Version pins a version; unset pins the latest at admission.

integer format: int32
serviceAccountName

ServiceAccountName governs calls made from inside the Workspace (default “default”).

string
sshKeys

SSHKeys names the SSHKeys that may log in; empty means every key of the org’s members who may use this project (at most 100). Removing a key ends the sessions it opened.

Array<string>
nullable
state

State is Running (the default) or Stopped. Stopping saves /home/nodus and releases the machine.

string
tools

Tools lists the tools to serve (default VSCode, Jupyter and SSH).

Array<string>
nullable
volume

Volume is a ReadWriteOnce Volume mounted at /home/nodus and saved on every stop. Exactly one of volume and ephemeral: true.

string
status

WorkspaceStatus is the observed Workspace.

object
conditions

Conditions are Scheduled, Funded, Ready, Stopped, NodeUnreachable, SetupComplete and StateSaved.

Array<object>
nullable
object
lastTransitionTime
required
string
message
required
string
observedGeneration
integer format: int64
reason
required
string
status
required
string
type
required
string
connect

WorkspaceConnect says how to reach the Workspace.

object
jupyter

WorkspaceURL is one browser tool’s address.

object
url
required

URL opens the tool.

string
ssh

WorkspaceSSHConnect is the SSH entry of a Workspace.

object
command
required

Command connects from a terminal.

string
host
required

Host is ...nodus, reached with ProxyCommand nodus ssh-proxy %h.

string
hostKey

HostKey is the Workspace’s SSH host key (ssh-ed25519 …); it stays the same across sessions, and nodus ssh pins it for the host.

string
vscode

WorkspaceURL is one browser tool’s address.

object
url
required

URL opens the tool.

string
cost

Cost is status.cost on every kind that spends money. It is a display copy of the ledger: amounts are decimal USD strings, and nothing is charged from these fields.

object
bySegment

CostSegments splits a charge by billing segment.

object
bootUSD

BootUSD is the charge from the start of billing until the program started.

string
coveredByNodus

CoveredByNodus lists the segments (Boot, Running, Restore, Teardown) with time Nodus paid for instead of charging it, such as the start and teardown of a run that failed because of Nodus.

Array<string>
nullable
restoreUSD

RestoreUSD is the charge for bringing a replacement up after capacity was lost.

string
runningUSD

RunningUSD is the charge while the program ran.

string
teardownUSD

TeardownUSD is the charge from stop until deletion was confirmed, with the billing increment.

string
final

Final is true once the final charge has posted.

boolean
fundedUntilTime

FundedUntilTime is when the current holds stop paying for the object.

string
heldUSD

HeldUSD is what is currently held for it.

string
limitUSD

LimitUSD is the object’s maxCostUSD, if it has one.

string
rateUSDPerHour

RateUSDPerHour is the sum of the hourly rates of its capacity that is still billing.

string
totalUSD

TotalUSD is what has been charged for this object so far.

string
endpoints

Endpoints are the preview URLs of the browser tools.

Array<object>
nullable

WorkspaceEndpoint is one preview URL.

object
name
required

Name is the tool or port name.

string
port
required

Port is the container port.

integer format: int32
url
required

URL is the preview address.

string
estimate

Estimate is returned in status.estimate by a dry-run (?dryRun=All) and on create for every compute kind (ADR-031). Amounts are decimal USD strings; the ETag of the dry-run response binds a later create to it.

object
assemblyBoundUSD

AssemblyBoundUSD is the most a multi-node Job can cost if its members never assemble.

string
blockingReasons

BlockingReasons say why a real create would fail now, with the amounts and a fix.

Array<object>
nullable

BlockingReason says why a create would fail now.

object
code
required

Code is the error code the create would return, for example InsufficientCredits.

string
fix

Fix says what to do.

string
message

Message states the reason with the amounts involved.

string
concurrentHoldUSD

ConcurrentHoldUSD is the total of the holds for every slot that starts at once.

string
costUSD

USDBand is a median and a 90th-percentile amount in USD.

object
p50

P50 is the median amount.

string
p90

P90 is the 90th-percentile amount.

string
gangHoldUSD

GangHoldUSD is the total of the member holds of a multi-node Job.

string
holdUSD

HoldUSD is the first hold that must fit your balance, every matching Budget and the object’s own cap.

string
minimumChargeUSD

MinimumChargeUSD is the billing increment rounding charged once per allocation.

string
overheadUSD

USDBand is a median and a 90th-percentile amount in USD.

object
p50

P50 is the median amount.

string
p90

P90 is the 90th-percentile amount.

string
placementPreview

PlacementPreview is the customer-safe description of the capacity a create would use.

object
explain

Explain is the scheduler’s explanation, the same shape as Attempt status.placement.explain.

interruptible

Interruptible reports whether the capacity can be reclaimed.

boolean
offering

Offering is the offering id, for example h100-sxm-80g-x8-us.

string
regionClass

RegionClass is the region class of the offering.

string
warmReuse

WarmReuse reports whether warm capacity would be reused.

boolean
pricebookVersion

PricebookVersion is the price book the estimate used.

string
rateUSDPerHour

RateUSDPerHour is the hourly rate of the chosen capacity.

string
startup

StartupEstimate is the expected time to start.

object
cold

DurationBand is a median and a 90th-percentile duration, as Go duration strings.

object
p50

P50 is the median duration.

string
p90

P90 is the 90th-percentile duration.

string
warm

DurationBand is a median and a 90th-percentile duration, as Go duration strings.

object
p50

P50 is the median duration.

string
p90

P90 is the 90th-percentile duration.

string
topology

Topology is the resolved multi-node topology of a gang Job.

validUntil

ValidUntil is when the prices this estimate used stop being current. A create bound by If-Match is admitted after it too, and never placed above rateUSDPerHour plus 10 %.

string
warnings

Warnings are non-blocking notes, for example ColdStart or InterruptibleSelected.

Array<object>
nullable

EstimateWarning is a non-blocking note on an estimate.

object
code
required

Code is the CamelCase warning code.

string
message

Message explains the warning.

string
handledRequests

HandledRequests records the request annotations already acted on.

object
key
additional properties
string
home

WorkspaceHome is the saved state of the home directory.

object
revision

Revision is the Volume revision the last stop committed; zero before the first save.

integer format: int64
savedTime

SavedTime is when that revision was committed.

string
volume
required

Volume is the home Volume.

string
lastActivityTime

LastActivityTime is the last SSH session, tool request or Process seen; idleTimeout counts from it.

string
lastSession

WorkspaceSessionReceipt is what one finished session cost.

object
attempt
required

Attempt is the session’s Attempt.

string
billedSeconds
required

BilledSeconds is the time charged, from supplier billing start to confirmed deletion.

integer format: int64
chargeUSD

ChargeUSD is what the session cost.

string
endTime

EndTime is when its capacity was released.

string
startTime

StartTime is when the session started.

string
stopReason

StopReason is why the session ended.

string
message

Message explains the phase.

string
nextScheduledStartTime

NextScheduledStartTime is when the schedule will next start the Workspace (15 minutes before readyBy).

string
observedGeneration

ObservedGeneration is the spec generation this status reflects.

integer format: int64
phase

Phase is Pending, Starting, Running, Recovering, Stopping, Stopped, Terminating or Failed.

string
reason

Reason is a machine-readable cause of the phase.

string
session

WorkspaceSession is the running session.

object
attempt
required

Attempt is the session’s Attempt.

string
offering

Offering is the capacity the session runs on.

string
rateUSDPerHour

RateUSDPerHour is the rate frozen for the session.

string
regionClass

RegionClass is the region class of that capacity.

string
startTime

StartTime is when the session’s tools first answered; empty while starting.

string
startEstimate

DurationBand is a median and a 90th-percentile duration, as Go duration strings.

object
p50

P50 is the median duration.

string
p90

P90 is the 90th-percentile duration.

string
stopByTime

StopByTime is the funded edge while Funded is False: a money-driven stop commits the home until then and stops without the commit once it passes (ADR-086).

string
stopReason

StopReason says why the Workspace is stopped; empty while it runs.

string
Example generated
{
"apiVersion": "example",
"kind": "example",
"metadata": {
"annotations": {
"additionalProperty": "example"
},
"creationTimestamp": "example",
"deletionGracePeriodSeconds": 1,
"deletionTimestamp": "example",
"finalizers": [
"example"
],
"generateName": "example",
"generation": 1,
"labels": {
"additionalProperty": "example"
},
"managedFields": [
{
"apiVersion": "example",
"fieldsType": "example",
"fieldsV1": {
"additionalProperty": "example"
},
"manager": "example",
"operation": "example",
"subresource": "example",
"time": "example"
}
],
"name": "example",
"namespace": "example",
"ownerReferences": [
{
"apiVersion": "example",
"blockOwnerDeletion": true,
"controller": true,
"kind": "example",
"name": "example",
"uid": "example"
}
],
"resourceVersion": "example",
"selfLink": "example",
"uid": "example"
},
"spec": {
"connections": [
"example"
],
"env": [
{
"name": "example",
"value": "example",
"valueFrom": {
"secretKeyRef": {
"key": "example",
"name": "example"
}
}
}
],
"ephemeral": true,
"idleTimeout": "example",
"image": "example",
"imagePullSecrets": [
"example"
],
"maxCostUSD": "example",
"network": {
"egress": {
"allow": [
"example"
],
"policy": "example",
"presets": [
"example"
]
}
},
"placement": {
"dedicated": true,
"interruptible": "example",
"maxRateUSDPerHour": "example",
"offerings": [
"example"
],
"pool": "example",
"profile": "example",
"queueTimeout": "example",
"regions": [
"example"
]
},
"resources": {
"cpu": "example",
"disk": "example",
"gpu": {
"count": 1,
"exact": true,
"interconnect": "example",
"minMemory": "example",
"type": [
"example"
]
},
"memory": "example",
"nodes": 1
},
"schedule": {
"readyBy": "example",
"stopAt": "example"
},
"secrets": [
{
"name": "example",
"version": 1
}
],
"serviceAccountName": "example",
"sshKeys": [
"example"
],
"state": "example",
"tools": [
"example"
],
"volume": "example"
},
"status": {
"conditions": [
{
"lastTransitionTime": "example",
"message": "example",
"observedGeneration": 1,
"reason": "example",
"status": "example",
"type": "example"
}
],
"connect": {
"jupyter": {
"url": "example"
},
"ssh": {
"command": "example",
"host": "example",
"hostKey": "example"
},
"vscode": {
"url": "example"
}
},
"cost": {
"bySegment": {
"bootUSD": "example",
"coveredByNodus": [
"example"
],
"restoreUSD": "example",
"runningUSD": "example",
"teardownUSD": "example"
},
"final": true,
"fundedUntilTime": "example",
"heldUSD": "example",
"limitUSD": "example",
"rateUSDPerHour": "example",
"totalUSD": "example"
},
"endpoints": [
{
"name": "example",
"port": 1,
"url": "example"
}
],
"estimate": {
"assemblyBoundUSD": "example",
"blockingReasons": [
{
"code": "example",
"fix": "example",
"message": "example"
}
],
"concurrentHoldUSD": "example",
"costUSD": {
"p50": "example",
"p90": "example"
},
"gangHoldUSD": "example",
"holdUSD": "example",
"minimumChargeUSD": "example",
"overheadUSD": {
"p50": "example",
"p90": "example"
},
"placementPreview": {
"explain": "example",
"interruptible": true,
"offering": "example",
"regionClass": "example",
"warmReuse": true
},
"pricebookVersion": "example",
"rateUSDPerHour": "example",
"startup": {
"cold": {
"p50": "example",
"p90": "example"
},
"warm": {
"p50": "example",
"p90": "example"
}
},
"topology": "example",
"validUntil": "example",
"warnings": [
{
"code": "example",
"message": "example"
}
]
},
"handledRequests": {
"additionalProperty": "example"
},
"home": {
"revision": 1,
"savedTime": "example",
"volume": "example"
},
"lastActivityTime": "example",
"lastSession": {
"attempt": "example",
"billedSeconds": 1,
"chargeUSD": "example",
"endTime": "example",
"startTime": "example",
"stopReason": "example"
},
"message": "example",
"nextScheduledStartTime": "example",
"observedGeneration": 1,
"phase": "example",
"reason": "example",
"session": {
"attempt": "example",
"offering": "example",
"rateUSDPerHour": "example",
"regionClass": "example",
"startTime": "example"
},
"startEstimate": {
"p50": "example",
"p90": "example"
},
"stopByTime": "example",
"stopReason": "example"
}
}

An error: a metav1.Status whose reason is a registered code.

Media type application/json

Status is the error body of every API response: a Kubernetes metav1.Status (so kubectl and client-go understand it) plus three top-level extensions that those clients ignore (ADR-028).

object
apiVersion
string
code
integer format: int32
details
object
causes
Array<object>
nullable
object
field
string
message
string
reason
string
group
string
kind
string
name
string
retryAfterSeconds
integer format: int32
uid
string
docs

Docs is the URL of the code’s docs page.

string
fix

Fix says what to do next, for example a CLI command or the field to change.

string
kind
string
message
string
metadata
object
continue
string
remainingItemCount
integer format: int64
resourceVersion
string
selfLink
string
shardInfo
object
selector
required
string
reason
string
requestId

RequestID identifies the request in logs and support tickets.

string
status
string
Example generated
{
"apiVersion": "example",
"code": 1,
"details": {
"causes": [
{
"field": "example",
"message": "example",
"reason": "example"
}
],
"group": "example",
"kind": "example",
"name": "example",
"retryAfterSeconds": 1,
"uid": "example"
},
"docs": "example",
"fix": "example",
"kind": "example",
"message": "example",
"metadata": {
"continue": "example",
"remainingItemCount": 1,
"resourceVersion": "example",
"selfLink": "example",
"shardInfo": {
"selector": "example"
}
},
"reason": "example",
"requestId": "example",
"status": "example"
}