Browse documentationApps

Resource guide

An app binds a folder to a process

App registration connects a workspace path, start command, port, and stable slug. An optional name is the human-facing label; when it is unset, clients display the registered folder name. An optional icon is a safe path relative to that app folder, such as icon.png or assets/icon.png—it is not an image URL or embedded bytes. Keep the command reproducible from the registered folder and choose visibility separately from process configuration. The API returns the generated https://<app>--<workspace>.edge.duet.so/ launch URL; clients should not construct or persist a second app identity.

{
  "path": "apps/status",
  "command": "bun run start",
  "apiScopes": ["services"],
  "port": 4173,
  "slug": "status",
  "name": "Status Board",
  "icon": "assets/icon.png"
}

apiScopes is the app server's least-privilege declaration, not a list of features the UI happens to show. Declare only the capabilities required by Duet API routes the server actually calls, and send [] when it calls none. The capability grammar and credential boundaries live in API keys and scopes; admin is deliberately unavailable to apps.

Duet does not add an install-time consent step. Declared scopes are visible before and after an app is installed, with elevated access called out; a workspace removes that authority by disabling or uninstalling the app, not by maintaining a second approval record.

Runtime authority stays outside the drive

After registration, Duet mints a hidden key for each app row with a non-empty declaration in that workspace. Only the spawned service receives DUET_APP_API_KEY and DUET_API_URL; install commands do not receive the key. Read both from the process environment and keep the key in memory. Never write it to source, .env*, SQLite, logs, or another drive path: drive contents sync to devices and can be shared or published.

Changing apiScopes replaces stale authority and restarts that app with the new key. Disabling or deleting the app revokes its key. The platform owns refresh and recovery, so app code should treat the value as replaceable rather than cache it.

Reconcile, do not duplicate

List existing apps before creating one from automation. Update command, install command, or port on the existing slug; use deletion only when the public identity should disappear. Name and icon updates are metadata-only: they do not reinstall or restart the app, and sending the same icon path again deliberately advances updatedAt so clients can refresh bytes replaced at that path. Public visibility is a deliberate exposure boundary, not a health-check mechanism.

Runtime writes are complete only after Duet's computer accepts the workspace configuration. Apps report whether that reconciliation is pending, complete, or needs attention. A reconciliation failure is a structured API error: preserve the returned app, show the reason, and refresh the list instead of assuming the optimistic change became durable. Failed runtime edits retain the last accepted command, install command, and port while retaining name and icon changes from the request; failed deletes retain the app registration.

Shared apps arrive as replicas

Accepting a share whose folder registers apps materializes real app rows in the recipient workspace, tagged with their origin (sourceShareId, sourceAppId) and with the access that share grants (sourceShareMode). Its apiScopes declaration travels with the registration, but no key does: the recipient workspace mints its own runtime credential. A replica is a real app on the recipient's own computer at the recipient's own URL, so sharing an app is sharing files: a write-mode recipient may change its runtime and publish their copy, and doing so never changes the origin app's visibility. A read-mode recipient may do neither. The recipient's own control is the disabled flag: disabling a replica is durable — origin updates never resurrect it — and re-enabling is the same idempotent endpoint. A replica records who disabled it and when, so the state is auditable. A replica is removed by dropping the share, never by deleting the app.

Keep policy on the server

The apps scope permits access to this resource but does not replace workspace roles. Viewers can list and inspect apps. Editors can register apps, change runtime configuration, make a public app workspace-only, and delete it. Only owners can expose an app publicly.

Role alone cannot answer what a caller may do to a given app, because a replica lives in a workspace the recipient owns while its permissions come from the share. Every app therefore carries its own resolved controls (updateRuntime, makePublic, makePrivate, delete); the list-level capabilities answers only the workspace-wide question of whether this caller may register an app. Present controls from those values, and still handle authorization failures because roles and shares can change after a client loads.

A private app is reachable without being public

Visibility governs the public URL, not whether members can use the app. An anonymous request to a private app's https://<app>--<workspace>.edge.duet.so/ is refused. Members reach the same app through GET /v1/ws/{workspace}/apps/{slug}/launch, which mints a short-lived access grant, sets the edge session cookie, and redirects to the app. Clients should send people to that endpoint — embedded or in a new tab — and show the public URL only when the app is public.

Apps

9 operations
GET/v1/ws/{workspaceSlug}/apps

List workspace apps, optionally filtered by drive path

Scope
ws:{workspaceSlug}:apps
Request
No JSON request body
Query
Query parameters JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "path": {
      "type": "string"
    },
    "scope": {
      "type": "string",
      "enum": [
        "subtree",
        "children",
        "self"
      ]
    }
  }
}
Response
Response JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "apps": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "workspaceId": {
            "type": "string"
          },
          "anchorId": {
            "type": "string"
          },
          "anchorPath": {
            "type": "string",
            "minLength": 1
          },
          "anchorState": {
            "type": "string",
            "enum": [
              "active",
              "broken",
              "orphaned"
            ]
          },
          "command": {
            "type": "string",
            "minLength": 1
          },
          "apiScopes": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "files:read",
                "files:write",
                "memory",
                "sessions",
                "agents",
                "services",
                "integrations",
                "apps",
                "share",
                "publish",
                "members"
              ]
            }
          },
          "installCommand": {
            "type": "string",
            "minLength": 1
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535
          },
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "icon": {
            "type": "string"
          },
          "visibility": {
            "type": "string",
            "enum": [
              "folder",
              "public"
            ]
          },
          "canonicalUrl": {
            "type": "string",
            "format": "uri"
          },
          "runtimeStatus": {
            "type": "string",
            "enum": [
              "reconciling",
              "reconciled",
              "reconcile_failed"
            ]
          },
          "reconciliationError": {
            "type": "string",
            "minLength": 1
          },
          "sourceShareId": {
            "type": "string"
          },
          "sourceShareMode": {
            "type": "string",
            "enum": [
              "read",
              "write"
            ]
          },
          "sourceAppId": {
            "type": "string"
          },
          "listingSubscriptionId": {
            "type": "string"
          },
          "disabledAt": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "disabledByUserId": {
            "type": "string"
          },
          "createdByUserId": {
            "type": "string"
          },
          "createdAt": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "updatedAt": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "controls": {
            "type": "object",
            "properties": {
              "updateRuntime": {
                "type": "boolean"
              },
              "makePublic": {
                "type": "boolean"
              },
              "makePrivate": {
                "type": "boolean"
              },
              "delete": {
                "type": "boolean"
              }
            },
            "required": [
              "updateRuntime",
              "makePublic",
              "makePrivate",
              "delete"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "id",
          "workspaceId",
          "anchorId",
          "anchorPath",
          "anchorState",
          "command",
          "apiScopes",
          "port",
          "slug",
          "visibility",
          "canonicalUrl",
          "runtimeStatus",
          "createdByUserId",
          "createdAt",
          "updatedAt",
          "controls"
        ],
        "additionalProperties": false
      }
    },
    "capabilities": {
      "type": "object",
      "properties": {
        "register": {
          "type": "boolean"
        }
      },
      "required": [
        "register"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "apps",
    "capabilities"
  ],
  "additionalProperties": false
}
Delivery
Standard response
Retry
Not declared idempotent
GET/v1/ws/{workspaceSlug}/apps/{slug}/launch

Open a private app: mints a short-lived access grant and redirects to it

Scope
ws:{workspaceSlug}:apps
Request
No JSON request body
Response
No structured response body
Delivery
Standard response
Retry
Not declared idempotent
POST/v1/ws/{workspaceSlug}/apps

Register a workspace folder as an app runtime with optional display metadata

Scope
ws:{workspaceSlug}:apps
Request
Request JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "minLength": 1
    },
    "command": {
      "type": "string",
      "minLength": 1
    },
    "apiScopes": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "files:read",
          "files:write",
          "memory",
          "sessions",
          "agents",
          "services",
          "integrations",
          "apps",
          "share",
          "publish",
          "members"
        ]
      }
    },
    "installCommand": {
      "type": "string",
      "minLength": 1
    },
    "port": {
      "type": "integer",
      "minimum": 1,
      "maximum": 65535
    },
    "slug": {
      "type": "string"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "icon": {
      "type": "string"
    }
  },
  "required": [
    "path",
    "command",
    "apiScopes",
    "slug"
  ]
}
Response
Response JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "app": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "workspaceId": {
          "type": "string"
        },
        "anchorId": {
          "type": "string"
        },
        "anchorPath": {
          "type": "string",
          "minLength": 1
        },
        "anchorState": {
          "type": "string",
          "enum": [
            "active",
            "broken",
            "orphaned"
          ]
        },
        "command": {
          "type": "string",
          "minLength": 1
        },
        "apiScopes": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "files:read",
              "files:write",
              "memory",
              "sessions",
              "agents",
              "services",
              "integrations",
              "apps",
              "share",
              "publish",
              "members"
            ]
          }
        },
        "installCommand": {
          "type": "string",
          "minLength": 1
        },
        "port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65535
        },
        "slug": {
          "type": "string"
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        },
        "icon": {
          "type": "string"
        },
        "visibility": {
          "type": "string",
          "enum": [
            "folder",
            "public"
          ]
        },
        "canonicalUrl": {
          "type": "string",
          "format": "uri"
        },
        "runtimeStatus": {
          "type": "string",
          "enum": [
            "reconciling",
            "reconciled",
            "reconcile_failed"
          ]
        },
        "reconciliationError": {
          "type": "string",
          "minLength": 1
        },
        "sourceShareId": {
          "type": "string"
        },
        "sourceShareMode": {
          "type": "string",
          "enum": [
            "read",
            "write"
          ]
        },
        "sourceAppId": {
          "type": "string"
        },
        "listingSubscriptionId": {
          "type": "string"
        },
        "disabledAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "disabledByUserId": {
          "type": "string"
        },
        "createdByUserId": {
          "type": "string"
        },
        "createdAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "updatedAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "controls": {
          "type": "object",
          "properties": {
            "updateRuntime": {
              "type": "boolean"
            },
            "makePublic": {
              "type": "boolean"
            },
            "makePrivate": {
              "type": "boolean"
            },
            "delete": {
              "type": "boolean"
            }
          },
          "required": [
            "updateRuntime",
            "makePublic",
            "makePrivate",
            "delete"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "id",
        "workspaceId",
        "anchorId",
        "anchorPath",
        "anchorState",
        "command",
        "apiScopes",
        "port",
        "slug",
        "visibility",
        "canonicalUrl",
        "runtimeStatus",
        "createdByUserId",
        "createdAt",
        "updatedAt",
        "controls"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "app"
  ],
  "additionalProperties": false
}
Delivery
Standard response
Retry
Not declared idempotent
GET/v1/ws/{workspaceSlug}/apps/{appSlug}

Get one registered app by slug

Scope
ws:{workspaceSlug}:apps
Request
No JSON request body
Response
Response JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "app": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "workspaceId": {
          "type": "string"
        },
        "anchorId": {
          "type": "string"
        },
        "anchorPath": {
          "type": "string",
          "minLength": 1
        },
        "anchorState": {
          "type": "string",
          "enum": [
            "active",
            "broken",
            "orphaned"
          ]
        },
        "command": {
          "type": "string",
          "minLength": 1
        },
        "apiScopes": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "files:read",
              "files:write",
              "memory",
              "sessions",
              "agents",
              "services",
              "integrations",
              "apps",
              "share",
              "publish",
              "members"
            ]
          }
        },
        "installCommand": {
          "type": "string",
          "minLength": 1
        },
        "port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65535
        },
        "slug": {
          "type": "string"
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        },
        "icon": {
          "type": "string"
        },
        "visibility": {
          "type": "string",
          "enum": [
            "folder",
            "public"
          ]
        },
        "canonicalUrl": {
          "type": "string",
          "format": "uri"
        },
        "runtimeStatus": {
          "type": "string",
          "enum": [
            "reconciling",
            "reconciled",
            "reconcile_failed"
          ]
        },
        "reconciliationError": {
          "type": "string",
          "minLength": 1
        },
        "sourceShareId": {
          "type": "string"
        },
        "sourceShareMode": {
          "type": "string",
          "enum": [
            "read",
            "write"
          ]
        },
        "sourceAppId": {
          "type": "string"
        },
        "listingSubscriptionId": {
          "type": "string"
        },
        "disabledAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "disabledByUserId": {
          "type": "string"
        },
        "createdByUserId": {
          "type": "string"
        },
        "createdAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "updatedAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "controls": {
          "type": "object",
          "properties": {
            "updateRuntime": {
              "type": "boolean"
            },
            "makePublic": {
              "type": "boolean"
            },
            "makePrivate": {
              "type": "boolean"
            },
            "delete": {
              "type": "boolean"
            }
          },
          "required": [
            "updateRuntime",
            "makePublic",
            "makePrivate",
            "delete"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "id",
        "workspaceId",
        "anchorId",
        "anchorPath",
        "anchorState",
        "command",
        "apiScopes",
        "port",
        "slug",
        "visibility",
        "canonicalUrl",
        "runtimeStatus",
        "createdByUserId",
        "createdAt",
        "updatedAt",
        "controls"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "app"
  ],
  "additionalProperties": false
}
Delivery
Standard response
Retry
Not declared idempotent
PATCH/v1/ws/{workspaceSlug}/apps/{appSlug}

Update app display metadata or reconcile changed runtime settings

Scope
ws:{workspaceSlug}:apps
Request
Request JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "command": {
      "type": "string",
      "minLength": 1
    },
    "apiScopes": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "files:read",
          "files:write",
          "memory",
          "sessions",
          "agents",
          "services",
          "integrations",
          "apps",
          "share",
          "publish",
          "members"
        ]
      }
    },
    "installCommand": {
      "type": "string",
      "minLength": 1
    },
    "port": {
      "type": "integer",
      "minimum": 1,
      "maximum": 65535
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "icon": {
      "type": "string"
    }
  }
}
Response
Response JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "app": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "workspaceId": {
          "type": "string"
        },
        "anchorId": {
          "type": "string"
        },
        "anchorPath": {
          "type": "string",
          "minLength": 1
        },
        "anchorState": {
          "type": "string",
          "enum": [
            "active",
            "broken",
            "orphaned"
          ]
        },
        "command": {
          "type": "string",
          "minLength": 1
        },
        "apiScopes": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "files:read",
              "files:write",
              "memory",
              "sessions",
              "agents",
              "services",
              "integrations",
              "apps",
              "share",
              "publish",
              "members"
            ]
          }
        },
        "installCommand": {
          "type": "string",
          "minLength": 1
        },
        "port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65535
        },
        "slug": {
          "type": "string"
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        },
        "icon": {
          "type": "string"
        },
        "visibility": {
          "type": "string",
          "enum": [
            "folder",
            "public"
          ]
        },
        "canonicalUrl": {
          "type": "string",
          "format": "uri"
        },
        "runtimeStatus": {
          "type": "string",
          "enum": [
            "reconciling",
            "reconciled",
            "reconcile_failed"
          ]
        },
        "reconciliationError": {
          "type": "string",
          "minLength": 1
        },
        "sourceShareId": {
          "type": "string"
        },
        "sourceShareMode": {
          "type": "string",
          "enum": [
            "read",
            "write"
          ]
        },
        "sourceAppId": {
          "type": "string"
        },
        "listingSubscriptionId": {
          "type": "string"
        },
        "disabledAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "disabledByUserId": {
          "type": "string"
        },
        "createdByUserId": {
          "type": "string"
        },
        "createdAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "updatedAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "controls": {
          "type": "object",
          "properties": {
            "updateRuntime": {
              "type": "boolean"
            },
            "makePublic": {
              "type": "boolean"
            },
            "makePrivate": {
              "type": "boolean"
            },
            "delete": {
              "type": "boolean"
            }
          },
          "required": [
            "updateRuntime",
            "makePublic",
            "makePrivate",
            "delete"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "id",
        "workspaceId",
        "anchorId",
        "anchorPath",
        "anchorState",
        "command",
        "apiScopes",
        "port",
        "slug",
        "visibility",
        "canonicalUrl",
        "runtimeStatus",
        "createdByUserId",
        "createdAt",
        "updatedAt",
        "controls"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "app"
  ],
  "additionalProperties": false
}
Delivery
Standard response
Retry
Not declared idempotent
POST/v1/ws/{workspaceSlug}/apps/{appSlug}/reanchor

Repair a broken app anchor by slug after the automatic move rail cannot recover its folder

Scope
ws:{workspaceSlug}:apps
Request
Request JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "path": {
      "type": "string"
    }
  },
  "required": [
    "path"
  ]
}
Response
Response JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "app": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "workspaceId": {
          "type": "string"
        },
        "anchorId": {
          "type": "string"
        },
        "anchorPath": {
          "type": "string",
          "minLength": 1
        },
        "anchorState": {
          "type": "string",
          "enum": [
            "active",
            "broken",
            "orphaned"
          ]
        },
        "command": {
          "type": "string",
          "minLength": 1
        },
        "apiScopes": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "files:read",
              "files:write",
              "memory",
              "sessions",
              "agents",
              "services",
              "integrations",
              "apps",
              "share",
              "publish",
              "members"
            ]
          }
        },
        "installCommand": {
          "type": "string",
          "minLength": 1
        },
        "port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65535
        },
        "slug": {
          "type": "string"
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        },
        "icon": {
          "type": "string"
        },
        "visibility": {
          "type": "string",
          "enum": [
            "folder",
            "public"
          ]
        },
        "canonicalUrl": {
          "type": "string",
          "format": "uri"
        },
        "runtimeStatus": {
          "type": "string",
          "enum": [
            "reconciling",
            "reconciled",
            "reconcile_failed"
          ]
        },
        "reconciliationError": {
          "type": "string",
          "minLength": 1
        },
        "sourceShareId": {
          "type": "string"
        },
        "sourceShareMode": {
          "type": "string",
          "enum": [
            "read",
            "write"
          ]
        },
        "sourceAppId": {
          "type": "string"
        },
        "listingSubscriptionId": {
          "type": "string"
        },
        "disabledAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "disabledByUserId": {
          "type": "string"
        },
        "createdByUserId": {
          "type": "string"
        },
        "createdAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "updatedAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "controls": {
          "type": "object",
          "properties": {
            "updateRuntime": {
              "type": "boolean"
            },
            "makePublic": {
              "type": "boolean"
            },
            "makePrivate": {
              "type": "boolean"
            },
            "delete": {
              "type": "boolean"
            }
          },
          "required": [
            "updateRuntime",
            "makePublic",
            "makePrivate",
            "delete"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "id",
        "workspaceId",
        "anchorId",
        "anchorPath",
        "anchorState",
        "command",
        "apiScopes",
        "port",
        "slug",
        "visibility",
        "canonicalUrl",
        "runtimeStatus",
        "createdByUserId",
        "createdAt",
        "updatedAt",
        "controls"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "app"
  ],
  "additionalProperties": false
}
Delivery
Standard response
Retry
Not declared idempotent
POST/v1/ws/{workspaceSlug}/apps/{appSlug}/visibility

Make an app workspace-only or public

Scope
ws:{workspaceSlug}:apps
Request
Request JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "visibility": {
      "type": "string",
      "enum": [
        "folder",
        "public"
      ]
    }
  },
  "required": [
    "visibility"
  ]
}
Response
Response JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "app": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "workspaceId": {
          "type": "string"
        },
        "anchorId": {
          "type": "string"
        },
        "anchorPath": {
          "type": "string",
          "minLength": 1
        },
        "anchorState": {
          "type": "string",
          "enum": [
            "active",
            "broken",
            "orphaned"
          ]
        },
        "command": {
          "type": "string",
          "minLength": 1
        },
        "apiScopes": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "files:read",
              "files:write",
              "memory",
              "sessions",
              "agents",
              "services",
              "integrations",
              "apps",
              "share",
              "publish",
              "members"
            ]
          }
        },
        "installCommand": {
          "type": "string",
          "minLength": 1
        },
        "port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65535
        },
        "slug": {
          "type": "string"
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        },
        "icon": {
          "type": "string"
        },
        "visibility": {
          "type": "string",
          "enum": [
            "folder",
            "public"
          ]
        },
        "canonicalUrl": {
          "type": "string",
          "format": "uri"
        },
        "runtimeStatus": {
          "type": "string",
          "enum": [
            "reconciling",
            "reconciled",
            "reconcile_failed"
          ]
        },
        "reconciliationError": {
          "type": "string",
          "minLength": 1
        },
        "sourceShareId": {
          "type": "string"
        },
        "sourceShareMode": {
          "type": "string",
          "enum": [
            "read",
            "write"
          ]
        },
        "sourceAppId": {
          "type": "string"
        },
        "listingSubscriptionId": {
          "type": "string"
        },
        "disabledAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "disabledByUserId": {
          "type": "string"
        },
        "createdByUserId": {
          "type": "string"
        },
        "createdAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "updatedAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "controls": {
          "type": "object",
          "properties": {
            "updateRuntime": {
              "type": "boolean"
            },
            "makePublic": {
              "type": "boolean"
            },
            "makePrivate": {
              "type": "boolean"
            },
            "delete": {
              "type": "boolean"
            }
          },
          "required": [
            "updateRuntime",
            "makePublic",
            "makePrivate",
            "delete"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "id",
        "workspaceId",
        "anchorId",
        "anchorPath",
        "anchorState",
        "command",
        "apiScopes",
        "port",
        "slug",
        "visibility",
        "canonicalUrl",
        "runtimeStatus",
        "createdByUserId",
        "createdAt",
        "updatedAt",
        "controls"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "app"
  ],
  "additionalProperties": false
}
Delivery
Standard response
Retry
Declared idempotent
POST/v1/ws/{workspaceSlug}/apps/{appSlug}/disabled

Disable or re-enable a shared app replica

Scope
ws:{workspaceSlug}:apps
Request
Request JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "disabled": {
      "type": "boolean"
    }
  },
  "required": [
    "disabled"
  ]
}
Response
Response JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "app": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "workspaceId": {
          "type": "string"
        },
        "anchorId": {
          "type": "string"
        },
        "anchorPath": {
          "type": "string",
          "minLength": 1
        },
        "anchorState": {
          "type": "string",
          "enum": [
            "active",
            "broken",
            "orphaned"
          ]
        },
        "command": {
          "type": "string",
          "minLength": 1
        },
        "apiScopes": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "files:read",
              "files:write",
              "memory",
              "sessions",
              "agents",
              "services",
              "integrations",
              "apps",
              "share",
              "publish",
              "members"
            ]
          }
        },
        "installCommand": {
          "type": "string",
          "minLength": 1
        },
        "port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65535
        },
        "slug": {
          "type": "string"
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        },
        "icon": {
          "type": "string"
        },
        "visibility": {
          "type": "string",
          "enum": [
            "folder",
            "public"
          ]
        },
        "canonicalUrl": {
          "type": "string",
          "format": "uri"
        },
        "runtimeStatus": {
          "type": "string",
          "enum": [
            "reconciling",
            "reconciled",
            "reconcile_failed"
          ]
        },
        "reconciliationError": {
          "type": "string",
          "minLength": 1
        },
        "sourceShareId": {
          "type": "string"
        },
        "sourceShareMode": {
          "type": "string",
          "enum": [
            "read",
            "write"
          ]
        },
        "sourceAppId": {
          "type": "string"
        },
        "listingSubscriptionId": {
          "type": "string"
        },
        "disabledAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "disabledByUserId": {
          "type": "string"
        },
        "createdByUserId": {
          "type": "string"
        },
        "createdAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "updatedAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "controls": {
          "type": "object",
          "properties": {
            "updateRuntime": {
              "type": "boolean"
            },
            "makePublic": {
              "type": "boolean"
            },
            "makePrivate": {
              "type": "boolean"
            },
            "delete": {
              "type": "boolean"
            }
          },
          "required": [
            "updateRuntime",
            "makePublic",
            "makePrivate",
            "delete"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "id",
        "workspaceId",
        "anchorId",
        "anchorPath",
        "anchorState",
        "command",
        "apiScopes",
        "port",
        "slug",
        "visibility",
        "canonicalUrl",
        "runtimeStatus",
        "createdByUserId",
        "createdAt",
        "updatedAt",
        "controls"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "app"
  ],
  "additionalProperties": false
}
Delivery
Standard response
Retry
Declared idempotent
DELETE/v1/ws/{workspaceSlug}/apps/{appSlug}

Stop serving and unregister an app

Scope
ws:{workspaceSlug}:apps
Request
No JSON request body
Response
Response JSON schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "const": true
    }
  },
  "required": [
    "ok"
  ],
  "additionalProperties": false
}
Delivery
Standard response
Retry
Declared idempotent