メインコンテンツまでスキップ

Workspaces API

すべてのエンドポイントで Authorization: Bearer nt_… が必要で、共通エラー形式 を共有します。個別に記載のないステータス(401, 429, 500 等)も発生します。

ワークスペース作成

curl -X POST https://api.nanoterm.dev/api/workspaces \
-H 'Authorization: Bearer nt_…' \
-H 'Content-Type: application/json' \
-d '{
"name": "my-agent",
"image": "ubuntu:22.04",
"size": "small"
}'

Body

FieldType必須デフォルト説明
namestringno自動生成人間可読な名前
imagestringnoubuntu:22.04コンテナベースイメージ。GET /api/info で公開されている curated イメージ(またはサーバ側で設定された ALLOWED_IMAGE_PATTERNS のいずれか)に一致する必要があります。一致しない場合は 400 INVALID_IMAGE
sizeenumnosmallxs / small / medium / large
policyIdstringno適用するポリシー ID
ports{host?, container}[]no自動ポートマッピング。host は省略可 — 省略すると container + 10000 帯から自動割当、指定すると固定。指定した host が既に使用中なら 409 PORT_IN_USE
repo.urlstringno/workspace にクローンする Git リポジトリ。組織の GITHUB_TOKEN シークレットがあれば認証に利用
repo.branchstringnoデフォルトブランチチェックアウトするブランチ

レスポンス

201 Created

{
"id": "ws_a1b2c3d4",
"name": "my-agent",
"image": "ubuntu:22.04",
"size": "small",
"status": "running",
"ports": [{ "host": 13000, "container": 3000 }],
"createdAt": "2026-04-18T08:00:00.000Z"
}

400 VALIDATION_FAILED

{ "error": { "code": "VALIDATION_FAILED", "message": "size: invalid enum value" } }

400 INVALID_IMAGE

送信した image がサーバの allowlist に含まれていないとき返します。デフォルトの allowlist は GET /api/info の curated 一覧。サーバ運用者は ALLOWED_IMAGE_PATTERNS 環境変数(カンマ区切りの regex source)で拡張可能。このゲートが attacker.example/x:latest のような任意レジストリ pull を防ぎます — SSRF と supply-chain の両方の対策です。

{
"error": {
"code": "INVALID_IMAGE",
"message": "Image 'attacker.example/x' is not allowed.",
"action": "Use one of the curated images from GET /api/info...",
"retryable": false
}
}

409 PORT_IN_USE

明示的に指定した host ポートが他のアクティブなワークスペースで既に使用中のとき返します。別のポートにするか、host を省略してサーバに選ばせてください。

{ "error": { "code": "PORT_IN_USE", "message": "Host port 13000 is already in use by another workspace." } }

429 QUOTA_EXCEEDED

ワークスペース数上限(RPM の RATE_LIMITED とは別)。

{
"error": {
"code": "QUOTA_EXCEEDED",
"message": "Workspace limit reached (10/10).",
"action": "Terminate unused workspaces or upgrade your plan.",
"retryable": false
}
}

429 COMPUTE_QUOTA_EXCEEDED

プランの月間コンピュート時間を使い切ったとき。workspace.start / workspace.stop の監査ログから当月分を集計しています。

{
"error": {
"code": "COMPUTE_QUOTA_EXCEEDED",
"message": "Monthly compute hours exhausted (50/50 h).",
"action": "Wait for the cycle to reset on the 1st, or upgrade your plan.",
"retryable": false
}
}

503 RUNTIME_UNAVAILABLE

{
"error": {
"code": "RUNTIME_UNAVAILABLE",
"message": "Container runtime not available.",
"action": "Start Docker Desktop or `podman machine start`.",
"retryable": true
}
}

一覧

curl https://api.nanoterm.dev/api/workspaces \
-H 'Authorization: Bearer nt_…'

200 OK

[
{
"id": "ws_a1b2c3d4",
"name": "my-agent",
"image": "ubuntu:22.04",
"size": "small",
"status": "running",
"createdAt": "2026-04-18T08:00:00.000Z"
}
]

取得

curl https://api.nanoterm.dev/api/workspaces/ws_a1b2c3d4 \
-H 'Authorization: Bearer nt_…'

200 OK

単一の WorkspaceInfo(一覧と同形式)。

404 NOT_FOUND

存在しない場合 および 別組織所有の場合の両方で返します — テナント間で存在をリークしないためです。

{ "error": { "code": "NOT_FOUND", "message": "Workspace 'ws_a1b2c3d4' not found" } }

停止 / 再開

curl -X POST https://api.nanoterm.dev/api/workspaces/ws_a1b2c3d4/stop \
-H 'Authorization: Bearer nt_…'

curl -X POST https://api.nanoterm.dev/api/workspaces/ws_a1b2c3d4/start \
-H 'Authorization: Bearer nt_…'

停止はファイルシステムを保持し、再開はそこから復帰します。停止中は compute 課金が止まります。

200 OK

statusstopped / running に遷移した WorkspaceInfo を返します。

400 WORKSPACE_STOP_FAILED / WORKSPACE_START_FAILED

不正な状態遷移(例: running なワークスペースを start)。


終了

curl -X DELETE https://api.nanoterm.dev/api/workspaces/ws_a1b2c3d4 \
-H 'Authorization: Bearer nt_…'

取り消し不可 — コンテナを削除し、行を removed にします。

200 OK

{ "ok": true }

スナップショット

実行中のコンテナをローカルイメージにコミットします。復元は 新しい ワークスペースをそのイメージから作成します(元は無傷)。Podman 限定 — Kubernetes ランタイムでは 501 NOT_SUPPORTED を返します。

スナップショット作成

curl -X POST https://api.nanoterm.dev/api/workspaces/ws_a1b2c3d4/snapshots \
-H 'Authorization: Bearer nt_…' \
-H 'Content-Type: application/json' \
-d '{"name":"before-migration"}'

Bodyname (string, optional)。省略時はタイムスタンプから自動生成。

201 Created

{
"id": "sn_x1y2z3",
"workspaceId": "ws_a1b2c3d4",
"name": "before-migration",
"imageRef": "nanoterm-snapshot:sn_x1y2z3",
"sizeBytes": 44040192,
"sourceImage": "ubuntu:22.04",
"createdAt": "2026-04-18T08:01:23.000Z"
}

400 SNAPSHOT_CREATE_FAILED

ソースが running でない場合。

429 STORAGE_QUOTA_EXCEEDED

プランのスナップショット容量上限に達しています。見積は保守的にソースイメージサイズを使います。

{
"error": {
"code": "STORAGE_QUOTA_EXCEEDED",
"message": "Storage quota exceeded (4.0 GB used + ~2.5 GB for this snapshot > 5 GB).",
"action": "Delete old snapshots or upgrade your plan."
}
}

501 NOT_SUPPORTED

Kubernetes ランタイム上で実行している場合。

一覧

curl https://api.nanoterm.dev/api/workspaces/ws_a1b2c3d4/snapshots \
-H 'Authorization: Bearer nt_…'

200 OK

Snapshot の配列(新しい順)。

復元

curl -X POST https://api.nanoterm.dev/api/workspaces/ws_a1b2c3d4/snapshots/sn_x1y2z3/restore \
-H 'Authorization: Bearer nt_…' \
-H 'Content-Type: application/json' \
-d '{"name":"restored-agent"}'

Bodyname (string, optional)。省略時は <snapshotName>-restore

201 Created

{ "workspaceId": "ws_newid01" }

429 QUOTA_EXCEEDED

復元はワークスペースのクォータを消費します。

削除

curl -X DELETE https://api.nanoterm.dev/api/workspaces/ws_a1b2c3d4/snapshots/sn_x1y2z3 \
-H 'Authorization: Bearer nt_…'

行と、ローカルイメージの両方を削除します。

200 OK

{ "ok": true }