Apps
Manage containerized applications on the Strongly platform. Deploy, scale, start, stop, and monitor your apps programmatically.
All endpoints require a valid API key with the appropriate apps:* scope.
Base URL: https://<your-instance>/api/v1
App Object
{
"id": "app_abc123",
"name": "my-web-app",
"description": "Production web application",
"status": "running",
"image": "node:18-alpine",
"port": 3000,
"replicas": 2,
"environment": "production",
"resources": {
"cpu": "500m",
"memory": "512Mi"
},
"url": "https://my-web-app.strongly.ai",
"organizationId": "org_xyz789",
"projectId": "proj_456",
"labels": {
"team": "backend",
"version": "2.1.0"
},
"owner": {
"id": "user_001",
"email": "dev@example.com"
},
"permissions": {
"isPublic": false,
"allowedUsers": ["user_002", "user_003"]
},
"createdAt": "2025-01-15T10:30:00Z",
"updatedAt": "2025-01-20T14:22:00Z"
}
GET /api/v1/apps
List all apps accessible to the authenticated user.
Scope: apps:read
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
status | string | No | — | Filter by status: pending, building, running, stopped, failed |
environment | string | No | — | Filter by environment: development, staging, production |
search | string | No | — | Search by app name or description |
limit | integer | No | 20 | Maximum number of results to return (1-100) |
offset | integer | No | 0 | Number of results to skip for pagination |
sort | string | No | createdAt:desc | Sort field and direction, e.g. name:asc, updatedAt:desc |
Response 200 OK
{
"data": [
{
"id": "app_abc123",
"name": "my-web-app",
"description": "Production web application",
"status": "running",
"image": "node:18-alpine",
"port": 3000,
"replicas": 2,
"environment": "production",
"resources": {
"cpu": "500m",
"memory": "512Mi"
},
"url": "https://my-web-app.strongly.ai",
"organizationId": "org_xyz789",
"projectId": "proj_456",
"labels": {},
"owner": {
"id": "user_001",
"email": "dev@example.com"
},
"permissions": {
"isPublic": false,
"allowedUsers": []
},
"createdAt": "2025-01-15T10:30:00Z",
"updatedAt": "2025-01-20T14:22:00Z"
}
],
"pagination": {
"total": 42,
"limit": 20,
"offset": 0,
"hasMore": true
}
}
POST /api/v1/apps
Create a new application.
Scope: apps:write
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Unique app name (lowercase, hyphens allowed) |
description | string | No | Human-readable description |
image | string | No | Docker image to deploy |
port | integer | No | Container port to expose (default: 3000) |
replicas | integer | No | Number of replicas (default: 1) |
environment | string | No | Target environment: development, staging, production |
resources | object | No | CPU and memory resource limits |
resources.cpu | string | No | CPU limit, e.g. "500m", "1" |
resources.memory | string | No | Memory limit, e.g. "256Mi", "1Gi" |
projectId | string | No | Project to associate the app with |
labels | object | No | Key-value labels for organization |
{
"name": "my-api-service",
"description": "REST API backend service",
"image": "my-registry.io/api-service:latest",
"port": 8080,
"replicas": 2,
"environment": "production",
"resources": {
"cpu": "1",
"memory": "1Gi"
},
"projectId": "proj_456",
"labels": {
"team": "backend"
}
}
Response 201 Created
{
"id": "app_def456",
"name": "my-api-service",
"description": "REST API backend service",
"status": "pending",
"image": "my-registry.io/api-service:latest",
"port": 8080,
"replicas": 2,
"environment": "production",
"resources": {
"cpu": "1",
"memory": "1Gi"
},
"url": null,
"organizationId": "org_xyz789",
"projectId": "proj_456",
"labels": {
"team": "backend"
},
"owner": {
"id": "user_001",
"email": "dev@example.com"
},
"permissions": {
"isPublic": false,
"allowedUsers": []
},
"createdAt": "2025-02-01T09:00:00Z",
"updatedAt": "2025-02-01T09:00:00Z"
}
GET /api/v1/apps/:id
Retrieve a single app by its ID.
Scope: apps:read
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The app ID |
Response 200 OK
{
"id": "app_abc123",
"name": "my-web-app",
"description": "Production web application",
"status": "running",
"image": "node:18-alpine",
"port": 3000,
"replicas": 2,
"environment": "production",
"resources": {
"cpu": "500m",
"memory": "512Mi"
},
"url": "https://my-web-app.strongly.ai",
"organizationId": "org_xyz789",
"projectId": "proj_456",
"labels": {
"team": "backend",
"version": "2.1.0"
},
"owner": {
"id": "user_001",
"email": "dev@example.com"
},
"permissions": {
"isPublic": false,
"allowedUsers": ["user_002"]
},
"createdAt": "2025-01-15T10:30:00Z",
"updatedAt": "2025-01-20T14:22:00Z"
}
PUT /api/v1/apps/:id
Update an existing app. Only provided fields are updated.
Scope: apps:write
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The app ID |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Updated app name |
description | string | No | Updated description |
image | string | No | Updated Docker image |
port | integer | No | Updated container port |
replicas | integer | No | Updated replica count |
environment | string | No | Updated environment |
resources | object | No | Updated resource limits |
labels | object | No | Updated labels (replaces all labels) |
{
"replicas": 4,
"resources": {
"cpu": "2",
"memory": "2Gi"
},
"labels": {
"team": "backend",
"version": "2.2.0"
}
}
Response 200 OK
{
"id": "app_abc123",
"name": "my-web-app",
"description": "Production web application",
"status": "running",
"image": "node:18-alpine",
"port": 3000,
"replicas": 4,
"environment": "production",
"resources": {
"cpu": "2",
"memory": "2Gi"
},
"url": "https://my-web-app.strongly.ai",
"organizationId": "org_xyz789",
"projectId": "proj_456",
"labels": {
"team": "backend",
"version": "2.2.0"
},
"owner": {
"id": "user_001",
"email": "dev@example.com"
},
"permissions": {
"isPublic": false,
"allowedUsers": ["user_002"]
},
"createdAt": "2025-01-15T10:30:00Z",
"updatedAt": "2025-02-01T11:45:00Z"
}
DELETE /api/v1/apps/:id
Permanently delete an app and all associated resources.
Scope: apps:write
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The app ID |
Response 204 No Content
No response body.
POST /api/v1/apps/:id/deploy
Deploy or redeploy the app to the platform infrastructure.
Scope: apps:deploy
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The app ID |
Request Body (optional)
| Field | Type | Required | Description |
|---|---|---|---|
image | string | No | Override image for this deployment |
replicas | integer | No | Override replica count for this deployment |
environment | object | No | Additional environment variables |
rollback | boolean | No | Roll back to the previous deployment |
{
"image": "my-registry.io/api-service:v2.3.0",
"replicas": 3,
"environment": {
"LOG_LEVEL": "info"
}
}
Response 200 OK
{
"message": "Deployment initiated",
"deploymentId": "deploy_789",
"status": "deploying",
"appId": "app_abc123"
}
POST /api/v1/apps/:id/start
Start a stopped app.
Scope: apps:deploy
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The app ID |
Response 200 OK
{
"message": "App starting",
"appId": "app_abc123",
"status": "starting"
}
POST /api/v1/apps/:id/stop
Stop a running app. All replicas are scaled to zero.
Scope: apps:deploy
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The app ID |
Response 200 OK
{
"message": "App stopping",
"appId": "app_abc123",
"status": "stopping"
}
POST /api/v1/apps/:id/restart
Restart all replicas of a running app with a rolling restart.
Scope: apps:deploy
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The app ID |
Response 200 OK
{
"message": "App restarting",
"appId": "app_abc123",
"status": "restarting"
}
GET /api/v1/apps/:id/status
Get the real-time runtime status of an app.
Scope: apps:read
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The app ID |
Response 200 OK
{
"state": "running",
"message": "All replicas healthy",
"replicas": 3,
"readyReplicas": 3,
"url": "https://my-web-app.strongly.ai"
}
GET /api/v1/apps/:id/logs
Retrieve recent logs from the app containers.
Scope: apps:read
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The app ID |
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
lines | integer | No | 100 | Number of log lines to return |
since | string | No | — | Return logs after this ISO 8601 timestamp |
container | string | No | — | Target a specific container by name |
Response 200 OK
2025-01-20T14:22:01Z [INFO] Server started on port 3000
2025-01-20T14:22:02Z [INFO] Connected to database
2025-01-20T14:22:05Z [INFO] Health check passed
2025-01-20T14:23:00Z [INFO] Incoming request: GET /api/health
Error Responses
All endpoints may return the following error responses:
| Status | Description |
|---|---|
400 Bad Request | Invalid request body or parameters |
401 Unauthorized | Missing or invalid API key |
403 Forbidden | Insufficient scope for the requested operation |
404 Not Found | App not found or not accessible |
409 Conflict | App name already exists in the organization |
422 Unprocessable Entity | Validation error on request body |
429 Too Many Requests | Rate limit exceeded |
500 Internal Server Error | Unexpected server error |
{
"error": {
"code": "not_found",
"message": "App with ID 'app_abc123' not found",
"status": 404
}
}