Sandbox
Section titled “Sandbox”class Sandbox()Serializable sandbox handle with process/fs/git/interpreter/pty namespaces.
Sandbox.__init__
Section titled “Sandbox.__init__”def __init__(impl: AsyncSandbox, bridge: SyncBridge) -> NoneSandbox.id
Section titled “Sandbox.id”@propertydef id() -> strSandbox.name
Section titled “Sandbox.name”@propertydef name() -> str | NoneSandbox.state
Section titled “Sandbox.state”@propertydef state() -> Literal['queued', 'creating', 'starting', 'started', 'pausing', 'paused', 'stopping', 'stopped', 'destroying', 'destroyed', 'error', 'unknown']Sandbox.image_build_id
Section titled “Sandbox.image_build_id”@propertydef image_build_id() -> str | NoneSandbox.image
Section titled “Sandbox.image”@propertydef image() -> ImageRef | NoneSandbox.snapshot
Section titled “Sandbox.snapshot”@propertydef snapshot() -> SnapshotRef | NoneSandbox.target
Section titled “Sandbox.target”@propertydef target() -> str | NoneSandbox.region
Section titled “Sandbox.region”@propertydef region() -> Optional[str]Sandbox.capabilities
Section titled “Sandbox.capabilities”@propertydef capabilities() -> dict[str, str | int | float | bool | None | Sequence[str | int | float | bool | None | Sequence[JsonValue] | Mapping[str, JsonValue]] | Mapping[str, str | int | float | bool | None | Sequence[JsonValue] | Mapping[str, JsonValue]]]Sandbox.labels
Section titled “Sandbox.labels”@propertydef labels() -> Dict[str, str]Sandbox.cpu
Section titled “Sandbox.cpu”@propertydef cpu() -> Optional[float]Sandbox.cpu_max
Section titled “Sandbox.cpu_max”@propertydef cpu_max() -> Optional[int]Sandbox.memory
Section titled “Sandbox.memory”@propertydef memory() -> Optional[float]Sandbox.memory_max
Section titled “Sandbox.memory_max”@propertydef memory_max() -> Optional[float]Sandbox.disk
Section titled “Sandbox.disk”@propertydef disk() -> Optional[float]Sandbox.disk_max
Section titled “Sandbox.disk_max”@propertydef disk_max() -> Optional[float]Sandbox.vm_class
Section titled “Sandbox.vm_class”@propertydef vm_class() -> Optional[VmClass]Sandbox.persistent
Section titled “Sandbox.persistent”@propertydef persistent() -> Optional[bool]Sandbox.archived
Section titled “Sandbox.archived”@propertydef archived() -> Optional[bool]Sandbox.spot
Section titled “Sandbox.spot”@propertydef spot() -> Optional[bool]Sandbox.spot_evicted_at
Section titled “Sandbox.spot_evicted_at”@propertydef spot_evicted_at() -> Optional[str]Sandbox.lifecycle_policy
Section titled “Sandbox.lifecycle_policy”@propertydef lifecycle_policy() -> Optional[SandboxLifecycle]Sandbox.forked_from
Section titled “Sandbox.forked_from”@propertydef forked_from() -> Optional[str]Sandbox.reservation_id
Section titled “Sandbox.reservation_id”@propertydef reservation_id() -> Optional[str]Sandbox.user
Section titled “Sandbox.user”@propertydef user() -> Optional[str]Sandbox.error
Section titled “Sandbox.error”@propertydef error() -> Optional[str]Sandbox.error_reason
Section titled “Sandbox.error_reason”@propertydef error_reason() -> Optional[str]Sandbox.access_token
Section titled “Sandbox.access_token”@propertydef access_token() -> str | NoneSandbox.access_token_expires_at
Section titled “Sandbox.access_token_expires_at”@propertydef access_token_expires_at() -> str | NoneSandbox.toolbox_proxy_url
Section titled “Sandbox.toolbox_proxy_url”@propertydef toolbox_proxy_url() -> str | NoneSandbox.archive
Section titled “Sandbox.archive”def archive() -> NoneArchive a stopped persistent sandbox now, whatever its archive interval.
Sandbox.build_logs
Section titled “Sandbox.build_logs”def build_logs() -> strReturn retained build output as one-shot text, not a live follower.
Sandbox.create_access_token
Section titled “Sandbox.create_access_token”def create_access_token(*, operations: Optional[Sequence[str]] = None, ports: Optional[Sequence[int]] = None, ttl_seconds: Optional[int] = None) -> SandboxAccessTokenMint a scoped, short-lived access token for THIS sandbox.
Sandbox.create_snapshot
Section titled “Sandbox.create_snapshot”def create_snapshot(name: str) -> SnapshotSandbox.delete
Section titled “Sandbox.delete”def delete() -> NoneDelete the sandbox.
Sandbox.entrypoint_logs
Section titled “Sandbox.entrypoint_logs”def entrypoint_logs() -> strReturn the sandbox entrypoint-session log as text.
Sandbox.exec
Section titled “Sandbox.exec”def exec(command: Optional[str] = None, *, argv: Optional[Sequence[str]] = None, cwd: Optional[str] = None, env: Optional[Mapping[str, str]] = None, user: Optional[str] = None, shell: Optional[str] = None, login: Optional[bool] = None, stdin: StdinMode = 'closed', timeout: Optional[float] = None, execution_timeout: Optional[float] = None, name: Optional[str] = None, terminal: Optional[TerminalSize] = None, keep_logs: Optional[KeepLogs] = None) -> ProcessResultRun a command, wait for its shell to exit, and collect its output.
Sandbox.follow_build_logs
Section titled “Sandbox.follow_build_logs”def follow_build_logs(*, on_logs: _LogsCallback, on_event: Optional[_EventCallback] = None, cursor: Optional[str] = None, timeout: Optional[float] = None) -> BuildLogFollowResultObserve this sandbox’s build without changing its execution lifetime.
Sandbox.fork
Section titled “Sandbox.fork”def fork(*, name: Optional[str] = None, memory: Optional[bool] = None, timeout: Optional[float] = None) -> SandboxFork this sandbox.
Sandbox.get_network_policy
Section titled “Sandbox.get_network_policy”def get_network_policy() -> NetworkPolicyInfoSandbox.metrics
Section titled “Sandbox.metrics”def metrics() -> SystemMetricsSandbox.pause
Section titled “Sandbox.pause”def pause(*, timeout: float = 60) -> NonePause a persistent linux or macOS sandbox with its memory.
Sandbox.refresh_data
Section titled “Sandbox.refresh_data”def refresh_data(*, timeout: Optional[float] = None, wait: SandboxWaitState | None = None, wait_timeout_ms: int | None = None) -> NoneRefresh sandbox fields from the control plane.
Sandbox.reset_idle_timer
Section titled “Sandbox.reset_idle_timer”def reset_idle_timer() -> SandboxLifecycleReset this sandbox’s idle timer (an explicit out-of-band keepalive).
Sandbox.reset_network_policy
Section titled “Sandbox.reset_network_policy”def reset_network_policy(*, if_match: str) -> NetworkPolicyInfoSandbox.resume
Section titled “Sandbox.resume”def resume(*, timeout: float = 60) -> NoneResume a paused linux or macOS sandbox and wait for started.
Sandbox.rotate_signing_key
Section titled “Sandbox.rotate_signing_key”def rotate_signing_key() -> NoneRotate the sandbox’s signing key; every pre-signed URL minted so far is retired.
Sandbox.run_code
Section titled “Sandbox.run_code”def run_code(code: str, *, language: str = 'python', context: Optional[InterpreterContext] = None, isolated: bool = False, timeout: Optional[float] = None, cwd: Optional[str] = None, env: Optional[Mapping[str, str]] = None) -> InterpreterResultSandbox.set_labels
Section titled “Sandbox.set_labels”def set_labels(*, labels: Mapping[str, str]) -> Dict[str, str]Replace the sandbox label set; pass {} to clear all labels.
Sandbox.snapshot_filesystem
Section titled “Sandbox.snapshot_filesystem”def snapshot_filesystem(*, name: Optional[str] = None, idle: Optional[int] = None) -> ImageSnapshot this sandbox’s filesystem as a new Image (POST /sandboxes/{id}/images).
Sandbox.start
Section titled “Sandbox.start”def start(*, timeout: float = 60) -> NoneStart a stopped sandbox, or resume a paused one, and wait for started.
Sandbox.stop
Section titled “Sandbox.stop”def stop() -> NoneWarm-stop a persistent sandbox.
Sandbox.to_json
Section titled “Sandbox.to_json”def to_json() -> Dict[str, JsonValue]The sandbox’s data as JSON, without any toolbox URL; resume a stored sandbox with get(info["sandboxId"]).
Sandbox.update_env
Section titled “Sandbox.update_env”def update_env(env: Optional[Mapping[str, str]] = None, *, unset: Sequence[str] = ()) -> NoneUpdate SDK-managed environment entries for new processes, PTYs, and sessions.
Sandbox.update_lifecycle_policy
Section titled “Sandbox.update_lifecycle_policy”def update_lifecycle_policy(*, timeout_seconds: Optional[int] = None, on_timeout: Optional[LifecycleAction] = None, idle_expiry_seconds: Optional[int] = None, on_idle_timeout: Optional[LifecycleAction] = None, wake_on_request: Optional[bool] = None, archive_interval_seconds: Optional[int] = None) -> SandboxLifecycleUpdate this sandbox’s lifecycle policy; omitted knobs stay unchanged.
Sandbox.update_network_policy
Section titled “Sandbox.update_network_policy”def update_network_policy(*, network_policy: NetworkPolicyInput, if_match: str) -> NetworkPolicyInfoSandbox.wait
Section titled “Sandbox.wait”def wait(*, until: SandboxWaitState = 'started', timeout: Optional[float] = 60) -> SelfWait for one public sandbox state and return self.
Sandbox.wait_for_state
Section titled “Sandbox.wait_for_state”def wait_for_state(states: Sequence[SandboxWaitState], terminal_states: Sequence[SandboxState] = DEFAULT_SANDBOX_TERMINAL_STATES, *, timeout: Optional[float] = None) -> NoneWait until the sandbox reaches one of states.
Sandbox.computer_use
Section titled “Sandbox.computer_use”@propertydef computer_use() -> ComputerUseServiceSandbox.docker
Section titled “Sandbox.docker”@propertydef docker() -> DockerServiceDocker Engine status inside the sandbox; see DockerService.
Sandbox.fs
Section titled “Sandbox.fs”@propertydef fs() -> FileSystemServiceSandbox.git
Section titled “Sandbox.git”@propertydef git() -> GitServiceSandbox.interpreter
Section titled “Sandbox.interpreter”@propertydef interpreter() -> InterpreterServiceSandbox.lsp
Section titled “Sandbox.lsp”@propertydef lsp() -> LspServiceSandbox.mac_boot_mode
Section titled “Sandbox.mac_boot_mode”@propertydef mac_boot_mode() -> Optional[MacBootMode]macOS only: how the sandbox came back from its last resume, or None.
Sandbox.ports
Section titled “Sandbox.ports”@propertydef ports() -> PortsServiceSandbox.process
Section titled “Sandbox.process”@propertydef process() -> ProcessServiceSandbox.pty
Section titled “Sandbox.pty”@propertydef pty() -> PtyServiceSandbox.raw_state
Section titled “Sandbox.raw_state”@propertydef raw_state() -> strWire status string exactly as the server sent it.
AsyncSandbox
Section titled “AsyncSandbox”class AsyncSandbox()Serializable sandbox handle with process/fs/git/interpreter/pty namespaces.
_experimental_gpu (abstract GPU count, 0 for non-GPU sandboxes) is
experimental and may change or be removed without notice.
AsyncSandbox.__init__
Section titled “AsyncSandbox.__init__”def __init__(info: SandboxInfo, api: Optional[AsyncTransport], toolbox: Optional[AsyncTransport], *, toolbox_owner: Optional[AsyncTransport] = None, toolbox_url: Optional[str] = None, language: Optional[str] = None, access_token: Optional[str] = None, toolbox_base_url: Optional[str] = None, toolbox_token: Optional[str] = None, direct_toolbox_url: Optional[str] = None, request_timeout: Optional[float] = None, access_token_expires_at: Optional[str] = None, access_token_caller_supplied: Optional[bool] = None, hub: Optional[WaitHub] = None, hub_provider: Optional[Callable[[], Optional[WaitHub]]] = None) -> NoneAsyncSandbox.raw_state
Section titled “AsyncSandbox.raw_state”@propertydef raw_state() -> strWire status string exactly as the server sent it.
Informational only — the SDK never branches on this value. Use
state for all flow-control logic; raw_state is useful for
logging when state == "unknown" (the SDK predates the server’s value).
AsyncSandbox.from_api
Section titled “AsyncSandbox.from_api”@classmethoddef from_api(vm: SandboxDto | SandboxListItem | Mapping[str, JsonValue], api: Optional[AsyncTransport], toolbox: Optional[AsyncTransport], *, toolbox_owner: Optional[AsyncTransport] = None, toolbox_url: Optional[str] = None, language: Optional[str] = None, access_token: Optional[str] = None, toolbox_base_url: Optional[str] = None, toolbox_token: Optional[str] = None, direct_toolbox_url: Optional[str] = None, request_timeout: Optional[float] = None, access_token_expires_at: Optional[str] = None, access_token_caller_supplied: Optional[bool] = None, hub: Optional[WaitHub] = None, hub_provider: Optional[Callable[[], Optional[WaitHub]]] = None) -> AsyncSandboxCreate a sandbox handle from a control-plane DTO.
An explicitly passed access_token is treated as caller-supplied
(never silently replaced by a minted one) unless
access_token_caller_supplied=False marks it as the SDK-owned
create-response credential.
A toolbox_proxy_url inside vm is ignored unless the SDK’s own
refresh/fork paths mark vm as a fresh control-plane response, so
stored data never chooses where a credential goes (#3398). Pass
toolbox or toolbox_url to set the toolbox explicitly — the
toolbox credential goes there, so pass only a URL you trust.
AsyncSandbox.mac_boot_mode
Section titled “AsyncSandbox.mac_boot_mode”@propertydef mac_boot_mode() -> Optional[MacBootMode]macOS only: how the sandbox came back from its last resume, or None.
cold_after_restore_failure means the memory could not be restored and the Mac
booted the disk; error_reason says why.
AsyncSandbox.process
Section titled “AsyncSandbox.process”@propertydef process() -> AsyncProcessServiceAsyncSandbox.fs
Section titled “AsyncSandbox.fs”@propertydef fs() -> AsyncFileSystemServiceAsyncSandbox.git
Section titled “AsyncSandbox.git”@propertydef git() -> AsyncGitServiceAsyncSandbox.interpreter
Section titled “AsyncSandbox.interpreter”@propertydef interpreter() -> AsyncInterpreterServiceAsyncSandbox.pty
Section titled “AsyncSandbox.pty”@propertydef pty() -> AsyncPtyServiceAsyncSandbox.computer_use
Section titled “AsyncSandbox.computer_use”@propertydef computer_use() -> AsyncComputerUseServiceAsyncSandbox.docker
Section titled “AsyncSandbox.docker”@propertydef docker() -> AsyncDockerServiceDocker Engine status inside the sandbox; see AsyncDockerService.
AsyncSandbox.ports
Section titled “AsyncSandbox.ports”@propertydef ports() -> AsyncPortsServiceAsyncSandbox.lsp
Section titled “AsyncSandbox.lsp”@propertydef lsp() -> AsyncLspServiceAsyncSandbox.metrics
Section titled “AsyncSandbox.metrics”async def metrics() -> SystemMetricsAsyncSandbox.exec
Section titled “AsyncSandbox.exec”async def exec(command: Optional[str] = None, *, argv: Optional[Sequence[str]] = None, cwd: Optional[str] = None, env: Optional[Mapping[str, str]] = None, user: Optional[str] = None, shell: Optional[str] = None, login: Optional[bool] = None, stdin: StdinMode = 'closed', timeout: Optional[float] = None, execution_timeout: Optional[float] = None, name: Optional[str] = None, terminal: Optional[TerminalSize] = None, keep_logs: Optional[KeepLogs] = None) -> ProcessResultRun a command, wait for its shell to exit, and collect its output.
A convenience alias for process.run — identical behaviour, same
parameters, same return value.
Shell selection. Passing a string command runs it through the
sandbox shell: bash when the image has it, else sh. Pass
shell= to pin another interpreter, and quote globs and
brackets (pip install -e '.[test]') so the command means the same
under any shell. Use argv= to bypass the shell entirely, which is
the safe form for untrusted arguments. For persistent shell state, use
process.create_session.
Background processes. The call returns when the shell exits. If the
command launches a background child that holds output open (e.g.
python3 -m http.server 8000 &), the daemon waits at most ~2 seconds
for output to drain and then returns; output the child writes later is not
part of the result. For a long-running server use
process.start, which returns a ProcessHandle immediately
(logs, wait, kill). Alternatively redirect: nohup cmd > server.log 2>&1 &.
:param command: Shell command string; mutually exclusive with argv.
:param argv: Argument vector for shell-free execution.
:param cwd: Working directory inside the sandbox.
:param env: Extra environment variables merged into the process environment.
:param shell: Shell binary to use (e.g. "bash"); overrides auto-detection.
:param timeout: Caller wait budget in seconds. Omit to wait until the process
ends. Does not kill the process; use execution_timeout for that.
:param execution_timeout: Server-side deadline in seconds. The daemon kills
the process tree when this expires.
:returns: daytona.v2.types.ProcessResult with stdout, stderr,
output, exit_code, and reason.
AsyncSandbox.run_code
Section titled “AsyncSandbox.run_code”async def run_code(code: str, *, language: str = 'python', context: Optional[AsyncInterpreterContext] = None, isolated: bool = False, timeout: Optional[float] = None, cwd: Optional[str] = None, env: Optional[Mapping[str, str]] = None) -> InterpreterResultAsyncSandbox.to_json
Section titled “AsyncSandbox.to_json”def to_json() -> Dict[str, JsonValue]The sandbox’s data as JSON, without any toolbox URL; resume a stored sandbox with get(info["sandboxId"]).
AsyncSandbox.set_labels
Section titled “AsyncSandbox.set_labels”async def set_labels(*, labels: Mapping[str, str]) -> Dict[str, str]Replace the sandbox label set; pass {} to clear all labels.
AsyncSandbox.entrypoint_logs
Section titled “AsyncSandbox.entrypoint_logs”async def entrypoint_logs() -> strReturn the sandbox entrypoint-session log as text.
AsyncSandbox.update_env
Section titled “AsyncSandbox.update_env”async def update_env(env: Optional[Mapping[str, str]] = None, *, unset: Sequence[str] = ()) -> NoneUpdate SDK-managed environment entries for new processes, PTYs, and sessions.
Processes, PTYs, and sessions started after this call inherit the updated
environment. Running processes and already-running session kernels keep
their current environment unchanged. unset removes only values
previously set through update_env(); image-level environment entries
remain untouched.
AsyncSandbox.refresh_data
Section titled “AsyncSandbox.refresh_data”async def refresh_data(*, timeout: Optional[float] = None, wait: SandboxWaitState | None = None, wait_timeout_ms: int | None = None) -> NoneRefresh sandbox fields from the control plane.
AsyncSandbox.wait_for_state
Section titled “AsyncSandbox.wait_for_state”async def wait_for_state(states: Sequence[SandboxWaitState], terminal_states: Sequence[SandboxState] = DEFAULT_SANDBOX_TERMINAL_STATES, *, timeout: Optional[float] = None) -> NoneWait until the sandbox reaches one of states.
timeout is the caller wait budget in seconds; None and 0
wait unbounded. If the sandbox reaches a terminal state before any
target state, a typed conflict error is raised with the observed public
sandbox state attached as error.state.
AsyncSandbox.wait
Section titled “AsyncSandbox.wait”async def wait(*, until: SandboxWaitState = 'started', timeout: Optional[float] = 60) -> SelfWait for one public sandbox state and return self.
timeout is a caller wait budget in seconds. The default is 60;
None and 0 wait without a deadline. Timeout raises
RequestTimeoutError and a terminal state before until raises
SandboxTerminalStateError.
AsyncSandbox.start
Section titled “AsyncSandbox.start”async def start(*, timeout: float = 60) -> NoneStart a stopped sandbox, or resume a paused one, and wait for started.
AsyncSandbox.pause
Section titled “AsyncSandbox.pause”async def pause(*, timeout: float = 60) -> NonePause a persistent linux or macOS sandbox with its memory.
Linux returns once the pause is accepted (pausing). macOS waits up to timeout for
paused and raises SandboxTerminalStateError if the pause fails. A paused macOS
sandbox keeps its Mac slot but does not keep its reservation renewing.
AsyncSandbox.resume
Section titled “AsyncSandbox.resume”async def resume(*, timeout: float = 60) -> NoneResume a paused linux or macOS sandbox and wait for started.
A macOS resume the Mac cannot finish ends stopped; this then raises
SandboxTerminalStateError.
AsyncSandbox.stop
Section titled “AsyncSandbox.stop”async def stop() -> NoneWarm-stop a persistent sandbox.
AsyncSandbox.archive
Section titled “AsyncSandbox.archive”async def archive() -> NoneArchive a stopped persistent sandbox now, whatever its archive interval.
Its disk moves to object storage in the background; archived
turns true once that completes, and start restores the disk
first. Archiving an archived sandbox does nothing.
AsyncSandbox.fork
Section titled “AsyncSandbox.fork”async def fork(*, name: Optional[str] = None, memory: Optional[bool] = None, timeout: Optional[float] = None) -> AsyncSandboxFork this sandbox.
By default the fork continues from the source’s memory (running
processes included). memory=False forks only the disk: an instant
copy-on-write clone, after which the fork boots fresh. A stopped sandbox
is always forked disk-only. Only a fork of a RUNNING sandbox is started
automatically; a fork of a paused source rests paused (memory fork,
call resume()) or stopped (memory=False), and a fork of a
stopped source rests stopped — call start() on those.
A macOS fork copies the disk only: omit memory or pass
memory=False (memory=True is refused with
NOT_SUPPORTED_FOR_CLASS). A fork of a running macOS sandbox boots
with a fresh machine identity; a fork of a paused or stopped one rests
stopped. The fork is made on the Mac that keeps the source when
that Mac has room for the fork’s size. Otherwise, in a region with
macOS snapshots configured, the source’s disk is copied through an
anonymous image to another Mac of the organization, and the fork
waits for room there as a create does. Without macOS snapshots in the
region, or for a paused source on a full Mac, the server answers
NO_FREE_SLOT.
With timeout (seconds; 0 waits without a deadline), wait for
the state the fork settles in: started for a fork of a running
Linux sandbox, paused or stopped for the other Linux forks, and
started or stopped for a macOS fork. Without it, return as soon
as the server accepts the fork.
AsyncSandbox.delete
Section titled “AsyncSandbox.delete”async def delete() -> NoneDelete the sandbox.
AsyncSandbox.update_lifecycle_policy
Section titled “AsyncSandbox.update_lifecycle_policy”async def update_lifecycle_policy(*, timeout_seconds: Optional[int] = None, on_timeout: Optional[LifecycleAction] = None, idle_expiry_seconds: Optional[int] = None, on_idle_timeout: Optional[LifecycleAction] = None, wake_on_request: Optional[bool] = None, archive_interval_seconds: Optional[int] = None) -> SandboxLifecycleUpdate this sandbox’s lifecycle policy; omitted knobs stay unchanged.
timeout_seconds re-anchors the deadline from now (>= 1; the timeout
cannot be disabled). idle_expiry_seconds=DISABLED clears the idle pair;
arming it on a sandbox with no idle policy requires on_idle_timeout.
archive_interval_seconds (linux persistent) takes 60 to 2592000,
or 0 for the maximum.
Setting either action to "delete" — or touching a pair whose stored
or resulting action is "delete" — requires the API key to hold
delete:sandboxes in addition to write:sandboxes.
AsyncSandbox.reset_idle_timer
Section titled “AsyncSandbox.reset_idle_timer”async def reset_idle_timer() -> SandboxLifecycleReset this sandbox’s idle timer (an explicit out-of-band keepalive).
For work the platform cannot see: bumps the sandbox’s activity clock
(last_activity_at, attributed
server-side to the api source), which restarts the idle countdown —
idle_timeout_at re-anchors to now + idle_expiry_seconds. The
wall-clock timeout_at is NOT affected. Succeeds whether or not an
idle timeout is armed (an unarmed sandbox echoes
idle_timeout_at=None), and in any state — a never-started sandbox
already carries its creation-time activity stamp, which the reset
advances.
The echo is the full post-reset lifecycle, the same shape
update_lifecycle_policy returns. Advance-only: a newer concurrent
activity bump keeps the clock, and what comes back is the state that
won.
AsyncSandbox.get_network_policy
Section titled “AsyncSandbox.get_network_policy”async def get_network_policy() -> NetworkPolicyInfoAsyncSandbox.update_network_policy
Section titled “AsyncSandbox.update_network_policy”async def update_network_policy(*, network_policy: NetworkPolicyInput, if_match: str) -> NetworkPolicyInfoAsyncSandbox.reset_network_policy
Section titled “AsyncSandbox.reset_network_policy”async def reset_network_policy(*, if_match: str) -> NetworkPolicyInfoAsyncSandbox.snapshot_filesystem
Section titled “AsyncSandbox.snapshot_filesystem”async def snapshot_filesystem(*, name: Optional[str] = None, idle: Optional[int] = None) -> ImageSnapshot this sandbox’s filesystem as a new Image (POST /sandboxes/{id}/images).
The result boots new sandboxes (daytona.create(image.id)), like
Modal’s snapshot_filesystem(); the sandbox keeps running. A macOS
sandbox must be persistent and stopped; it cannot start until the
snapshot is ready.
name makes the image named and permanent. idle (seconds) is the
idle-retention window of an ANONYMOUS capture: it is deleted once that
long has passed without a sandbox being created from it (every create
restarts the clock). Same rule as images.build: omitted or -1 ⇒
the server maximum (7 days by default); above it ⇒ 400. Promote the
image to keep it. idle with name is a 400.
AsyncSandbox.create_snapshot
Section titled “AsyncSandbox.create_snapshot”async def create_snapshot(name: str) -> SnapshotAsyncSandbox.build_logs
Section titled “AsyncSandbox.build_logs”async def build_logs() -> strReturn retained build output as one-shot text, not a live follower.
The body includes a state line and the currently available build tail.
The log belongs to the build: an adopted build returns the original
build’s output, and a build that failed before the sandbox was placed
still returns its failure. A sandbox with no image build (no server-side
image_build_id, for example a registry image) raises NotFoundError.
Before a capture is assigned, the response can contain only build state.
An expired or unreachable capture can raise BUILD_LOG_UNAVAILABLE;
retained-tail truncation is indicated in the text.
Discovery selects the owning build-log service. The one-shot request
returns its current retained output as text.
Use follow_build_logs for live output and completeness metadata.
AsyncSandbox.follow_build_logs
Section titled “AsyncSandbox.follow_build_logs”async def follow_build_logs(*, on_logs: _LogsCallback, on_event: Optional[_EventCallback] = None, cursor: Optional[str] = None, timeout: Optional[float] = None) -> BuildLogFollowResultObserve this sandbox’s build without changing its execution lifetime.
on_logs receives decoded output; optional on_event receives each
typed BuildLogEvent. Either callback may return an awaitable, which
is awaited before the next event. timeout (seconds) bounds this
observation only; cancelling the awaiting task closes the stream, not
the build. Discovery failures, including a 404 for a sandbox with no
image build, raise BuildLogInterruptedError with the HTTP status
and last cursor. They do not fall back to another log source.
AsyncSandbox.create_access_token
Section titled “AsyncSandbox.create_access_token”async def create_access_token(*, operations: Optional[Sequence[str]] = None, ports: Optional[Sequence[int]] = None, ttl_seconds: Optional[int] = None) -> SandboxAccessTokenMint a scoped, short-lived access token for THIS sandbox.
The token authorizes the sandbox data plane (toolbox, SSH, desktop,
private previews) and the self-service control routes, for exactly the
granted operations and ports — hand it to a collaborator, a CI
job, or a browser instead of a project API key.
operations is the sandbox-operation vocabulary (toolbox,
toolbox:exec, toolbox:fs, toolbox:git, toolbox:lsp,
desktop, ssh, sandbox:stop, sandbox:pause,
sandbox:delete); omitted means the minter’s full grantable set, and
[] is a valid ports-only grant. ports names the private-preview
ports the token may reach (omitted = all, [] = none). ttl_seconds
overrides the deployment’s default lifetime, capped server-side; an
unknown operation or an over-cap TTL is a 400, never a silent
narrowing. The token cannot be refreshed and cannot mint further
credentials — mint a fresh one here instead.
AsyncSandbox.rotate_signing_key
Section titled “AsyncSandbox.rotate_signing_key”async def rotate_signing_key() -> NoneRotate the sandbox’s signing key; every pre-signed URL minted so far is retired.
Every pre-signed URL minted so far stops working within ~30 s; new URLs
from presigned_download_url / presigned_upload_url use the new
key. The key itself is never returned.
One class-blind route (/sandboxes) like the sign route; windows
sandboxes have no toolbox and raise
UNSUPPORTED_OPERATION before any request. Like minting, a handle
on a direct-daemon toolbox_url is refused locally: nothing on that
path could verify a signature, so there is nothing a rotation would
retire.
SandboxEventsConfig
Section titled “SandboxEventsConfig”@dataclass(frozen=True)class SandboxEventsConfig()Configuration for the sandbox-state events hub.
enabled — set to False (or DAYTONA_SANDBOX_EVENTS=0) to fall
back to long-poll for every wait. reconcile_interval is in seconds
(0 / None disables the timer). idle_close (seconds) closes
idle sockets; None keeps them open indefinitely.
Attributes:
enabledbool = Truereconcile_intervalOptional[float] = 60.0idle_closeOptional[float] = None
SandboxInfo
Section titled “SandboxInfo”@dataclass(frozen=True)class SandboxInfo()Serializable sandbox DTO.
Attributes:
idstrnameOptional[str] = NonestateSandboxState = ‘unknown’imageOptional[ImageRef] = NonetargetOptional[str] = NonecapabilitiesJsonObject = field(default_factory=dict)snapshotOptional[SnapshotRef] = Noneimage_build_idOptional[str] = NoneregionOptional[str] = field(default=None, kw_only=True)labelsDict[str, str] = field(default_factory=dict, kw_only=True)cpuOptional[float] = field(default=None, kw_only=True)cpu_maxOptional[int] = field(default=None, kw_only=True)gpuint = field(default=0, kw_only=True)memoryOptional[float] = field(default=None, kw_only=True)memory_maxOptional[float] = field(default=None, kw_only=True)diskOptional[float] = field(default=None, kw_only=True)disk_maxOptional[float] = field(default=None, kw_only=True)vm_classOptional[VmClass] = field(default=None, kw_only=True)persistentOptional[bool] = field(default=None, kw_only=True)archivedOptional[bool] = field(default=None, kw_only=True)spotOptional[bool] = field(default=None, kw_only=True)spot_evicted_atOptional[str] = field(default=None, kw_only=True)lifecycle_policyOptional[SandboxLifecycle] = field(default=None, kw_only=True)forked_fromOptional[str] = field(default=None, kw_only=True)reservation_idOptional[str] = field(default=None, kw_only=True)userOptional[str] = field(default=None, kw_only=True)errorOptional[str] = field(default=None, kw_only=True)
SandboxInfo.to_json
Section titled “SandboxInfo.to_json”def to_json() -> Dict[str, JsonValue]Return a JSON-safe sandbox-info payload.
SandboxInfo.from_json
Section titled “SandboxInfo.from_json”@classmethoddef from_json(value: Mapping[str, JsonValue]) -> SelfRehydrate sandbox info from to_json output.
SandboxLifecycle
Section titled “SandboxLifecycle”@dataclass(frozen=True)class SandboxLifecycle()Lifecycle policy as the control plane reports it.
timeout_seconds is the stored re-arm budget (echoed, unlike the old
write-only TTL anchor); timeout_at is the current absolute deadline it
derives. idle_timeout_at is when on_idle_timeout becomes eligible
to fire — last_activity_at + idle_expiry_seconds — and any activity
(traffic, SSH, a non-PTY process or code execution started through the
process API that is still running — exec, process.start,
run_code and interpreter cells included — or
AsyncSandbox.reset_idle_timer) pushes it; None
when the idle pair is not armed or the sandbox has never been active.
timeout_at, idle_timeout_at, last_activity_at and
last_activity_source are server-derived and read-only. An action the
SDK does not know yet (a newer server) is passed through as its wire
string. archive_interval_seconds is None for a sandbox that is never
archived (not linux persistent).
Attributes:
timeout_secondsOptional[int] = Noneon_timeoutOptional[str] = Nonetimeout_atOptional[str] = Noneidle_expiry_secondsOptional[int] = Noneon_idle_timeoutOptional[str] = Noneidle_timeout_atOptional[str] = Nonewake_on_requestbool = Falselast_activity_atOptional[str] = Nonelast_activity_sourceOptional[str] = Nonearchive_interval_secondsOptional[int] = None
PreviewEndpoint
Section titled “PreviewEndpoint”@dataclass(frozen=True)class PreviewEndpoint()A sandbox HTTP preview endpoint.
Attributes:
portintpublicboolurlstrcreated_atOptional[str] = None
PreviewLink
Section titled “PreviewLink”@dataclass(frozen=True)class PreviewLink()Preview URL plus an access token for one in-VM port.
Send token in the X-Daytona-Preview-Token header to reach a private
endpoint; without a credential the proxy answers 401. When token is a
sandbox access token (a JWT) it also works as Authorization: Bearer or
?rlp_token=; the deployment’s legacy HMAC token works only in the
header. Public endpoints set token to "" and need no credential.
expires_at (RFC 3339) is set when the token’s expiry is known, else
None.
Example — curl a private endpoint::
link = await sandbox.ports.preview_link(8080)
curl -H “X-Daytona-Preview-Token: <link.token>” <link.url>
Section titled “curl -H “X-Daytona-Preview-Token: <link.token>” <link.url>”For a shareable URL that works in a browser without extra headers, use
daytona.v2.ports.AsyncPortsService.signed_preview_link instead.
Attributes:
urlstrtokenstrexpires_atOptional[str] = None
SignedPreviewLink
Section titled “SignedPreviewLink”@dataclass(frozen=True)class SignedPreviewLink()Self-contained signed URL for one in-VM port.
The token is embedded in the hostname — no extra headers or credentials are
needed. The link expires at expires_at (RFC 3339). Revoke it early with
daytona.v2.ports.AsyncPortsService.expire_signed_preview_link.
Attributes:
urlstrtokenstrexpires_atOptional[str] = None
SandboxAccessToken
Section titled “SandboxAccessToken”@dataclass(frozen=True)class SandboxAccessToken()A short-lived per-sandbox access token (POST …/access-token).
access_token is a bearer for the sandbox data plane (toolbox, SSH,
desktop, private previews) and for the self-service control routes named
by operations (sandbox:stop / sandbox:pause /
sandbox:delete). It expires at expires_at (RFC 3339) and cannot
be refreshed — mint a fresh one with
daytona.v2.sandbox.AsyncSandbox.create_access_token instead. ports
is the granted private-preview port set; None means every port.
Attributes:
access_tokenstrtoken_typestrexpires_atstroperationsSequence[str]portsOptional[Sequence[int]] = None
SandboxSearchFilters
Section titled “SandboxSearchFilters”@dataclass(frozen=True, kw_only=True)class SandboxSearchFilters()The GET /sandboxes/search filters shared by Daytona.search() and Daytona.list().
status, vm_class and region take a single value or a list;
lists are joined with commas on the wire. labels is sent as a JSON
object string (containment match); timestamp starts are inclusive and ends
are exclusive.
Every filter is keyword-only, so subclasses that predate the search index
(ListSandboxesQuery) keep their original positional parameters.
Attributes:
qOptional[str] = NonestatusOptional[Sequence[str]] = Nonevm_classOptional[Union[VmClass, Sequence[VmClass]]] = NoneregionOptional[Sequence[str]] = Noneimage_refOptional[str] = Noneimage_ref_prefixOptional[str] = NonelabelsOptional[Mapping[str, str]] = NonespotOptional[bool] = Noneforked_fromOptional[str] = Nonemin_vcpusOptional[int] = Nonemax_vcpusOptional[int] = Nonemin_memory_mibOptional[int] = Nonemax_memory_mibOptional[int] = Nonemin_disk_mibOptional[int] = Nonemax_disk_mibOptional[int] = Nonecreated_start_atOptional[SearchTimestamp] = Nonecreated_end_atOptional[SearchTimestamp] = Noneupdated_start_atOptional[SearchTimestamp] = Noneupdated_end_atOptional[SearchTimestamp] = Nonelast_activity_start_atOptional[SearchTimestamp] = Nonelast_activity_end_atOptional[SearchTimestamp] = NonesortOptional[SearchSort] = NoneorderOptional[SearchOrder] = None
SystemMetrics
Section titled “SystemMetrics”SystemMetrics = _gen.toolbox.MetricsSandboxWaitState
Section titled “SandboxWaitState”SandboxWaitState = Literal['queued', 'starting', 'started', 'pausing', 'paused', 'stopping', 'stopped', 'destroying', 'destroyed']MacBootMode
Section titled “MacBootMode”MacBootMode = Union[Literal['restored', 'cold_after_restore_failure'], str]