Skip to main content

Stacks API

Manage Infrastructure as Code deployments via the API.

Overview

Stacks provide declarative deployment of complete application stacks including:

  • Infrastructure resources (databases, namespaces, storage)
  • Secrets management (Vault integration)
  • Bootstrap jobs (migrations, seeds)
  • Service deployments (Helm charts, manifests)

List Stacks

GET /v1/stacks

Query Parameters:

ParameterTypeDescription
statusstringFilter by status: pending, deploying, active, failed
tenantstringFilter by tenant ID

Response:

{
"data": [
{
"id": "stk_abc123",
"name": "my-application",
"tenant": "acme-corp",
"status": "active",
"version": 3,
"phase": "services",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T11:00:00Z"
}
],
"meta": {
"total": 1,
"page": 1,
"per_page": 20
}
}

Get Stack

GET /v1/stacks/:id

Response:

{
"data": {
"id": "stk_abc123",
"name": "my-application",
"tenant": "acme-corp",
"status": "active",
"version": 3,
"phase": "services",
"template": {
"version": "1",
"name": "my-application",
"resources": {...},
"secrets": {...},
"bootstrap": {...},
"services": {...}
},
"resources": [
{
"type": "database",
"name": "database",
"id": "db_xyz789",
"status": "active"
}
],
"outputs": {
"api_endpoint": "https://api.my-app.sparbz.cloud",
"database_host": "db-xyz789.postgres.sparbz.cloud"
},
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T11:00:00Z"
}
}

Create Stack

POST /v1/stacks

Request Body:

{
"name": "my-application",
"tenant": "acme-corp",
"template": {
"version": "1",
"name": "my-application",

"resources": {
"database": {
"type": "database",
"properties": {
"engine": "postgres",
"version": "15",
"storage_size": "10Gi"
}
},
"cache": {
"type": "valkey",
"properties": {
"memory": "256Mi"
}
}
},

"secrets": {
"db_password": {
"type": "generated",
"generator_type": "password",
"length": 32
},
"api_key": {
"type": "generated",
"generator_type": "token",
"length": 64
}
},

"bootstrap": {
"migrate": {
"image": "myapp/migrations:v1.0.0",
"command": ["./migrate", "up"],
"secrets": {
"DATABASE_URL": "${resources.database.connection_string}"
},
"timeout": "10m"
}
},

"services": {
"backend": {
"type": "helm",
"depends_on": ["migrate"],
"properties": {
"chart": "oci://registry.sparbz.cloud/charts/backend",
"version": "1.0.0",
"values": {
"replicas": 3
}
}
}
},

"outputs": {
"api_endpoint": {
"value": "${services.backend.endpoint}"
}
}
}
}

Response: 201 Created

{
"data": {
"id": "stk_abc123",
"name": "my-application",
"status": "pending",
"version": 1
}
}

Update Stack

PUT /v1/stacks/:id

Updates the stack template. Changes are not applied until apply is called.

Request Body:

{
"template": {
"version": "1",
"name": "my-application",
"services": {
"backend": {
"type": "helm",
"properties": {
"chart": "oci://registry.sparbz.cloud/charts/backend",
"version": "1.1.0",
"values": {
"replicas": 5
}
}
}
}
}
}

Response:

{
"data": {
"id": "stk_abc123",
"status": "pending",
"version": 4,
"pending_changes": true
}
}

Delete Stack

DELETE /v1/stacks/:id

Query Parameters:

ParameterTypeDescription
destroy_resourcesbooleanAlso destroy provisioned resources (default: false)

Response: 204 No Content

Plan Changes

GET /v1/stacks/:id/plan

Preview what changes will be made when the stack is applied.

Response:

{
"data": {
"changes": [
{
"type": "update",
"resource": "services.backend",
"details": {
"replicas": {
"old": 3,
"new": 5
},
"version": {
"old": "1.0.0",
"new": "1.1.0"
}
}
}
],
"summary": {
"create": 0,
"update": 1,
"delete": 0
}
}
}

Apply Stack

POST /v1/stacks/:id/apply

Apply pending changes to the stack.

Request Body (optional):

{
"dry_run": false,
"force": false
}

Response:

{
"data": {
"execution_id": "exec_xyz789",
"status": "running",
"phase": "infrastructure",
"started_at": "2024-01-15T11:00:00Z"
}
}

Get Execution Status

GET /v1/stacks/:id/executions/:execution_id

Response:

{
"data": {
"execution_id": "exec_xyz789",
"status": "completed",
"phases": [
{
"name": "infrastructure",
"status": "completed",
"started_at": "2024-01-15T11:00:00Z",
"completed_at": "2024-01-15T11:02:00Z"
},
{
"name": "secrets",
"status": "completed",
"started_at": "2024-01-15T11:02:00Z",
"completed_at": "2024-01-15T11:02:30Z"
},
{
"name": "bootstrap",
"status": "completed",
"started_at": "2024-01-15T11:02:30Z",
"completed_at": "2024-01-15T11:05:00Z"
},
{
"name": "services",
"status": "completed",
"started_at": "2024-01-15T11:05:00Z",
"completed_at": "2024-01-15T11:07:00Z"
}
],
"started_at": "2024-01-15T11:00:00Z",
"completed_at": "2024-01-15T11:07:00Z"
}
}

Destroy Stack

POST /v1/stacks/:id/destroy

Destroy all resources provisioned by the stack.

Request Body (optional):

{
"dry_run": false,
"force": false
}

Response:

{
"data": {
"execution_id": "exec_destroy123",
"status": "running",
"phase": "services",
"started_at": "2024-01-15T12:00:00Z"
}
}

Get Outputs

GET /v1/stacks/:id/outputs

Response:

{
"data": {
"outputs": {
"api_endpoint": {
"value": "https://api.my-app.sparbz.cloud",
"sensitive": false
},
"database_host": {
"value": "db-xyz789.postgres.sparbz.cloud",
"sensitive": false
},
"db_password": {
"value": "********",
"sensitive": true,
"vault_path": "secret/data/stacks/stk_abc123/db_password"
}
}
}
}

List Secrets

GET /v1/stacks/:id/secrets

Response:

{
"data": {
"secrets": [
{
"name": "db_password",
"type": "generated",
"vault_path": "secret/data/stacks/stk_abc123/db_password",
"created_at": "2024-01-15T11:02:00Z"
},
{
"name": "api_key",
"type": "generated",
"vault_path": "secret/data/stacks/stk_abc123/api_key",
"created_at": "2024-01-15T11:02:00Z"
}
]
}
}

List Bootstrap Jobs

GET /v1/stacks/:id/jobs

Response:

{
"data": {
"jobs": [
{
"name": "migrate",
"status": "completed",
"exit_code": 0,
"started_at": "2024-01-15T11:02:30Z",
"completed_at": "2024-01-15T11:05:00Z"
}
]
}
}

Get Job Logs

GET /v1/stacks/:id/jobs/:name/logs

Response:

{
"data": {
"logs": "Running migrations...\nApplied migration 001_create_users\nApplied migration 002_create_posts\nMigrations complete."
}
}