Services API
The Services API manages the full lifecycle of deployed services: creation, deployment, lifecycle control, monitoring, and deletion.
List Services
GET /api/services
Returns a paginated list of services.
Query Parameters:
| Parameter | Description |
|---|---|
page | Page number (default: 1) |
per_page | Items per page (default: 20, max: 100) |
status | Filter by status: running, stopped, deploying, failed |
customer_id | Filter by customer ID |
sort | Sort by: name, status, created_at, updated_at |
order | Sort order: asc, desc |
search | Search by service name |
Request:
curl https://panel.example.com/api/services?status=running&per_page=10 \
-H "Authorization: Bearer aap_k1_..."
Response: 200 OK
{
"data": [
{
"id": "svc_abc123",
"name": "my-app",
"status": "running",
"url": "https://my-app.panel.example.com",
"customer_id": "cust_def456",
"template": "uptime-kuma",
"deploy_method": "template",
"created_at": "2026-03-29T10:00:00Z",
"updated_at": "2026-03-29T10:05:00Z",
"resources": {
"cpu_usage": 0.15,
"memory_usage_mb": 128,
"memory_limit_mb": 512
}
}
],
"total": 42,
"page": 1,
"per_page": 10
}
Get Service
GET /api/services/:id
Returns detailed information about a single service.
Request:
curl https://panel.example.com/api/services/svc_abc123 \
-H "Authorization: Bearer aap_k1_..."
Response: 200 OK
{
"id": "svc_abc123",
"name": "my-app",
"status": "running",
"url": "https://my-app.panel.example.com",
"customer_id": "cust_def456",
"customer_name": "Acme Corp",
"template": "uptime-kuma",
"deploy_method": "template",
"compose": "version: '3.8'\nservices:\n ...",
"variables": {
"SERVICE_NAME": "my-app"
},
"custom_domains": [],
"resources": {
"cpu_usage": 0.15,
"cpu_limit": 1.0,
"memory_usage_mb": 128,
"memory_limit_mb": 512,
"storage_mb": 256
},
"health": {
"status": "healthy",
"last_check": "2026-03-29T14:30:00Z",
"consecutive_failures": 0
},
"created_at": "2026-03-29T10:00:00Z",
"updated_at": "2026-03-29T10:05:00Z",
"deployed_at": "2026-03-29T10:05:00Z"
}
Create and Deploy Service
POST /api/services
Creates and deploys a new service. The request body varies by deployment method.
Template Deploy
curl -X POST https://panel.example.com/api/services \
-H "Authorization: Bearer aap_k1_..." \
-H "Content-Type: application/json" \
-d '{
"name": "my-app",
"customer_id": "cust_def456",
"deploy_method": "template",
"template_id": "uptime-kuma",
"variables": {
"SERVICE_NAME": "my-app"
}
}'
Git Deploy
curl -X POST https://panel.example.com/api/services \
-H "Authorization: Bearer aap_k1_..." \
-H "Content-Type: application/json" \
-d '{
"name": "my-project",
"customer_id": "cust_def456",
"deploy_method": "git",
"git_url": "https://github.com/user/repo.git",
"git_branch": "main"
}'
Compose Deploy
curl -X POST https://panel.example.com/api/services \
-H "Authorization: Bearer aap_k1_..." \
-H "Content-Type: application/json" \
-d '{
"name": "custom-app",
"customer_id": "cust_def456",
"deploy_method": "compose",
"compose": "version: '\''3.8'\''\nservices:\n app:\n image: myapp:latest"
}'
AI Deploy
curl -X POST https://panel.example.com/api/services \
-H "Authorization: Bearer aap_k1_..." \
-H "Content-Type: application/json" \
-d '{
"name": "auto-app",
"customer_id": "cust_def456",
"deploy_method": "ai",
"ai_url": "https://github.com/user/repo"
}'
Response: 201 Created
{
"id": "svc_new789",
"name": "my-app",
"status": "deploying",
"url": "https://my-app.panel.example.com",
"deploy_job_id": "job_xyz456"
}
The service starts in deploying status. Monitor progress via WebSocket or poll the service endpoint.
Service Lifecycle
Start Service
POST /api/services/:id/start
curl -X POST https://panel.example.com/api/services/svc_abc123/start \
-H "Authorization: Bearer aap_k1_..."
Response: 200 OK
{
"id": "svc_abc123",
"status": "running",
"message": "Service started"
}
Stop Service
POST /api/services/:id/stop
curl -X POST https://panel.example.com/api/services/svc_abc123/stop \
-H "Authorization: Bearer aap_k1_..."
Response: 200 OK
{
"id": "svc_abc123",
"status": "stopped",
"message": "Service stopped"
}
Restart Service
POST /api/services/:id/restart
curl -X POST https://panel.example.com/api/services/svc_abc123/restart \
-H "Authorization: Bearer aap_k1_..."
Response: 200 OK
{
"id": "svc_abc123",
"status": "running",
"message": "Service restarted"
}
Redeploy Service
POST /api/services/:id/redeploy
Pulls the latest image and redeploys. For Git-deployed services, pulls the latest commit.
curl -X POST https://panel.example.com/api/services/svc_abc123/redeploy \
-H "Authorization: Bearer aap_k1_..."
Response: 200 OK
{
"id": "svc_abc123",
"status": "deploying",
"deploy_job_id": "job_xyz789"
}
Delete Service
DELETE /api/services/:id
Stops the service, removes containers, deletes volumes, and cleans up DNS records.
curl -X DELETE https://panel.example.com/api/services/svc_abc123 \
-H "Authorization: Bearer aap_k1_..."
Response: 204 No Content
This action is irreversible. All service data and volumes are permanently deleted.
Service Logs
GET /api/services/:id/logs
Returns recent container logs.
Query Parameters:
| Parameter | Description |
|---|---|
tail | Number of lines from the end (default: 100) |
since | RFC3339 timestamp to start from |
follow | Set to true for streaming (upgrades to WebSocket) |
Request:
curl "https://panel.example.com/api/services/svc_abc123/logs?tail=50" \
-H "Authorization: Bearer aap_k1_..."
Response: 200 OK
{
"logs": [
{
"timestamp": "2026-03-29T14:30:00Z",
"stream": "stdout",
"message": "Server started on port 3001"
},
{
"timestamp": "2026-03-29T14:30:01Z",
"stream": "stdout",
"message": "Health check endpoint ready"
}
]
}
Real-Time Log Streaming
For real-time logs, use the WebSocket endpoint:
wss://panel.example.com/api/services/svc_abc123/logs?follow=true
Each WebSocket message is a JSON log entry.
Service Events
GET /api/services/:id/events
Returns the event timeline for a service (deploys, restarts, health changes).
curl "https://panel.example.com/api/services/svc_abc123/events" \
-H "Authorization: Bearer aap_k1_..."
Response: 200 OK
{
"data": [
{
"type": "deploy",
"status": "success",
"message": "Deployed from template uptime-kuma",
"timestamp": "2026-03-29T10:05:00Z"
},
{
"type": "health",
"status": "healthy",
"message": "Health check passed",
"timestamp": "2026-03-29T10:05:30Z"
}
]
}