Skip to content

REST API Reference

All API endpoints are under the /v1 prefix. Protected endpoints require a valid JWT token in the Authorization: Bearer <token> header.

All protected endpoints require:

Authorization: Bearer <jwt-token>

All errors follow this structure:

{
"error": "Human-readable error message"
}
CodeMeaning
200Success
201Created
400Bad request (invalid input, missing fields)
401Unauthorized (missing or invalid token)
403Forbidden (insufficient permissions)
404Resource not found
409Conflict (duplicate resource)
500Internal server error

List endpoints support pagination via query parameters:

GET /v1/api/workflows?page=1&limit=20&sort=created_at&order=desc
ParameterDefaultDescription
page1Page number
limit20Items per page
sortcreated_atSort field
orderdescSort order (asc or desc)
searchSearch query string
MethodPathDescription
POST/v1/api/auth/registerRegister a new user
POST/v1/api/auth/loginLogin with email/password
POST/v1/api/auth/refreshRefresh an expired JWT token
GET/v1/api/auth/methodsGet available auth methods
GET/v1/api/auth/oauth/:provider/authorizeStart OAuth flow for a provider
GET/v1/api/auth/oauth/:provider/callbackOAuth callback handler
POST/v1/api/auth/oauth/exchangeExchange OAuth code for JWT

Register:

Terminal window
curl -X POST http://localhost:8080/v1/api/auth/register \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "password": "password123", "name": "John Doe"}'
// 201 Created
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": "65f1a2b3c4d5e6f7a8b9c0d1",
"name": "John Doe",
"email": "user@example.com",
"role": "user"
}
}

Login:

Terminal window
curl -X POST http://localhost:8080/v1/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "password": "password123"}'
// 200 OK
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": { "id": "...", "name": "John Doe", "email": "user@example.com", "role": "user" }
}

Error (invalid credentials):

// 401 Unauthorized
{ "error": "Invalid email or password" }
MethodPathDescription
GET/v1/api/profileGet current user profile
PUT/v1/api/profileUpdate user profile
MethodPathDescription
POST/v1/api/workflowsCreate a new workflow
GET/v1/api/workflowsList all workflows for the user
GET/v1/api/workflows/:idGet a specific workflow
PUT/v1/api/workflows/:idUpdate workflow metadata
DELETE/v1/api/workflows/:idDelete a workflow
POST/v1/api/workflows/:id/cloneClone a workflow
PUT/v1/api/workflows/:id/statusUpdate workflow status (draft/published/archived)
POST/v1/api/workflows/:id/saveSave nodes and edges without versioning
POST/v1/api/workflows/:id/runExecute the workflow (creates version + deploys)
GET/v1/api/workflows/:id/runsGet workflow execution history
GET/v1/api/workflows/:id/status/streamSSE stream for workflow execution status

Create a workflow:

Terminal window
curl -X POST http://localhost:8080/v1/api/workflows \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"name": "My App", "description": "Web application stack"}'
// 201 Created
{
"id": "65f1a2b3c4d5e6f7a8b9c0d1",
"name": "My App",
"description": "Web application stack",
"status": "draft",
"nodes": [],
"edges": [],
"created_at": "2026-03-24T10:00:00Z",
"updated_at": "2026-03-24T10:00:00Z"
}

Run a workflow:

Terminal window
curl -X POST http://localhost:8080/v1/api/workflows/<id>/run \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"cluster": "my-cluster", "namespace": "default"}'
// 200 OK
{
"run_id": "run_abc123",
"status": "deploying",
"version": 1
}
MethodPathDescription
GET/v1/api/workflows/:id/nodes/:nodeId/diagnosticsGet diagnostics for a node
GET/v1/api/workflows/:id/nodes/:nodeId/fix-template/:fixTypeGet auto-fix template
POST/v1/api/workflows/:id/nodes/:nodeId/fixApply auto-fix to a node
MethodPathDescription
GET/v1/api/workflows/:id/versionsList versions (paginated)
GET/v1/api/workflows/:id/versions/:versionGet a specific version
POST/v1/api/workflows/:id/versionsCreate a manual version
PUT/v1/api/workflows/:id/versions/:versionUpdate version metadata
POST/v1/api/workflows/:id/versions/:version/restoreRestore a previous version
GET/v1/api/workflows/:id/versions/compare?v1=X&v2=YCompare two versions
MethodPathDescription
POST/v1/api/clustersAdd a new cluster
GET/v1/api/clustersList all clusters
GET/v1/api/clusters/defaultGet the default cluster
GET/v1/api/clusters/:nameGet a specific cluster
PUT/v1/api/clusters/:nameUpdate a cluster
DELETE/v1/api/clusters/:nameRemove a cluster
PUT/v1/api/clusters/:name/defaultSet as default cluster
POST/v1/api/clusters/:name/testTest cluster connection
POST/v1/api/clusters/:name/refreshRefresh cluster metadata
GET/v1/api/clusters/:name/statusGet cluster status
GET/v1/api/clusters/:name/metricsGet cluster resource metrics
GET/v1/api/clusters/:name/logsGet cluster connection logs
PUT/v1/api/clusters/:name/credentialsUpdate cluster credentials
POST/v1/api/clusters/:name/shareShare cluster with another user

Add a cluster:

Terminal window
curl -X POST http://localhost:8080/v1/api/clusters \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "production",
"server": "https://k8s-api.example.com:6443",
"auth_type": "bearer_token",
"token": "eyJhbGciOi..."
}'
// 201 Created
{
"name": "production",
"server": "https://k8s-api.example.com:6443",
"status": "connected",
"version": "v1.28.0"
}

Test cluster connection:

Terminal window
curl -X POST http://localhost:8080/v1/api/clusters/production/test \
-H "Authorization: Bearer <token>"
// 200 OK
{ "status": "healthy", "version": "v1.28.0", "nodes": 3 }
MethodPathDescription
GET/v1/api/resourcesList tracked Kubernetes resources
POST/v1/api/resources/syncSync resources from Kubernetes
GET/v1/api/resources/:idGet a specific resource
PATCH/v1/api/resources/:idUpdate resource user fields
GET/v1/api/resources/:id/streamSSE stream for resource status
GET/v1/api/resources/:id/logs/streamSSE stream for pod logs
GET/v1/api/resources/:id/exec/terminalWebSocket terminal session
GET/v1/api/resources/:id/podsGet pods for a deployment
MethodPathDescription
POST/v1/api/builds/startStart a container image build
GET/v1/api/buildsList builds for current user
GET/v1/api/builds/:idGet build details
GET/v1/api/builds/:id/streamSSE stream for build logs
POST/v1/api/builds/:id/cancelCancel an in-progress build
MethodPathDescription
POST/v1/api/import/analyzeAnalyze an import source
POST/v1/api/import/uploadUpload a Docker Compose file
POST/v1/api/import/applyApply import to existing workflow
POST/v1/api/import/create-workflowCreate new workflow from import
GET/v1/api/import/:idGet import session status
GET/v1/api/import/:id/streamSSE stream for import progress
MethodPathDescription
GET/v1/api/templatesGet available resource templates
MethodPathDescription
GET/v1/api/pluginsList all plugins
GET/v1/api/plugins/enabledGet enabled plugins
GET/v1/api/plugins/categoriesGet plugin categories
GET/v1/api/plugins/:idGet plugin details
POST/v1/api/plugins/:id/enableEnable a plugin
POST/v1/api/plugins/:id/disableDisable a plugin
MethodPathDescription
GET/v1/api/registriesList container registries
GET/v1/api/registries/lookup?image=...Find registry for an image
GET/v1/api/registries/:idGet registry details
MethodPathDescription
POST/v1/api/admin/registriesCreate a registry
PUT/v1/api/admin/registries/:idUpdate a registry
DELETE/v1/api/admin/registries/:idDelete a registry
POST/v1/api/admin/registries/:id/testTest registry connection
PUT/v1/api/admin/registries/:id/defaultSet default registry
MethodPathDescription
GET/v1/api/dashboard/recent-workflowsGet recent workflows
GET/v1/api/dashboard/statsGet dashboard statistics
MethodPathDescription
GET/v1/api/search?q=...Global search across entities
MethodPathDescription
GET/v1/api/settings/invite-codeGet current invite code
POST/v1/api/settings/generate-invite-codeGenerate new invite code
GET/v1/api/settings/regenerate-settingGet auto-regenerate setting
PUT/v1/api/settings/regenerate-settingUpdate auto-regenerate setting