Skip to main content

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

ParameterTypeRequiredDefaultDescription
statusstringNoFilter by status: pending, building, running, stopped, failed
environmentstringNoFilter by environment: development, staging, production
searchstringNoSearch by app name or description
limitintegerNo20Maximum number of results to return (1-100)
offsetintegerNo0Number of results to skip for pagination
sortstringNocreatedAt:descSort 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

FieldTypeRequiredDescription
namestringYesUnique app name (lowercase, hyphens allowed)
descriptionstringNoHuman-readable description
imagestringNoDocker image to deploy
portintegerNoContainer port to expose (default: 3000)
replicasintegerNoNumber of replicas (default: 1)
environmentstringNoTarget environment: development, staging, production
resourcesobjectNoCPU and memory resource limits
resources.cpustringNoCPU limit, e.g. "500m", "1"
resources.memorystringNoMemory limit, e.g. "256Mi", "1Gi"
projectIdstringNoProject to associate the app with
labelsobjectNoKey-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"
}

POST /api/v1/apps/upload

Create a new app and optionally attach a deployment bundle in a single multipart/form-data request. Either a name field or a file must be provided.

Scope: apps:write

Request (multipart/form-data)

FieldTypeRequiredDescription
filefileNoZip bundle containing the app source
namestringNoApp name (required if no file uploaded)
descriptionstringNoApp description
typestringNoApp type (e.g. web, api, worker)
frameworkstringNoFramework (e.g. react, express, flask)
runtimestringNoRuntime (e.g. node, python)
environmentstringNoJSON-encoded environment variables object
resourcesstringNoJSON-encoded resource limits object
metadatastringNoJSON-encoded extra metadata to merge into the app record

Response 201 Created

{
"id": "app_def456",
"name": "my-api-service",
"status": "pending",
"createdAt": "2025-02-01T09:00:00Z"
}

GET /api/v1/apps/:id

Retrieve a single app by its ID.

Scope: apps:read

Path Parameters

ParameterTypeRequiredDescription
idstringYesThe 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

ParameterTypeRequiredDescription
idstringYesThe app ID

Request Body

FieldTypeRequiredDescription
namestringNoUpdated app name
descriptionstringNoUpdated description
imagestringNoUpdated Docker image
portintegerNoUpdated container port
replicasintegerNoUpdated replica count
environmentstringNoUpdated environment
resourcesobjectNoUpdated resource limits
labelsobjectNoUpdated 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

ParameterTypeRequiredDescription
idstringYesThe 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

ParameterTypeRequiredDescription
idstringYesThe app ID

Request Body (optional)

FieldTypeRequiredDescription
imagestringNoOverride image for this deployment
replicasintegerNoOverride replica count for this deployment
environmentobjectNoAdditional environment variables
rollbackbooleanNoRoll 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/upload

Upload a new deployment bundle for an existing app and trigger a deploy. Accepts multipart/form-data with a required file field containing the zip bundle.

Scope: apps:deploy

Path Parameters

ParameterTypeRequiredDescription
idstringYesThe app ID

Request (multipart/form-data)

FieldTypeRequiredDescription
filefileYesZip bundle containing the new app source
descriptionstringNoUpdated description
environmentstringNoJSON-encoded environment variables for the deploy
capacity_typestringNoSet to spot to deploy on spot instances
useSpotInstancesstringNoSet to "true" as an alias for capacity_type=spot

Response 200 OK

Upload succeeded; deploy contains the deploy result. If the deploy step failed but upload succeeded, deployError is returned instead of deploy.

{
"id": "app_abc123",
"name": "my-web-app",
"deploy": {
"deploymentId": "deploy_789",
"status": "deploying"
}
}

POST /api/v1/apps/:id/start

Start a stopped app.

Scope: apps:deploy

Path Parameters

ParameterTypeRequiredDescription
idstringYesThe 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

ParameterTypeRequiredDescription
idstringYesThe 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

ParameterTypeRequiredDescription
idstringYesThe 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

ParameterTypeRequiredDescription
idstringYesThe 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

ParameterTypeRequiredDescription
idstringYesThe app ID

Query Parameters

ParameterTypeRequiredDefaultDescription
linesintegerNo100Number of log lines to return
sincestringNoReturn logs after this ISO 8601 timestamp
containerstringNoTarget 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

GET /api/v1/apps/:id/metrics

Get current resource utilization metrics for the app (CPU usage, memory usage, request counts, etc.).

Scope: apps:read

Path Parameters

ParameterTypeRequiredDescription
idstringYesThe app ID

Response 200 OK

{
"cpu": {
"usage": "120m",
"limit": "500m",
"percentage": 24.0
},
"memory": {
"usage": "256Mi",
"limit": "512Mi",
"percentage": 50.0
},
"requests": {
"total": 12450,
"rate": 12.3
},
"timestamp": "2025-01-20T14:22:00Z"
}

Error Responses

All endpoints may return the following error responses:

StatusDescription
400 Bad RequestInvalid request body or parameters
401 UnauthorizedMissing or invalid API key
403 ForbiddenInsufficient scope for the requested operation
404 Not FoundApp not found or not accessible
409 ConflictApp name already exists in the organization
422 Unprocessable EntityValidation error on request body
429 Too Many RequestsRate limit exceeded
500 Internal Server ErrorUnexpected server error
{
"error": {
"code": "not_found",
"message": "App with ID 'app_abc123' not found",
"status": 404
}
}