# List files
URL: https://docs.munito.ai/api/listSandboxFiles

GET /sandboxes/v1/sandboxes/{sandbox_id}/files

Preview. The entries of a directory in a running sandbox.

```json
{
  "tags": [
    "Sandboxes"
  ],
  "summary": "List files",
  "description": "Preview. The entries of a directory in a running sandbox.",
  "operationId": "listSandboxFiles",
  "parameters": [
    {
      "name": "sandbox_id",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "description": "The id of the sandbox."
      },
      "description": "The id of the sandbox."
    },
    {
      "name": "path",
      "in": "query",
      "required": true,
      "schema": {
        "type": "string",
        "minLength": 1,
        "maxLength": 4096,
        "description": "A path in the sandbox. A relative path is under /workspace."
      },
      "description": "A path in the sandbox. A relative path is under /workspace."
    }
  ],
  "responses": {
    "200": {
      "description": "The entries of the directory.",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/FileList"
          }
        }
      }
    },
    "400": {
      "description": "A part of the path is not a directory, or the path is a directory.",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    },
    "401": {
      "description": "The API key is missing or not valid.",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    },
    "403": {
      "description": "The API key does not hold the inference permission, or the account is not active.",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    },
    "404": {
      "description": "The sandbox does not exist (`sandbox_not_found`), or the path does not exist (`file_not_found`).",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    },
    "409": {
      "description": "The sandbox is not running (`sandbox_not_running`), or it is paused (`sandbox_paused`).",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    },
    "503": {
      "description": "The sandbox does not answer now: `sandbox_unavailable`. Retry shortly.",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```

# Shared API schemas
{
  "securitySchemes": {
    "BearerAuth": {
      "type": "http",
      "scheme": "bearer",
      "description": "Your Munito API key."
    },
    "ApiKeyAuth": {
      "type": "apiKey",
      "in": "header",
      "name": "x-api-key",
      "description": "Your Munito API key."
    }
  },
  "schemas": {
    "CreateNetwork": {
      "properties": {
        "name": {
          "type": "string",
          "description": "A DNS label, unique in the workspace: 1 to 63 lower case letters, digits and hyphens. The names of the members end in `.<name>.internal`."
        }
      },
      "additionalProperties": false,
      "type": "object",
      "required": [
        "name"
      ]
    },
    "CreateSandbox": {
      "properties": {
        "template": {
          "type": "string",
          "default": "base",
          "description": "The root filesystem. `base`, the default: Debian 12 with Python 3.12, Node 24, git and build tools. `ubuntu`: Ubuntu 24.04 with systemd, Docker running, Python 3.12, Node 24, and the agent harnesses Claude Code, Codex and OpenCode. `desktop`: `ubuntu` with an Xfce desktop and Firefox, which a browser opens on port 6080. A desktop needs 2 vCPUs and 4096 MiB at least."
        },
        "size": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A preset: `small`, `default`, `large`. Without size, vcpus and memory_mib, the size is `default`."
        },
        "vcpus": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "description": "A custom size: from 1 to 16 vCPUs, with memory_mib."
        },
        "memory_mib": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "description": "A custom size: from 512 to 32768 MiB in steps of 256, at least 512 for each vCPU."
        },
        "disk_gib": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "description": "The root disk in GiB: from 10 to 100, 10 by default. A larger disk grows when the sandbox starts, which adds some milliseconds to the start."
        },
        "timeout": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "description": "Seconds from now until the sandbox stops, or pauses when it is persistent: from 10 to 86400, 3600 by default."
        },
        "env": {
          "additionalProperties": {
            "type": "string"
          },
          "type": "object",
          "description": "Environment variables of every command, at most 100. No answer returns them."
        },
        "metadata": {
          "additionalProperties": {
            "type": "string"
          },
          "type": "object",
          "description": "Your own keys and values, at most 16. The sandbox does not see them."
        },
        "internet": {
          "type": "boolean",
          "default": true,
          "description": "Outbound internet access. Its ports and SSH take inbound connections with or without it."
        },
        "command": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array",
              "minItems": 1
            },
            {
              "type": "null"
            }
          ],
          "description": "A command to run once the sandbox starts, in `/workspace` with `env`, for at most 60 seconds. A string runs in `bash -lc`. A list is the argument vector."
        },
        "persistent": {
          "type": "boolean",
          "default": false,
          "description": "Keep the files and the processes across a pause: the sandbox can pause, resume and fork, and its timeout pauses it. A paused sandbox pays for the storage of its saved state only."
        },
        "public_ports": {
          "items": {
            "type": "integer",
            "maximum": 65535,
            "minimum": 1
          },
          "type": "array",
          "description": "Ports that anyone may open at their URL, without the sandbox's token, at most 16. Every other port is private."
        },
        "ssh_keys": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "description": "Public keys that open SSH to the sandbox, each a line of authorized_keys, at most 16. Without one, SSH takes no connection."
        },
        "networks": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "description": "The ids of the networks that the sandbox joins, at most 10. A persistent sandbox cannot join a network yet."
        },
        "hostname": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The name of the sandbox in its networks: the other members reach it at `<hostname>.<network>.internal`. A DNS label, unique in each network. By default, its id with a hyphen for the underscore."
        }
      },
      "additionalProperties": false,
      "type": "object",
      "description": "Name a preset in `size`, or give `vcpus` and `memory_mib` for a custom size, or neither for the default."
    },
    "CreateSshAccess": {
      "properties": {
        "expires_in": {
          "type": "integer",
          "maximum": 86400,
          "minimum": 60,
          "default": 3600
        }
      },
      "additionalProperties": false,
      "type": "object"
    },
    "CreatedSandbox": {
      "properties": {
        "id": {
          "type": "string"
        },
        "object": {
          "type": "string",
          "const": "sandbox",
          "default": "sandbox"
        },
        "status": {
          "$ref": "#/components/schemas/SandboxStatus",
          "description": "`pending` until it runs, then `running`, then `stopped`. `failed` when it did not start. A persistent sandbox is `paused` between a pause and a resume, and `pending` while it resumes."
        },
        "template": {
          "type": "string"
        },
        "size": {
          "type": "string",
          "description": "The preset, or `custom`."
        },
        "vcpus": {
          "type": "integer"
        },
        "memory_mib": {
          "type": "integer"
        },
        "disk_gib": {
          "type": "integer",
          "description": "The root disk in GiB."
        },
        "internet": {
          "type": "boolean"
        },
        "persistent": {
          "type": "boolean",
          "description": "The sandbox keeps its files and its processes across a pause."
        },
        "metadata": {
          "additionalProperties": {
            "type": "string"
          },
          "type": "object"
        },
        "created_at": {
          "type": "integer",
          "description": "Unix seconds."
        },
        "started_at": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "description": "Unix seconds, or null before the sandbox runs."
        },
        "expires_at": {
          "type": "integer",
          "description": "Unix seconds. The sandbox stops then, or pauses when it is persistent."
        },
        "ended_at": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "description": "Unix seconds, or null while the sandbox runs."
        },
        "end_reason": {
          "anyOf": [
            {
              "$ref": "#/components/schemas/EndReason"
            },
            {
              "type": "null"
            }
          ],
          "description": "`deleted`, `timeout` or `error`, or null while the sandbox runs."
        },
        "public_ports": {
          "items": {
            "type": "integer"
          },
          "type": "array",
          "description": "The ports that open without the sandbox's token."
        },
        "ssh_keys": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "description": "The public keys that open SSH to the sandbox."
        },
        "hostname": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The name of the sandbox in its networks, or null for its id."
        },
        "networks": {
          "items": {
            "$ref": "#/components/schemas/SandboxNetwork"
          },
          "type": "array",
          "description": "The networks that the sandbox is a member of."
        },
        "command": {
          "anyOf": [
            {
              "$ref": "#/components/schemas/ExecResult"
            },
            {
              "type": "null"
            }
          ],
          "description": "The result of `command`. Null without a command, when the command could not run, and for a retry with the same Idempotency-Key. The sandbox runs in each case."
        }
      },
      "type": "object",
      "required": [
        "id",
        "status",
        "template",
        "size",
        "vcpus",
        "memory_mib",
        "disk_gib",
        "internet",
        "persistent",
        "metadata",
        "created_at",
        "started_at",
        "expires_at",
        "ended_at",
        "end_reason"
      ]
    },
    "EndReason": {
      "type": "string",
      "enum": [
        "deleted",
        "timeout",
        "error",
        "credits"
      ]
    },
    "ErrorBody": {
      "properties": {
        "code": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      },
      "required": [
        "code",
        "message"
      ],
      "type": "object"
    },
    "ExecCommand": {
      "properties": {
        "command": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "type": "string"
              },
              "type": "array",
              "minItems": 1
            }
          ],
          "description": "A string runs in `bash -lc`. A list is the argument vector itself."
        },
        "cwd": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The working directory, `/workspace` by default."
        },
        "env": {
          "additionalProperties": {
            "type": "string"
          },
          "type": "object",
          "description": "More environment variables for this command."
        },
        "timeout": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "description": "Seconds until the command is stopped: from 1 to 1800, 60 by default."
        },
        "stdin": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Text for standard input, which then closes. Without it, standard input is empty."
        },
        "stream": {
          "type": "boolean",
          "default": false,
          "description": "Answer NDJSON events as the command writes, instead of one result at its end."
        }
      },
      "additionalProperties": false,
      "type": "object",
      "required": [
        "command"
      ],
      "description": "A string runs in `bash -lc`; a list is the argument vector itself."
    },
    "ExecError": {
      "properties": {
        "type": {
          "const": "error",
          "default": "error",
          "type": "string"
        },
        "error": {
          "$ref": "#/components/schemas/ErrorBody"
        }
      },
      "required": [
        "error"
      ],
      "type": "object"
    },
    "ExecEvent": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/ExecOutput"
        },
        {
          "$ref": "#/components/schemas/ExecExit"
        },
        {
          "$ref": "#/components/schemas/ExecError"
        }
      ],
      "description": "One line of a streamed command."
    },
    "ExecExit": {
      "properties": {
        "type": {
          "const": "exit",
          "default": "exit",
          "type": "string"
        },
        "exit_code": {
          "type": "integer"
        },
        "duration_ms": {
          "type": "integer"
        },
        "timed_out": {
          "type": "boolean"
        }
      },
      "required": [
        "exit_code",
        "duration_ms",
        "timed_out"
      ],
      "type": "object"
    },
    "ExecOutput": {
      "properties": {
        "type": {
          "enum": [
            "stdout",
            "stderr"
          ],
          "type": "string"
        },
        "data": {
          "type": "string"
        }
      },
      "required": [
        "type",
        "data"
      ],
      "type": "object"
    },
    "ExecResult": {
      "properties": {
        "exit_code": {
          "type": "integer",
          "description": "The exit code. A command that a signal stopped has 128 plus the signal."
        },
        "stdout": {
          "type": "string",
          "description": "Standard output as UTF-8 text, at most 1048576 bytes."
        },
        "stderr": {
          "type": "string",
          "description": "Standard error as UTF-8 text, at most 1048576 bytes."
        },
        "duration_ms": {
          "type": "integer",
          "description": "How long the command ran."
        },
        "timed_out": {
          "type": "boolean",
          "description": "The command ran past its timeout and was stopped."
        },
        "truncated": {
          "type": "boolean",
          "description": "A stream passed its limit, and the rest is left out."
        }
      },
      "type": "object",
      "required": [
        "exit_code",
        "stdout",
        "stderr",
        "duration_ms",
        "timed_out",
        "truncated"
      ]
    },
    "FileEntry": {
      "properties": {
        "name": {
          "type": "string"
        },
        "path": {
          "type": "string"
        },
        "type": {
          "type": "string",
          "enum": [
            "file",
            "directory",
            "symlink",
            "other"
          ]
        },
        "size": {
          "type": "integer"
        },
        "mode": {
          "type": "integer",
          "description": "The permission bits, such as 420 for 0644."
        },
        "modified_at": {
          "type": "integer",
          "description": "Unix seconds."
        }
      },
      "type": "object",
      "required": [
        "name",
        "path",
        "type",
        "size",
        "mode",
        "modified_at"
      ]
    },
    "FileList": {
      "properties": {
        "object": {
          "type": "string",
          "const": "list",
          "default": "list"
        },
        "path": {
          "type": "string"
        },
        "data": {
          "items": {
            "$ref": "#/components/schemas/FileEntry"
          },
          "type": "array"
        }
      },
      "type": "object",
      "required": [
        "path",
        "data"
      ]
    },
    "ForkSandbox": {
      "properties": {
        "count": {
          "type": "integer",
          "maximum": 16,
          "minimum": 1,
          "default": 1,
          "description": "The new sandboxes, from 1 to 16. They all start, or none does."
        },
        "persistent": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Whether the new sandboxes are persistent. By default they are, as their parent is."
        },
        "timeout": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "description": "Seconds from now until each new sandbox stops, or pauses when it is persistent: from 10 to 86400, 3600 by default."
        },
        "metadata": {
          "additionalProperties": {
            "type": "string"
          },
          "type": "object",
          "description": "Your own keys and values for each new sandbox, at most 16."
        }
      },
      "additionalProperties": false,
      "type": "object",
      "description": "New sandboxes with the files and the processes of a persistent sandbox, which keeps running or stays paused."
    },
    "ForkedSandboxes": {
      "properties": {
        "object": {
          "type": "string",
          "const": "list",
          "default": "list"
        },
        "data": {
          "items": {
            "$ref": "#/components/schemas/Sandbox"
          },
          "type": "array"
        }
      },
      "type": "object",
      "required": [
        "data"
      ]
    },
    "ListeningPort": {
      "properties": {
        "object": {
          "type": "string",
          "const": "sandbox.listening_port",
          "default": "sandbox.listening_port"
        },
        "port": {
          "type": "integer"
        },
        "url": {
          "type": "string"
        },
        "public": {
          "type": "boolean"
        }
      },
      "type": "object",
      "required": [
        "port",
        "url",
        "public"
      ]
    },
    "Network": {
      "properties": {
        "id": {
          "type": "string"
        },
        "object": {
          "type": "string",
          "const": "network",
          "default": "network"
        },
        "name": {
          "type": "string"
        },
        "created_at": {
          "type": "integer",
          "description": "Unix seconds."
        },
        "members": {
          "items": {
            "$ref": "#/components/schemas/NetworkMember"
          },
          "type": "array",
          "description": "The sandboxes in the network that run or start."
        }
      },
      "type": "object",
      "required": [
        "id",
        "name",
        "created_at"
      ],
      "description": "A private network of the sandboxes of a workspace: its members reach each other on each port, and nothing else\nreaches them through it."
    },
    "NetworkList": {
      "properties": {
        "object": {
          "type": "string",
          "const": "list",
          "default": "list"
        },
        "data": {
          "items": {
            "$ref": "#/components/schemas/Network"
          },
          "type": "array"
        }
      },
      "type": "object",
      "required": [
        "data"
      ]
    },
    "NetworkMember": {
      "properties": {
        "sandbox_id": {
          "type": "string"
        },
        "dns_name": {
          "type": "string",
          "description": "The name of the member, which each member resolves."
        },
        "address": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The private IPv6 address of the member while it runs, or null."
        }
      },
      "type": "object",
      "required": [
        "sandbox_id",
        "dns_name"
      ]
    },
    "PortList": {
      "properties": {
        "object": {
          "type": "string",
          "const": "list",
          "default": "list"
        },
        "data": {
          "items": {
            "$ref": "#/components/schemas/ListeningPort"
          },
          "type": "array"
        }
      },
      "type": "object",
      "required": [
        "data"
      ]
    },
    "Problem": {
      "type": "object",
      "description": "An RFC 9457 problem. `code` is stable, so a client can branch on it.",
      "properties": {
        "type": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "status": {
          "type": "integer"
        },
        "detail": {
          "type": "string"
        },
        "code": {
          "type": "string"
        },
        "request_id": {
          "type": "string"
        }
      }
    },
    "ResumeSandbox": {
      "properties": {
        "timeout": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "description": "Seconds from now until the sandbox pauses again: from 10 to 86400, 3600 by default."
        }
      },
      "additionalProperties": false,
      "type": "object"
    },
    "Sandbox": {
      "properties": {
        "id": {
          "type": "string"
        },
        "object": {
          "type": "string",
          "const": "sandbox",
          "default": "sandbox"
        },
        "status": {
          "$ref": "#/components/schemas/SandboxStatus",
          "description": "`pending` until it runs, then `running`, then `stopped`. `failed` when it did not start. A persistent sandbox is `paused` between a pause and a resume, and `pending` while it resumes."
        },
        "template": {
          "type": "string"
        },
        "size": {
          "type": "string",
          "description": "The preset, or `custom`."
        },
        "vcpus": {
          "type": "integer"
        },
        "memory_mib": {
          "type": "integer"
        },
        "disk_gib": {
          "type": "integer",
          "description": "The root disk in GiB."
        },
        "internet": {
          "type": "boolean"
        },
        "persistent": {
          "type": "boolean",
          "description": "The sandbox keeps its files and its processes across a pause."
        },
        "metadata": {
          "additionalProperties": {
            "type": "string"
          },
          "type": "object"
        },
        "created_at": {
          "type": "integer",
          "description": "Unix seconds."
        },
        "started_at": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "description": "Unix seconds, or null before the sandbox runs."
        },
        "expires_at": {
          "type": "integer",
          "description": "Unix seconds. The sandbox stops then, or pauses when it is persistent."
        },
        "ended_at": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "description": "Unix seconds, or null while the sandbox runs."
        },
        "end_reason": {
          "anyOf": [
            {
              "$ref": "#/components/schemas/EndReason"
            },
            {
              "type": "null"
            }
          ],
          "description": "`deleted`, `timeout` or `error`, or null while the sandbox runs."
        },
        "public_ports": {
          "items": {
            "type": "integer"
          },
          "type": "array",
          "description": "The ports that open without the sandbox's token."
        },
        "ssh_keys": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "description": "The public keys that open SSH to the sandbox."
        },
        "hostname": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The name of the sandbox in its networks, or null for its id."
        },
        "networks": {
          "items": {
            "$ref": "#/components/schemas/SandboxNetwork"
          },
          "type": "array",
          "description": "The networks that the sandbox is a member of."
        }
      },
      "type": "object",
      "required": [
        "id",
        "status",
        "template",
        "size",
        "vcpus",
        "memory_mib",
        "disk_gib",
        "internet",
        "persistent",
        "metadata",
        "created_at",
        "started_at",
        "expires_at",
        "ended_at",
        "end_reason"
      ]
    },
    "SandboxList": {
      "properties": {
        "object": {
          "type": "string",
          "const": "list",
          "default": "list"
        },
        "data": {
          "items": {
            "$ref": "#/components/schemas/Sandbox"
          },
          "type": "array"
        },
        "has_more": {
          "type": "boolean",
          "description": "Pass the id of the last sandbox as `after` for the next page."
        }
      },
      "type": "object",
      "required": [
        "data",
        "has_more"
      ]
    },
    "SandboxNetwork": {
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "dns_name": {
          "type": "string",
          "description": "The name of the sandbox in the network, which each member resolves."
        },
        "address": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The private IPv6 address of the sandbox in the network while it runs, or null. A member reaches it on each port, over TCP and UDP."
        }
      },
      "type": "object",
      "required": [
        "id",
        "name",
        "dns_name"
      ]
    },
    "SandboxPort": {
      "properties": {
        "object": {
          "type": "string",
          "const": "sandbox.port",
          "default": "sandbox.port"
        },
        "sandbox_id": {
          "type": "string"
        },
        "port": {
          "type": "integer"
        },
        "public": {
          "type": "boolean",
          "description": "Anyone with the URL opens the port. A private port takes the token or a signed URL."
        },
        "url": {
          "type": "string",
          "description": "The port's URL. A server that listens on the port, on 0.0.0.0 or 127.0.0.1, answers there."
        },
        "token": {
          "type": "string",
          "description": "The sandbox's token. Send it in the header `munito-sandbox-token` to open any of its ports. It lasts as long as the sandbox."
        }
      },
      "type": "object",
      "required": [
        "sandbox_id",
        "port",
        "public",
        "url",
        "token"
      ]
    },
    "SandboxSsh": {
      "properties": {
        "object": {
          "type": "string",
          "const": "sandbox.ssh",
          "default": "sandbox.ssh"
        },
        "sandbox_id": {
          "type": "string"
        },
        "host": {
          "type": "string",
          "description": "The SSH host of the sandboxes."
        },
        "user": {
          "type": "string",
          "description": "The user name: the id of the sandbox."
        },
        "command": {
          "type": "string",
          "description": "The command that opens a shell, with one of the keys."
        },
        "keys": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "description": "The public keys that open SSH to the sandbox."
        },
        "host_key": {
          "type": "string",
          "default": "",
          "description": "The host key of SSH. Add `<host> <host_key>` to ~/.ssh/known_hosts, so ssh trusts the host without a first prompt."
        }
      },
      "type": "object",
      "required": [
        "sandbox_id",
        "host",
        "user",
        "command",
        "keys"
      ]
    },
    "SandboxSshAccess": {
      "properties": {
        "object": {
          "type": "string",
          "const": "sandbox.ssh_access",
          "default": "sandbox.ssh_access"
        },
        "sandbox_id": {
          "type": "string"
        },
        "host": {
          "type": "string"
        },
        "user": {
          "type": "string"
        },
        "command": {
          "type": "string"
        },
        "expires_at": {
          "type": "integer"
        },
        "host_key": {
          "type": "string",
          "default": ""
        }
      },
      "type": "object",
      "required": [
        "sandbox_id",
        "host",
        "user",
        "command",
        "expires_at"
      ],
      "description": "A user name that opens SSH on its own. It carries its sandbox and its end, so the sandbox needs no key."
    },
    "SandboxStatus": {
      "type": "string",
      "enum": [
        "pending",
        "running",
        "paused",
        "stopped",
        "failed"
      ]
    },
    "SetPort": {
      "properties": {
        "public": {
          "type": "boolean",
          "description": "Open the port to anyone with its URL, or close it to all but the token and signed URLs."
        }
      },
      "additionalProperties": false,
      "type": "object",
      "required": [
        "public"
      ]
    },
    "SetSshKeys": {
      "properties": {
        "keys": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "description": "The public keys, each a line of authorized_keys, at most 16. This list replaces the last one."
        }
      },
      "additionalProperties": false,
      "type": "object",
      "required": [
        "keys"
      ]
    },
    "SetTimeout": {
      "properties": {
        "timeout": {
          "type": "integer",
          "description": "Seconds from now until the sandbox stops, or pauses when it is persistent: from 10 to 86400."
        }
      },
      "additionalProperties": false,
      "type": "object",
      "required": [
        "timeout"
      ]
    },
    "SignUrl": {
      "properties": {
        "expires_in": {
          "type": "integer",
          "maximum": 604800,
          "minimum": 60,
          "default": 3600,
          "description": "Seconds until the URL stops working: from 60 to 604800, 3600 by default. A browser that opens it keeps its access for a day."
        }
      },
      "additionalProperties": false,
      "type": "object"
    },
    "SignedUrl": {
      "properties": {
        "object": {
          "type": "string",
          "const": "sandbox.signed_url",
          "default": "sandbox.signed_url"
        },
        "url": {
          "type": "string"
        },
        "expires_at": {
          "type": "integer",
          "description": "Unix seconds."
        }
      },
      "type": "object",
      "required": [
        "url",
        "expires_at"
      ]
    }
  }
}