Apps
Apps are deployable services running on the Dooor OS runtime - web apps, APIs, background workers, or scheduled cron jobs connected to a Git repository. Each app manages its own build pipeline, resource limits, custom domains, and traffic routing.
CORTEXDB_CONNECTION and HARBOR_PROJECT - are injected into the container so your code can route AI calls through Harbor with zero setup. See Harbor.List Apps
/workspaces/{wsId}/appsReturns a paginated list of apps deployed in the given workspace. Results can be filtered by type, status, or a search query.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| page | integer | optional | Page number starting at 1. Default: 1 |
| limit | integer | optional | Items per page. Default: 20, max: 100 |
| type | string | optional | Filter by app type: web | api | worker | cron |
| status | string | optional | Filter by status: active | deploying | failed | build_failed | disabled | stopped |
| search | string | optional | Full-text search on app name |
Response
{
"data": [
{
"id": "app_01hx...",
"name": "my-api",
"slug": "my-api",
"status": "active",
"type": "api",
"url": "https://my-api.os-develop.dooor.ai",
"gitRepoUrl": "https://github.com/org/my-api",
"gitBranch": "main",
"createdAt": "2025-01-15T10:00:00Z"
}
],
"meta": {
"total": 12,
"page": 1,
"limit": 20,
"totalPages": 1
}
}curl -X GET "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps?page=1&limit=20" \
-H "Authorization: Bearer dor_sk_your_key_here"Create App
/workspaces/{wsId}/appsCreates a new app in the workspace. Supply a Git repository URL and the platform will automatically detect the runtime and build configuration. Set autoDeploy to trigger a build immediately on every push to the configured branch.
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | Human-readable display name for the app |
| slug | string | required | URL-safe unique identifier within the workspace. Used for the default subdomain. |
| description | string | optional | Optional description of the app |
| type | string | optional | App runtime type: web | api | worker | cron. Default: web |
| gitRepoUrl | string | optional | HTTPS URL of the Git repository (e.g. https://github.com/org/repo) |
| gitBranch | string | optional | Branch to build and deploy from. Default: main |
| gitInstallationId | string | optional | GitHub App installation ID, required for private repositories |
| dockerfilePath | string | optional | Relative path to Dockerfile within the repo. Omit to use Nixpacks auto-detection. |
| autoDeploy | boolean | optional | Automatically trigger a deploy on every push to the configured branch. Default: false |
| cpuLimitMillicores | integer | optional | CPU limit in millicores (1000 = 1 vCPU). Range: 50-32000 |
| memoryLimitMi | integer | optional | Memory limit in mebibytes. Range: 64-131072 |
| releaseCommand | string | optional | Shell command executed once after a successful build before traffic is routed (e.g. database migrations) |
| visibility | string | optional | Access visibility: public | private. Default: private |
| minReplicas | integer | optional | Minimum number of running replicas. Minimum: 1. Default: 1 |
| maxReplicas | integer | optional | Maximum replicas for horizontal autoscaling. Must be >= minReplicas. |
| cpuTargetUtilization | integer | optional | Target CPU utilization percentage that triggers autoscaling. Range: 1-100 |
Response
{
"id": "app_01hx...",
"name": "my-api",
"slug": "my-api",
"status": "stopped",
"type": "api",
"url": "https://my-api.os-develop.dooor.ai",
"gitRepoUrl": "https://github.com/org/my-api",
"gitBranch": "main",
"autoDeploy": true,
"cpuLimitMillicores": 500,
"memoryLimitMi": 512,
"minReplicas": 1,
"maxReplicas": 3,
"createdAt": "2025-04-17T12:00:00Z",
"updatedAt": "2025-04-17T12:00:00Z"
}curl -X POST "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps" \
-H "Authorization: Bearer dor_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "my-api",
"slug": "my-api",
"type": "api",
"gitRepoUrl": "https://github.com/org/my-api",
"gitBranch": "main",
"autoDeploy": true,
"cpuLimitMillicores": 500,
"memoryLimitMi": 512
}'Get App
/workspaces/{wsId}/apps/{appId}Retrieves full details for a single app, including its latest deployment status and environment configuration.
Response
{
"id": "app_01hx...",
"name": "my-api",
"slug": "my-api",
"status": "active",
"type": "api",
"url": "https://my-api.os-develop.dooor.ai",
"gitRepoUrl": "https://github.com/org/my-api",
"gitBranch": "main",
"dockerfilePath": null,
"autoDeploy": true,
"releaseCommand": "npx prisma migrate deploy",
"cpuLimitMillicores": 500,
"memoryLimitMi": 512,
"minReplicas": 1,
"maxReplicas": 3,
"cpuTargetUtilization": 70,
"latestDeployment": {
"id": "dep_01hx...",
"status": "succeeded",
"gitCommitSha": "a1b2c3d",
"gitCommitMessage": "fix: handle null response",
"createdAt": "2025-04-16T09:00:00Z"
},
"createdAt": "2025-01-15T10:00:00Z",
"updatedAt": "2025-04-16T09:05:00Z"
}curl -X GET "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}" \
-H "Authorization: Bearer dor_sk_your_key_here"Update App
/workspaces/{wsId}/apps/{appId}Updates one or more fields of an existing app. Only the fields provided in the request body are modified - all other fields remain unchanged.
Request Body
All fields are optional. Accepts the same fields as Create App.
Example
curl -X PATCH "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}" \
-H "Authorization: Bearer dor_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"gitBranch": "production",
"autoDeploy": false,
"cpuLimitMillicores": 1000,
"memoryLimitMi": 1024
}'Delete App
/workspaces/{wsId}/apps/{appId}Soft-deletes the app. Running deployments are stopped and the app is removed from routing, but data is retained for audit purposes.
/workspaces/{wsId}/apps/{appId}/permanentPermanently deletes the app and all associated deployments, environment variables, and domain records. This action cannot be undone.
Example
# Soft delete
curl -X DELETE "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}" \
-H "Authorization: Bearer dor_sk_your_key_here"
# Permanent delete
curl -X DELETE "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}/permanent" \
-H "Authorization: Bearer dor_sk_your_key_here"App Stats
/workspaces/{wsId}/apps/statsReturns aggregate counts of apps grouped by status for the workspace. Useful for building summary dashboards.
Response
{
"total": 12,
"active": 7,
"deploying": 1,
"failed": 2,
"stopped": 2
}curl -X GET "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/stats" \
-H "Authorization: Bearer dor_sk_your_key_here"Pipeline State
/workspaces/{wsId}/apps/{appId}/pipeline-stateReturns a structured snapshot of the app's current pipeline across all stages: source, build, deploy, Harbor integration, and runtime health.
Response
{
"source": {
"status": "ok",
"gitRepo": "github.com/org/my-api",
"branch": "main",
"lastCommitSha": "a1b2c3d",
"lastCommitMessage": "fix: handle null response"
},
"build": {
"status": "succeeded",
"buildpack": "nixpacks",
"imageTag": "sha256:abc123...",
"durationSeconds": 47
},
"deploy": {
"status": "succeeded",
"deployedAt": "2025-04-16T09:05:00Z",
"revisionName": "my-api-00005"
},
"harbor": {
"status": "active",
"guardsEnabled": true,
"lastEvalAt": "2025-04-17T08:00:00Z"
},
"runtime": {
"status": "healthy",
"readyReplicas": 2,
"totalReplicas": 2,
"cpuUsageMillicores": 120,
"memoryUsageMi": 210
},
"overallStatus": "active"
}curl -X GET "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}/pipeline-state" \
-H "Authorization: Bearer dor_sk_your_key_here"Public Shares
Public share links give external users access to an app without requiring a Dooor account. Each link can carry an optional expiry date and authentication requirement.
/workspaces/{wsId}/apps/{appId}/public-sharesCreates a new public share link for the app.
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| expiresAt | string (ISO 8601) | optional | Optional expiration timestamp. Link never expires if omitted. |
| requireAuth | boolean | optional | Require the viewer to sign in with a Dooor account before accessing the share. Default: false |
Example
# Create share link
curl -X POST "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}/public-shares" \
-H "Authorization: Bearer dor_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{"expiresAt": "2025-12-31T23:59:59Z", "requireAuth": false}'
# List share links
curl -X GET "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}/public-shares" \
-H "Authorization: Bearer dor_sk_your_key_here"
# Revoke a share link
curl -X DELETE "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}/public-shares/{shareId}" \
-H "Authorization: Bearer dor_sk_your_key_here"/workspaces/{wsId}/apps/{appId}/public-sharesReturns all active public share links for the app.
/workspaces/{wsId}/apps/{appId}/public-shares/{shareId}Revokes a share link immediately. Any existing viewers using this link will lose access.
Custom Domains
Custom domains let you serve your app from your own domain instead of the default *.os-develop.dooor.ai subdomain. Dooor OS automatically provisions and renews TLS certificates via cert-manager and Let's Encrypt.
CNAME record pointing to ingress.os-develop.dooor.ai. Propagation can take up to 48 hours depending on your DNS provider's TTL settings./workspaces/{wsId}/apps/{appId}/domainsAdds a custom domain to the app.
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| domain | string | required | Fully qualified domain name (e.g. api.example.com) |
| targetPort | integer | optional | Container port to route traffic to. Defaults to the app's configured port. |
Example
# Add a custom domain
curl -X POST "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}/domains" \
-H "Authorization: Bearer dor_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{"domain": "api.example.com", "targetPort": 3000}'
# List custom domains
curl -X GET "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}/domains" \
-H "Authorization: Bearer dor_sk_your_key_here"
# Verify DNS for a domain
curl -X POST "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}/domains/{domainId}/verify" \
-H "Authorization: Bearer dor_sk_your_key_here"
# Remove a custom domain
curl -X DELETE "https://os-develop.dooor.ai/api/v1/workspaces/{wsId}/apps/{appId}/domains/{domainId}" \
-H "Authorization: Bearer dor_sk_your_key_here"/workspaces/{wsId}/apps/{appId}/domainsLists all custom domains configured for the app, including their verification and TLS status.
Response
[
{
"id": "dom_01hx...",
"domain": "api.example.com",
"targetPort": 3000,
"verified": true,
"tlsStatus": "active",
"createdAt": "2025-04-10T08:00:00Z"
}
]/workspaces/{wsId}/apps/{appId}/domains/{domainId}/verifyTriggers a DNS verification check for the domain. Returns the updated verification status.
/workspaces/{wsId}/apps/{appId}/domains/{domainId}Removes a custom domain from the app and deletes the associated TLS certificate.