Skip to content

Create lifecycle request

POST/tenants/{tenant_id}/lifecycle-requests

Creates a tenant lifecycle request for actions that require dual-approval before execution: suspend, unsuspend, terminate, or change_plan. The request enters a pending state and must be approved via the /approve endpoint. Use when platform policy requires a second admin to authorise destructive tenant operations.

Request

Path parameters

NameTypeRequiredDescription
tenant_idstringYes

The tenant identifier.

Request body

Content type application/json (required).

FieldTypeRequiredDescription
actionstringYes

The lifecycle action to request. "suspend" — disables all tenant user logins. "unsuspend" — re-enables a suspended tenant. "terminate" — permanently deactivates the tenant (irreversible). "change_plan" — migrates the tenant to a different module plan.

One of: "suspend", "unsuspend", "terminate", "change_plan"

reasonstring, nullableNo

Reason for the lifecycle action (required for terminate and suspend).

Max length: 2000

planstring, nullableNo

Target plan identifier — required when action is "change_plan".

modulesarray of string, nullableNo

Specific module slugs to include with the plan change, if overriding plan defaults.

Example

{
  "action": "suspend",
  "reason": "Non-payment — invoice INV-2026-0312 overdue by 45 days.",
  "plan": null,
  "modules": null
}

Responses

201 Lifecycle request created and awaiting approval

Content type application/json, object · LifecycleRequestV1.

FieldTypeRequiredDescription
idstringNo

Unique lifecycle request identifier.

tenant_idstringNo
actionstringNo

One of: "suspend", "unsuspend", "terminate", "change_plan"

statusstringNo

One of: "pending", "approved", "rejected", "executed", "failed"

requested_bystringNo

Email of the admin who created the request.

reasonstring, nullableNo
planstring, nullableNo
approved_bystring, nullableNo

Email of the approving admin.

decision_commentstring, nullableNo
created_atstring (date-time)No
actioned_atstring (date-time), nullableNo

Example

{
  "id": "lr_01HXQ2P8R4S",
  "tenant_id": "acme",
  "action": "suspend",
  "status": "pending",
  "requested_by": "admin@faciotech.com",
  "reason": "Non-payment — invoice INV-2026-0312 overdue by 45 days.",
  "created_at": "2026-04-08T14:00:00Z"
}

404 Tenant not found

422 Validation failed — check action enum or plan value

Example request

Paths are relative to the control-plane API base URL ($BASE_URL below).

curl -X POST "$BASE_URL/tenants/{tenant_id}/lifecycle-requests" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"action": "suspend", "reason": "Non-payment — invoice INV-2026-0312 overdue by 45 days.", "plan": null, "modules": null}'
Loading