{"owner":"TencentCloud","repo":"CubeSandbox","hasSpec":true,"specFile":"openapi.yml","branch":"HEAD","format":"yaml","version":"3.x (YAML)","title":"CubeSandbox","description":"","endpoints":[],"spec":"# Copyright (c) 2026 Tencent Inc.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nopenapi: 3.1.0\ninfo:\n  title: CubeAPI\n  description: E2B-compatible sandbox API server.\n  license:\n    name: ''\n  version: 0.1.0\nservers:\n- url: /cubeapi/v1\n  description: CubeAPI SDK/dashboard surface (source of truth generated via `cube-api --export-openapi`)\npaths:\n  /health:\n    get:\n      tags:\n      - handlers::health\n      summary: GET /health\n      operationId: health\n      responses:\n        '200':\n          description: Health status\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/HealthResponse'\n  /sandboxes:\n    get:\n      tags:\n      - handlers::sandboxes\n      operationId: list_sandboxes\n      parameters:\n      - name: metadata\n        in: query\n        required: false\n        schema:\n          type: string\n      responses:\n        '200':\n          description: Sandbox list\n          content:\n            application/json:\n              schema:\n                type: array\n                items:\n                  $ref: '#/components/schemas/ListedSandbox'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n    post:\n      tags:\n      - handlers::sandboxes\n      operationId: create_sandbox\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/NewSandbox'\n        required: true\n      responses:\n        '201':\n          description: Sandbox created\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/Sandbox'\n        '400':\n          description: Invalid request\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /sandboxes/{sandboxID}:\n    get:\n      tags:\n      - handlers::sandboxes\n      operationId: get_sandbox\n      parameters:\n      - name: sandboxID\n        in: path\n        description: Sandbox identifier\n        required: true\n        schema:\n          type: string\n      responses:\n        '200':\n          description: Sandbox detail\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/SandboxDetail'\n        '404':\n          description: Sandbox not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n    delete:\n      tags:\n      - handlers::sandboxes\n      operationId: kill_sandbox\n      parameters:\n      - name: sandboxID\n        in: path\n        description: Sandbox identifier\n        required: true\n        schema:\n          type: string\n      responses:\n        '204':\n          description: Sandbox deleted\n        '404':\n          description: Sandbox not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '408':\n          description: The existing standard API request timeout expired before the synchronous delete completed\n        '409':\n          description: Paused sandbox cannot be admitted for internal resume because node capacity or resource metadata is unavailable\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '503':\n          description: Sandbox is pausing, another lifecycle operation is in progress, the Cubelet RPC has too little remaining time, or its internal resume could not be completed\n          headers:\n            Retry-After:\n              schema:\n                type: integer\n                format: int64\n                minimum: 0\n              description: Seconds a client should wait before retrying DELETE\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /sandboxes/{sandboxID}/connect:\n    post:\n      tags:\n      - handlers::sandboxes\n      operationId: connect_sandbox\n      parameters:\n      - name: sandboxID\n        in: path\n        description: Sandbox identifier\n        required: true\n        schema:\n          type: string\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/ConnectSandbox'\n        required: true\n      responses:\n        '200':\n          description: Sandbox connection info\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/Sandbox'\n        '404':\n          description: Sandbox not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /sandboxes/{sandboxID}/logs:\n    get:\n      tags:\n      - handlers::sandboxes\n      operationId: get_sandbox_logs\n      parameters:\n      - name: sandboxID\n        in: path\n        description: Sandbox identifier\n        required: true\n        schema:\n          type: string\n      - name: start\n        in: query\n        required: false\n        schema:\n          type: integer\n          format: int64\n      - name: limit\n        in: query\n        required: false\n        schema:\n          type: integer\n          format: int32\n      responses:\n        '200':\n          description: Sandbox logs (legacy shape)\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/SandboxLogs'\n        '404':\n          description: Sandbox not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /sandboxes/{sandboxID}/pause:\n    post:\n      tags:\n      - handlers::sandboxes\n      operationId: pause_sandbox\n      parameters:\n      - name: sandboxID\n        in: path\n        description: Sandbox identifier\n        required: true\n        schema:\n          type: string\n      responses:\n        '204':\n          description: Sandbox paused\n        '404':\n          description: Sandbox not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '409':\n          description: Sandbox cannot be paused\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /sandboxes/{sandboxID}/refreshes:\n    post:\n      tags:\n      - handlers::sandboxes\n      operationId: refresh_sandbox\n      parameters:\n      - name: sandboxID\n        in: path\n        description: Sandbox identifier\n        required: true\n        schema:\n          type: string\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/RefreshRequest'\n        required: true\n      responses:\n        '204':\n          description: Sandbox refreshed\n        '400':\n          description: Invalid duration value\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '404':\n          description: Sandbox not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /sandboxes/{sandboxID}/resume:\n    post:\n      tags:\n      - handlers::sandboxes\n      operationId: resume_sandbox\n      parameters:\n      - name: sandboxID\n        in: path\n        description: Sandbox identifier\n        required: true\n        schema:\n          type: string\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/ResumedSandbox'\n        required: true\n      responses:\n        '201':\n          description: Sandbox resumed\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/Sandbox'\n        '404':\n          description: Sandbox not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '409':\n          description: Sandbox is already running\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /sandboxes/{sandboxID}/rollback:\n    post:\n      tags:\n      - handlers::snapshots\n      operationId: rollback_sandbox\n      parameters:\n      - name: sandboxID\n        in: path\n        description: Sandbox identifier\n        required: true\n        schema:\n          type: string\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/RollbackRequest'\n        required: true\n      responses:\n        '200':\n          description: Sandbox rolled back to snapshot\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/RollbackResponse'\n        '404':\n          description: Sandbox or snapshot not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /sandboxes/{sandboxID}/snapshots:\n    post:\n      tags:\n      - handlers::snapshots\n      operationId: create_snapshot\n      parameters:\n      - name: sandboxID\n        in: path\n        description: Sandbox identifier\n        required: true\n        schema:\n          type: string\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/CreateSnapshotRequest'\n        required: true\n      responses:\n        '201':\n          description: Snapshot created\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/SnapshotInfo'\n        '404':\n          description: Sandbox not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /sandboxes/{sandboxID}/timeout:\n    post:\n      tags:\n      - handlers::sandboxes\n      operationId: set_sandbox_timeout\n      parameters:\n      - name: sandboxID\n        in: path\n        description: Sandbox identifier\n        required: true\n        schema:\n          type: string\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/SetTimeoutRequest'\n        required: true\n      responses:\n        '204':\n          description: Timeout updated\n        '400':\n          description: Invalid timeout value\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '404':\n          description: Sandbox not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /snapshots:\n    get:\n      tags:\n      - handlers::snapshots\n      operationId: list_snapshots\n      parameters:\n      - name: sandboxID\n        in: query\n        description: Filter by originating sandbox ID.\n        required: false\n        schema:\n          type: string\n      - name: limit\n        in: query\n        description: Max items per page (default 100, max 100).\n        required: false\n        schema:\n          type: integer\n          format: int32\n      - name: nextToken\n        in: query\n        description: Pagination cursor from previous response header x-next-token.\n        required: false\n        schema:\n          type: string\n      responses:\n        '200':\n          description: List of snapshots\n          content:\n            application/json:\n              schema:\n                type: array\n                items:\n                  $ref: '#/components/schemas/SnapshotListItem'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /templates:\n    get:\n      tags:\n      - handlers::templates\n      operationId: list_templates\n      parameters:\n      - name: instance_type\n        in: query\n        description: |-\n          Optional CubeMaster instance_type filter (currently no server-side filter;\n          reserved for future use).\n        required: false\n        schema:\n          type: string\n      responses:\n        '200':\n          description: Template list\n          content:\n            application/json:\n              schema:\n                type: array\n                items:\n                  $ref: '#/components/schemas/TemplateSummary'\n        '404':\n          description: Template endpoint unavailable\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n    post:\n      tags:\n      - handlers::templates\n      operationId: create_template\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/CreateTemplateRequest'\n        required: true\n      responses:\n        '202':\n          description: Template build job accepted\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/TemplateBuildJob'\n        '400':\n          description: Invalid request (bad alias, missing image, etc.)\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /templates/aliases/{alias}:\n    get:\n      tags:\n      - handlers::templates\n      operationId: get_template_by_alias\n      parameters:\n      - name: alias\n        in: path\n        description: Template alias\n        required: true\n        schema:\n          type: string\n      responses:\n        '200':\n          description: Template alias lookup\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/TemplateAliasLookupResponse'\n        '400':\n          description: Invalid alias\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '404':\n          description: Template alias not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /templates/compat:\n    get:\n      tags:\n      - handlers::templates\n      operationId: template_compat\n      responses:\n        '200':\n          description: Template compatibility matrix\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/TemplateCompatMatrixView'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /templates/compat/{templateID}/adopt-baseline:\n    post:\n      tags:\n      - handlers::templates\n      operationId: adopt_template_compat_baseline\n      parameters:\n      - name: templateID\n        in: path\n        description: Template identifier\n        required: true\n        schema:\n          type: string\n      responses:\n        '200':\n          description: Adopted UNKNOWN replicas to current baseline\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/TemplateCompatAdoptResponseView'\n        '404':\n          description: Template not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /templates/{templateID}:\n    get:\n      tags:\n      - handlers::templates\n      operationId: get_template\n      parameters:\n      - name: templateID\n        in: path\n        description: Template identifier\n        required: true\n        schema:\n          type: string\n      responses:\n        '200':\n          description: Template detail\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/TemplateDetail'\n        '404':\n          description: Template not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n    post:\n      tags:\n      - handlers::templates\n      operationId: rebuild_template\n      parameters:\n      - name: templateID\n        in: path\n        description: Template identifier\n        required: true\n        schema:\n          type: string\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/RebuildTemplateRequest'\n        required: true\n      responses:\n        '202':\n          description: Rebuild job accepted\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/TemplateBuildJob'\n        '404':\n          description: Template not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n    delete:\n      tags:\n      - handlers::templates\n      operationId: delete_template\n      parameters:\n      - name: templateID\n        in: path\n        description: Template identifier or alias\n        required: true\n        schema:\n          type: string\n      - name: instance_type\n        in: query\n        description: CubeMaster instance_type filter\n        required: false\n        schema:\n          type: string\n      - name: sync\n        in: query\n        description: Wait for deletion to complete before returning\n        required: false\n        schema:\n          type: boolean\n      responses:\n        '204':\n          description: Template deleted\n        '404':\n          description: Template not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n    patch:\n      tags:\n      - handlers::templates\n      operationId: update_template\n      parameters:\n      - name: templateID\n        in: path\n        description: Template identifier\n        required: true\n        schema:\n          type: string\n      responses:\n        '501':\n          description: Not implemented; use POST /templates/{id} to rebuild\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /templates/{templateID}/builds/{buildID}:\n    post:\n      tags:\n      - handlers::templates\n      operationId: start_template_build\n      parameters:\n      - name: templateID\n        in: path\n        description: Template identifier\n        required: true\n        schema:\n          type: string\n      - name: buildID\n        in: path\n        description: Build identifier\n        required: true\n        schema:\n          type: string\n      responses:\n        '202':\n          description: Build started\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/TemplateBuildJob'\n        '404':\n          description: Template or build not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /templates/{templateID}/builds/{buildID}/logs:\n    get:\n      tags:\n      - handlers::templates\n      operationId: get_template_build_logs\n      parameters:\n      - name: templateID\n        in: path\n        description: Template identifier\n        required: true\n        schema:\n          type: string\n      - name: buildID\n        in: path\n        description: Build identifier\n        required: true\n        schema:\n          type: string\n      responses:\n        '200':\n          description: Build logs (JSON)\n        '404':\n          description: Build not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /templates/{templateID}/builds/{buildID}/status:\n    get:\n      tags:\n      - handlers::templates\n      operationId: get_template_build_status\n      parameters:\n      - name: templateID\n        in: path\n        description: Template identifier\n        required: true\n        schema:\n          type: string\n      - name: buildID\n        in: path\n        description: Build identifier\n        required: true\n        schema:\n          type: string\n      responses:\n        '200':\n          description: Build status\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/TemplateBuildStatus'\n        '404':\n          description: Template or build not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /v2/sandboxes:\n    get:\n      tags:\n      - handlers::sandboxes\n      operationId: list_sandboxes_v2\n      parameters:\n      - name: metadata\n        in: query\n        required: false\n        schema:\n          type: string\n      - name: state\n        in: query\n        required: false\n        schema:\n          type: string\n      - name: nextToken\n        in: query\n        required: false\n        schema:\n          type: string\n      - name: limit\n        in: query\n        required: false\n        schema:\n          type: integer\n          format: int32\n      responses:\n        '200':\n          description: Sandbox list\n          content:\n            application/json:\n              schema:\n                type: array\n                items:\n                  $ref: '#/components/schemas/ListedSandbox'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /v2/sandboxes/{sandboxID}/logs:\n    get:\n      tags:\n      - handlers::sandboxes\n      operationId: get_sandbox_logs_v2\n      parameters:\n      - name: sandboxID\n        in: path\n        description: Sandbox identifier\n        required: true\n        schema:\n          type: string\n      - name: cursor\n        in: query\n        required: false\n        schema:\n          type: integer\n          format: int64\n      - name: limit\n        in: query\n        required: false\n        schema:\n          type: integer\n          format: int32\n      - name: direction\n        in: query\n        required: false\n        schema:\n          type: string\n      responses:\n        '200':\n          description: Structured sandbox logs\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/SandboxLogsV2Response'\n        '404':\n          description: Sandbox not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Unexpected backend error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n  /volumes:\n    get:\n      tags:\n      - handlers::volumes\n      summary: List all volumes.\n      description: Returns `200 OK` with `[Volume]` on success.\n      operationId: list_volumes\n      responses:\n        '200':\n          description: Successfully listed all volumes\n          content:\n            application/json:\n              schema:\n                type: array\n                items:\n                  $ref: '#/components/schemas/Volume'\n        '401':\n          description: Authentication error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Server error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n      security:\n      - apiKeyAuth: []\n    post:\n      tags:\n      - handlers::volumes\n      summary: Create a new volume.\n      description: Returns `201 Created` with `VolumeAndToken` on success.\n      operationId: create_volume\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/NewVolume'\n        required: true\n      responses:\n        '201':\n          description: Successfully created a new volume\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/VolumeAndToken'\n        '400':\n          description: Bad request\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '401':\n          description: Authentication error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Server error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n      security:\n      - apiKeyAuth: []\n  /volumes/{volumeID}:\n    get:\n      tags:\n      - handlers::volumes\n      summary: Get info for a single volume (includes auth token).\n      description: Returns `200 OK` with `VolumeAndToken` on success.\n      operationId: get_volume\n      parameters:\n      - name: volumeID\n        in: path\n        description: Identifier of the volume\n        required: true\n        schema:\n          type: string\n      responses:\n        '200':\n          description: Successfully retrieved a volume\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/VolumeAndToken'\n        '401':\n          description: Authentication error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '404':\n          description: Not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Server error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n      security:\n      - apiKeyAuth: []\n    delete:\n      tags:\n      - handlers::volumes\n      summary: Delete a volume.\n      description: Returns `204 No Content` on success.\n      operationId: delete_volume\n      parameters:\n      - name: volumeID\n        in: path\n        description: Identifier of the volume\n        required: true\n        schema:\n          type: string\n      responses:\n        '204':\n          description: Successfully deleted a volume\n        '401':\n          description: Authentication error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '404':\n          description: Not found\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n        '500':\n          description: Server error\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ApiError'\n      security:\n      - apiKeyAuth: []\ncomponents:\n  schemas:\n    ApiError:\n      type: object\n      required:\n      - code\n      - message\n      properties:\n        code:\n          type: integer\n          format: int32\n        message:\n          type: string\n    ConnectSandbox:\n      type: object\n      description: Request body for POST /sandboxes/{id}/connect.\n      properties:\n        timeout:\n          type:\n          - integer\n          - 'null'\n          format: int32\n          description: Idle timeout in seconds; None when the client did not send one.\n    CreateSnapshotRequest:\n      type: object\n      description: Request body for POST /sandboxes/{id}/snapshots.\n      properties:\n        name:\n          type:\n          - string\n          - 'null'\n    CreateTemplateRequest:\n      type: object\n      description: Body for POST /templates (create from image).\n      required:\n      - image\n      properties:\n        alias:\n          type:\n          - string\n          - 'null'\n          description: Deprecated E2B template alias. Used when `name` is absent or blank.\n        allowInternetAccess:\n          type:\n          - boolean\n          - 'null'\n          description: Allow internet (public) access.\n        allowOut:\n          type:\n          - array\n          - 'null'\n          items:\n            type: string\n          description: Allowed outbound CIDRs for CubeVS egress policy.\n        args:\n          type:\n          - array\n          - 'null'\n          items:\n            type: string\n          description: Override container CMD args.\n        command:\n          type:\n          - array\n          - 'null'\n          items:\n            type: string\n          description: Override container ENTRYPOINT.\n        cpu:\n          type:\n          - integer\n          - 'null'\n          format: int32\n          description: CPU in millicores, e.g. 2000 means 2000m.\n          minimum: 0\n        denyOut:\n          type:\n          - array\n          - 'null'\n          items:\n            type: string\n          description: Denied outbound CIDRs for CubeVS egress policy.\n        dns:\n          type:\n          - array\n          - 'null'\n          items:\n            type: string\n          description: Container DNS nameservers.\n        enableIvshmem:\n          type:\n          - boolean\n          - 'null'\n          description: Enable ivshmem when building the template snapshot.\n        env:\n          type:\n          - array\n          - 'null'\n          items:\n            type: string\n          description: Environment variables as \"KEY=VALUE\" strings.\n        exposedPorts:\n          type:\n          - array\n          - 'null'\n          items:\n            type: integer\n            format: int32\n            minimum: 0\n          description: Ports the container listens on.\n        image:\n          type: string\n          description: Container image reference, e.g. `registry.example.com/code:latest`.\n        instanceType:\n          type:\n          - string\n          - 'null'\n        memory:\n          type:\n          - integer\n          - 'null'\n          format: int32\n          description: Memory in MiB, e.g. 2000.\n          minimum: 0\n        name:\n          type:\n          - string\n          - 'null'\n          description: |-\n            E2B v3 template name. A tag suffix after ':' is accepted by CubeAPI but\n            only the name portion is forwarded as the CubeMaster alias.\n        networkType:\n          type:\n          - string\n          - 'null'\n          description: Network mode, e.g. \"tap\".\n        nodes:\n          type:\n          - array\n          - 'null'\n          items:\n            type: string\n          description: Limit template distribution to these node IDs or host IPs.\n        probePath:\n          type:\n          - string\n          - 'null'\n          description: HTTP probe path, e.g. \"/health\". Defaults to \"/health\" when `probePort` is set.\n        probePort:\n          type:\n          - integer\n          - 'null'\n          format: int32\n          description: HTTP probe port.\n          minimum: 0\n        registryPassword:\n          type:\n          - string\n          - 'null'\n          description: Registry password for private source images.\n        registryUsername:\n          type:\n          - string\n          - 'null'\n          description: Registry username for private source images.\n        templateID:\n          type: string\n          description: |-\n            Deprecated and ignored. Template IDs are always generated server-side\n            with the `tpl-` prefix; clients must use the returned `templateID`.\n        with_cube_ca:\n          type:\n          - boolean\n          - 'null'\n          description: |-\n            Whether CubeMaster bakes the CubeEgress root CA into the template rootfs.\n            Omitted or null defaults to true on CubeMaster.\n        writableLayerSize:\n          type:\n          - string\n          - 'null'\n          description: Writable layer size for the rootfs, e.g. \"1G\".\n    EgressRule:\n      type: object\n      description: 'L7 egress rule: match conditions + action (allow/deny, audit, credential injection).'\n      required:\n      - name\n      - match\n      - action\n      properties:\n        action:\n          $ref: '#/components/schemas/EgressRuleAction'\n        match:\n          $ref: '#/components/schemas/EgressRuleMatch'\n        name:\n          type: string\n          description: Human-readable label used for audit logging.\n    EgressRuleAction:\n      type: object\n      description: |-\n        Rule action.\n\n        - `allow=true`: pass the request through; optional credential injection.\n        - `allow=false`: reject (HTTP 403); `inject` is ignored if set.\n        - `audit` defaults to `\"metadata\"` server-side when omitted.\n      required:\n      - allow\n      properties:\n        allow:\n          type: boolean\n        audit:\n          type:\n          - string\n          - 'null'\n          description: One of `\"full\"`, `\"metadata\"`, `\"none\"`.\n        inject:\n          type:\n          - array\n          - 'null'\n          items:\n            $ref: '#/components/schemas/EgressRuleInject'\n    EgressRuleInject:\n      type: object\n      description: |-\n        Credential injection. Only honored when `Action.allow=true` and the\n        request is HTTPS with matching SNI/Host (downstream enforces).\n      required:\n      - header\n      - secret\n      properties:\n        format:\n          type:\n          - string\n          - 'null'\n          description: Template containing `${SECRET}`; defaults to `\"${SECRET}\"` when omitted.\n        header:\n          type: string\n        secret:\n          type: string\n    EgressRuleMatch:\n      type: object\n      description: |-\n        Rule match conditions. All fields optional; empty match matches any request.\n\n        Multi-field semantics: AND across fields, OR within `method`.\n        Comparisons on sni/host/scheme are case-insensitive.\n      properties:\n        host:\n          type:\n          - string\n          - 'null'\n        method:\n          type:\n          - array\n          - 'null'\n          items:\n            type: string\n        path:\n          type:\n          - string\n          - 'null'\n        scheme:\n          type:\n          - string\n          - 'null'\n        sni:\n          type:\n          - string\n          - 'null'\n    HashMap:\n      type: object\n      additionalProperties:\n        type: string\n      propertyNames:\n        type: string\n    HealthResponse:\n      type: object\n      required:\n      - status\n      - sandboxes\n      properties:\n        sandboxes:\n          type: integer\n          minimum: 0\n        status:\n          type: string\n    ListedSandbox:\n      type: object\n      description: One entry in GET /sandboxes (RunningSandbox in OpenAPI spec).\n      required:\n      - templateID\n      - sandboxID\n      - clientID\n      - startedAt\n      - cpuCount\n      - memoryMB\n      - state\n      - envdVersion\n      properties:\n        alias:\n          type:\n          - string\n          - 'null'\n        clientID:\n          type: string\n        cpuCount:\n          type: integer\n          format: int32\n        diskSizeMB:\n          type:\n          - integer\n          - 'null'\n          format: int32\n        endAt:\n          type:\n          - string\n          - 'null'\n          format: date-time\n          description: |-\n            Projected next-timeout instant. Omitted for never-timeout sandboxes\n            (no deadline) rather than being misreported as equal to startedAt.\n        envdVersion:\n          type: string\n        memoryMB:\n          type: integer\n          format: int32\n        metadata:\n          oneOf:\n          - type: 'null'\n          - $ref: '#/components/schemas/HashMap'\n        sandboxID:\n          type: string\n        startedAt:\n          type: string\n          format: date-time\n        state:\n          $ref: '#/components/schemas/SandboxState'\n        templateID:\n          type: string\n        volumeMounts:\n          type:\n          - array\n          - 'null'\n          items:\n            $ref: '#/components/schemas/SandboxVolumeMount'\n    LogLevel:\n      type: string\n      enum:\n      - debug\n      - info\n      - warn\n      - error\n    NewSandbox:\n      type: object\n      description: |-\n        Request body for POST /sandboxes\n        Field names match exactly what the E2B SDK sends.\n        Rule: ID abbreviations → uppercase (templateID, sandboxID, envVars);\n              allow_internet_access is a known SDK snake_case quirk;\n              lifecycle is a nested object — see SandboxLifecycleConfig.\n        `envVars` is the canonical field name; `envs` is accepted as a compatibility\n        alias for E2B SDK callers.\n      required:\n      - templateID\n      properties:\n        allow_internet_access:\n          type:\n          - boolean\n          - 'null'\n          description: SDK sends this as snake_case (known quirk).\n        autoPause:\n          type:\n          - boolean\n          - 'null'\n          description: |-\n            e2b SDK compatibility: the SDK flattens its user-facing `lifecycle`\n            object into top-level `autoPause` / `autoResume` before it hits the\n            wire, so `lifecycle` never arrives from an SDK caller. Ignored when\n            `lifecycle` is present.\n        autoResume:\n          oneOf:\n          - type: 'null'\n          - $ref: '#/components/schemas/SandboxAutoResume'\n            description: See `auto_pause`. Only meaningful alongside `autoPause = true`.\n        distributionScope:\n          type:\n          - array\n          - 'null'\n          items:\n            type: string\n        envVars:\n          oneOf:\n          - type: 'null'\n          - $ref: '#/components/schemas/HashMap'\n        lifecycle:\n          oneOf:\n          - type: 'null'\n          - $ref: '#/components/schemas/SandboxLifecycleConfig'\n            description: |-\n              Sandbox lifecycle configuration. Maps to e2b's `lifecycle` object so\n              callers that already speak e2b can pass through unchanged. Absent\n              (None) means today's behaviour: idle sandboxes are killed.\n        mcp: {}\n        metadata:\n          oneOf:\n          - type: 'null'\n          - $ref: '#/components/schemas/HashMap'\n        network:\n          oneOf:\n          - type: 'null'\n          - $ref: '#/components/schemas/SandboxNetworkConfig'\n        secure:\n          type:\n          - boolean\n          - 'null'\n        templateID:\n          type: string\n        timeout:\n          type:\n          - integer\n          - 'null'\n          format: int32\n          description: Optional idle TTL in seconds. See docs/guide/lifecycle.md.\n        volumeMounts:\n          type:\n          - array\n          - 'null'\n          items:\n            $ref: '#/components/schemas/SandboxVolumeMount'\n    NewVolume:\n      type: object\n      description: |-\n        Request body for POST /volumes.\n\n        `name` must match `^[a-zA-Z0-9_-]+$` and be at most [`MAX_VOLUME_NAME_LEN`] characters\n        (validated in the handler).\n        `driver` selects the Controller Hook Plugin in CubeMaster; omit to use the\n        default plugin configured in CubeMaster.\n      properties:\n        driver:\n          type:\n          - string\n          - 'null'\n          description: |-\n            Plugin/driver to use, e.g. \"nfs\", \"cos\", \"host-mount\".\n            Omit to use CubeMaster's default plugin.\n        name:\n          type: string\n          description: |-\n            Human-readable name for the volume. Optional;\n            if omitted a UUIDv4 is generated and used as both name and volume_id.\n    RebuildTemplateRequest:\n      type: object\n      description: Body for POST /templates/:id (rebuild).\n      additionalProperties: {}\n    RefreshRequest:\n      type: object\n      description: Request body for POST /sandboxes/{id}/refreshes\n      properties:\n        duration:\n          type:\n          - integer\n          - 'null'\n          format: int32\n    ResumedSandbox:\n      type: object\n      description: Request body for POST /sandboxes/{id}/resume (deprecated).\n      properties:\n        autoPause:\n          type: boolean\n        timeout:\n          type:\n          - integer\n          - 'null'\n          format: int32\n          description: Idle timeout in seconds; None when the client did not send one.\n    RollbackRequest:\n      type: object\n      description: Request body for POST /sandboxes/{id}/rollback.\n      required:\n      - snapshotID\n      properties:\n        snapshotID:\n          type: string\n    RollbackResponse:\n      type: object\n      description: Response for POST /sandboxes/{id}/rollback after synchronous completion.\n      required:\n      - sandboxID\n      - snapshotID\n      - operationID\n      - status\n      properties:\n        operationID:\n          type: string\n        sandboxID:\n          type: string\n        snapshotID:\n          type: string\n        status:\n          type: string\n    Sandbox:\n      type: object\n      description: |-\n        Response for POST /sandboxes and POST /sandboxes/{id}/connect.\n        All ID abbreviations uppercase per E2B OpenAPI spec.\n      required:\n      - templateID\n      - sandboxID\n      - clientID\n      - envdVersion\n      properties:\n        alias:\n          type:\n          - string\n          - 'null'\n        clientID:\n          type: string\n        domain:\n          type:\n          - string\n          - 'null'\n        envdAccessToken:\n          type:\n          - string\n          - 'null'\n        envdVersion:\n          type: string\n        sandboxID:\n          type: string\n        templateID:\n          type: string\n        trafficAccessToken:\n          type:\n          - string\n          - 'null'\n    SandboxAutoResume:\n      oneOf:\n      - type: boolean\n      - type: object\n        required:\n        - enabled\n        properties:\n          enabled:\n            type: boolean\n      description: |-\n        Wire shape of the top-level `autoResume` field the e2b SDK sends. Current\n        SDK releases send `{\"enabled\": true}`; older ones and hand-rolled clients\n        send a bare `true`. Both mean the same thing, so accept either rather than\n        rejecting on shape.\n    SandboxDetail:\n      type: object\n      description: Detailed sandbox info returned by GET /sandboxes/{sandboxID}.\n      required:\n      - templateID\n      - sandboxID\n      - clientID\n      - startedAt\n      - envdVersion\n      - cpuCount\n      - memoryMB\n      - state\n      properties:\n        alias:\n          type:\n          - string\n          - 'null'\n        clientID:\n          type: string\n        cpuCount:\n          type: integer\n          format: int32\n        diskSizeMB:\n          type:\n          - integer\n          - 'null'\n          format: int32\n        domain:\n          type:\n          - string\n          - 'null'\n        endAt:\n          type:\n          - string\n          - 'null'\n          format: date-time\n          description: |-\n            Projected next-timeout instant. Omitted for never-timeout sandboxes\n            (no deadline) rather than being misreported as equal to startedAt.\n        envdAccessToken:\n          type:\n          - string\n          - 'null'\n        envdVersion:\n          type: string\n        memoryMB:\n          type: integer\n          format: int32\n        metadata:\n          oneOf:\n          - type: 'null'\n          - $ref: '#/components/schemas/HashMap'\n        sandboxID:\n          type: string\n        startedAt:\n          type: string\n          format: date-time\n        state:\n          $ref: '#/components/schemas/SandboxState'\n        templateID:\n          type: string\n        volumeMounts:\n          type:\n          - array\n          - 'null'\n          items:\n            $ref: '#/components/schemas/SandboxVolumeMount'\n    SandboxLifecycleConfig:\n      type: object\n      description: |-\n        Sandbox lifecycle configuration. Mirrors the e2b SDK's `lifecycle` object —\n        see https://e2b.dev/docs/sandbox/auto-resume for the canonical reference.\n\n        `on_timeout` decides what happens when the sandbox idle timer fires; the\n        historical default is \"kill\" (delete the sandbox) which matches today's\n        behaviour. `auto_resume` only takes effect when `on_timeout = \"pause\"` —\n        it tells the proxy/sidecar to wake a paused sandbox up automatically when\n        activity arrives, instead of returning an error.\n      properties:\n        autoResume:\n          type: boolean\n          description: |-\n            Auto-resume on activity. Defaults to false. Only meaningful when\n            `on_timeout` is set to \"pause\".\n        onTimeout:\n          $ref: '#/components/schemas/SandboxOnTimeout'\n          description: '\"kill\" (default) | \"pause\".'\n    SandboxLog:\n      type: object\n      description: Single raw log line — matches E2B SandboxLog schema (timestamp + line).\n      required:\n      - timestamp\n      - line\n      properties:\n        line:\n          type: string\n        timestamp:\n          type: string\n          format: date-time\n    SandboxLogEntry:\n      type: object\n      description: Structured log entry (v2 logs).\n      required:\n      - timestamp\n      - message\n      - level\n      - fields\n      properties:\n        fields:\n          type: object\n          additionalProperties:\n            type: string\n          propertyNames:\n            type: string\n        level:\n          $ref: '#/components/schemas/LogLevel'\n        message:\n          type: string\n        timestamp:\n          type: string\n          format: date-time\n    SandboxLogs:\n      type: object\n      description: Legacy log response — matches E2B SandboxLogs schema.\n      required:\n      - logs\n      - logEntries\n      properties:\n        logEntries:\n          type: array\n          items:\n            $ref: '#/components/schemas/SandboxLogEntry'\n        logs:\n          type: array\n          items:\n            $ref: '#/components/schemas/SandboxLog'\n    SandboxLogsV2Response:\n      type: object\n      description: v2 log response.\n      required:\n      - logs\n      properties:\n        logs:\n          type: array\n          items:\n            $ref: '#/components/schemas/SandboxLogEntry'\n    SandboxNetworkConfig:\n      type: object\n      description: Network configuration for sandbox egress/ingress control.\n      properties:\n        allowOut:\n          type:\n          - array\n          - 'null'\n          items:\n            type: string\n        allowPublicTraffic:\n          type:\n          - boolean\n          - 'null'\n        denyOut:\n          type:\n          - array\n          - 'null'\n          items:\n            type: string\n        maskRequestHost:\n          type:\n          - string\n          - 'null'\n          description: |-\n            Host authority forwarded to user services by CubeProxy. `${PORT}` is\n            expanded to the requested sandbox port; envd traffic is exempt.\n        rules:\n          type:\n          - array\n          - 'null'\n          items:\n            $ref: '#/components/schemas/EgressRule'\n          description: L7 egress rules, evaluated first-match-wins in list order.\n    SandboxOnTimeout:\n      type: string\n      enum:\n      - kill\n      - pause\n    SandboxState:\n      type: string\n      description: State of the sandbox (running | paused)\n      enum:\n      - running\n      - paused\n      - pausing\n    SandboxVolumeMount:\n      type: object\n      description: Volume mount inside the sandbox.\n      required:\n      - name\n      - path\n      properties:\n        name:\n          type: string\n        path:\n          type: string\n        readOnly:\n          type: boolean\n          description: |-\n            CubeSandbox extension: mount this volume read-only for this sandbox\n            attachment. Defaults to false when omitted.\n    SetTimeoutRequest:\n      type: object\n      description: Request body for POST /sandboxes/{id}/timeout\n      required:\n      - timeout\n      properties:\n        timeout:\n          type: integer\n          format: int32\n    SnapshotInfo:\n      type: object\n      description: Response for POST /sandboxes/{id}/snapshots.\n      required:\n      - snapshotID\n      - names\n      properties:\n        names:\n          type: array\n          items:\n            type: string\n        snapshotID:\n          type: string\n    SnapshotListItem:\n      type: object\n      description: One entry in the GET /snapshots list.\n      required:\n      - snapshotID\n      - names\n      - status\n      properties:\n        createdAt:\n          type:\n          - string\n          - 'null'\n          format: date-time\n        names:\n          type: array\n          items:\n            type: string\n        originSandboxID:\n          type:\n          - string\n          - 'null'\n        snapshotID:\n          type: string\n        status:\n          type: string\n        updatedAt:\n          type:\n          - string\n          - 'null'\n          format: date-time\n    TemplateAliasLookupResponse:\n      type: object\n      required:\n      - templateID\n      - public\n      properties:\n        public:\n          type: boolean\n        templateID:\n          type: string\n    TemplateBuildJob:\n      type: object\n      description: Job envelope returned by create / rebuild.\n      required:\n      - jobID\n      - templateID\n      - status\n      - phase\n      - progress\n      properties:\n        errorMessage:\n          type: string\n        jobID:\n          type: string\n        phase:\n          type: string\n        progress:\n          type: integer\n          format: int32\n        status:\n          type: string\n        templateID:\n          type: string\n    TemplateBuildStatus:\n      type: object\n      description: Response for GET /templates/:id/builds/:bid/status\n      required:\n      - buildID\n      - templateID\n      - status\n      - progress\n      - message\n      properties:\n        buildID:\n          type: string\n        message:\n          type: string\n        progress:\n          type: integer\n          format: int32\n        status:\n          type: string\n        templateID:\n          type: string\n    TemplateCompatAdoptResponseView:\n      type: object\n      required:\n      - updated\n      properties:\n        updated:\n          type: integer\n          format: int32\n    TemplateCompatMatrixView:\n      type: object\n      required:\n      - summary\n      - templates\n      properties:\n        summary:\n          $ref: '#/components/schemas/TemplateCompatSummaryView'\n        templates:\n          type: array\n          items:\n            $ref: '#/components/schemas/TemplateCompatRowView'\n    TemplateCompatRowView:\n      type: object\n      required:\n      - templateID\n      - overall\n      - nodes\n      properties:\n        instanceType:\n          type:\n          - string\n          - 'null'\n        nodes:\n          type: array\n          items:\n            $ref: '#/components/schemas/TemplateNodeCompatView'\n        overall:\n          type: string\n        templateID:\n          type: string\n    TemplateCompatSummaryView:\n      type: object\n      required:\n      - staleTemplates\n      - staleReplicas\n      - affectedNodes\n      - missingReplicas\n      - unknownReplicas\n      properties:\n        affectedNodes:\n          type: integer\n          format: int32\n        missingReplicas:\n          type: integer\n          format: int32\n        staleReplicas:\n          type: integer\n          format: int32\n        staleTemplates:\n          type: integer\n          format: int32\n        unknownReplicas:\n          type: integer\n          format: int32\n    TemplateDetail:\n      type: object\n      description: Detailed template response (GET /templates/:id).\n      required:\n      - templateID\n      - public\n      - status\n      - replicas\n      - aliases\n      properties:\n        aliases:\n          type: array\n          items:\n            type: string\n          description: |-\n            E2B template aliases. CubeSandbox has no namespace model, so this\n            mirrors the stable alias when one is configured.\n        allowInternetAccess:\n          type:\n          - boolean\n          - 'null'\n          description: Whether public internet access is allowed for sandboxes from this template.\n        createRequest: {}\n        createdAt:\n          type:\n          - string\n          - 'null'\n        instanceType:\n          type:\n          - string\n          - 'null'\n        jobID:\n          type:\n          - string\n          - 'null'\n          description: Latest create/rebuild job id for the template.\n        lastError:\n          type:\n          - string\n          - 'null'\n        networkType:\n          type:\n          - string\n          - 'null'\n          description: Network type used when the template was created, e.g. \"tap\".\n        public:\n          type: boolean\n        replicas:\n          type: array\n          items: {}\n        status:\n          type: string\n        templateID:\n          type: string\n        version:\n          type:\n          - string\n          - 'null'\n    TemplateNodeCompatView:\n      type: object\n      required:\n      - nodeID\n      - compatStatus\n      properties:\n        boundAgentVersion:\n          type:\n          - string\n          - 'null'\n        boundGuestImageVersion:\n          type:\n          - string\n          - 'null'\n        boundKernelVersion:\n          type:\n          - string\n          - 'null'\n        compatStatus:\n          type: string\n        currentAgentVersion:\n          type:\n          - string\n          - 'null'\n        currentGuestImageVersion:\n          type:\n          - string\n          - 'null'\n        currentKernelVersion:\n          type:\n          - string\n          - 'null'\n        nodeID:\n          type: string\n        nodeIP:\n          type:\n          - string\n          - 'null'\n    TemplateSummary:\n      type: object\n      description: Summary row returned by GET /templates.\n      required:\n      - templateID\n      - public\n      - status\n      - aliases\n      properties:\n        aliases:\n          type: array\n          items:\n            type: string\n          description: |-\n            E2B template aliases. CubeSandbox has no namespace model, so this\n            mirrors the stable alias when one is configured.\n        createdAt:\n          type:\n          - string\n          - 'null'\n        imageInfo:\n          type:\n          - string\n          - 'null'\n        instanceType:\n          type:\n          - string\n          - 'null'\n        jobID:\n          type:\n          - string\n          - 'null'\n          description: Latest create/rebuild job id for the template.\n        lastError:\n          type:\n          - string\n          - 'null'\n        public:\n          type: boolean\n        status:\n          type: string\n        templateID:\n          type: string\n        version:\n          type:\n          - string\n          - 'null'\n    Volume:\n      type: object\n      description: Volume descriptor returned in list responses (no token).\n      required:\n      - volumeID\n      - name\n      properties:\n        name:\n          type: string\n        volumeID:\n          type: string\n    VolumeAndToken:\n      type: object\n      description: |-\n        Volume descriptor with auth token — returned on create / get-single.\n        E2B SDK requires `token` to always be present (non-optional); use empty\n        string when the plugin does not return a token.\n      required:\n      - volumeID\n      - name\n      properties:\n        name:\n          type: string\n        token:\n          type: string\n          description: Auth token returned by the volume plugin. Empty string when not applicable.\n        volumeID:\n          type: string\n  securitySchemes:\n    apiKeyAuth:\n      type: apiKey\n      in: header\n      name: X-API-Key\n    bearerAuth:\n      type: http\n      scheme: bearer\n      bearerFormat: JWT\ntags:\n- name: health\n  description: Health and liveness\n- name: templates\n  description: Template catalog\n- name: sandboxes\n  description: Sandbox lifecycle and logs\n- name: snapshots\n  description: Sandbox snapshots\n- name: volumes\n  description: Persistent volumes\n"}