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
| Name | Type | Required | Description |
|---|---|---|---|
tenant_id | string | Yes | The tenant identifier. |
Request body
Content type application/json (required).
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | 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: |
reason | string, nullable | No | Reason for the lifecycle action (required for terminate and suspend). Max length: 2000 |
plan | string, nullable | No | Target plan identifier — required when action is "change_plan". |
modules | array of string, nullable | No | 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.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | No | Unique lifecycle request identifier. |
tenant_id | string | No | |
action | string | No | One of: |
status | string | No | One of: |
requested_by | string | No | Email of the admin who created the request. |
reason | string, nullable | No | |
plan | string, nullable | No | |
approved_by | string, nullable | No | Email of the approving admin. |
decision_comment | string, nullable | No | |
created_at | string (date-time) | No | |
actioned_at | string (date-time), nullable | No |
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}'