Restore a suspended team
const url = 'https://api.deploybase.eu/api/v1/api/v1/admin/teams/example/unsuspend';const options = {method: 'POST', headers: {Authorization: '<Authorization>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.deploybase.eu/api/v1/api/v1/admin/teams/example/unsuspend \ --header 'Authorization: <Authorization>'Lifts a suspension: the Zitadel organization is reactivated, every disabled Edge Rule is switched back on, each custom domain’s pull zone is re-pointed at its live deployment, the team’s HTTP functions are redeployed, and the team is emailed an all-clear. Safe to re-run.
For a team in an open suspension case, its row in every open case is lifted (lifted_rows, and per row row_outcomes); the cases themselves and their freezes stay open until lifted with POST /admin/suspension-cases/{id}/lift. A held team is released this way too. A row whose restore failed or is incomplete stays suspended (complete false); unsuspend again to retry it.
Authorizations
Section titled “ Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “ Path Parameters ”Team ID (UUID)
Responses
Section titled “ Responses ”OK
object
object
object
Complete is true only when every step above succeeded: no error field set, no project error or unprocessed project, no failed purge. The admin UI shows a success toast only then; anything else is a red “incomplete” report and a Re-run button (DEP-774). The handler always answers 200 with the outcome, so this flag is the one thing to check.
HostnamesStillOnline gathers every hostname, across projects and the final purge, that may still be serving: its pointer survived, its zone could not be purged, or its cache could not be evicted. Suspend only. Re-running the suspension retries all of them.
object
object
HostnamesStillOnline are this project’s hostnames whose take-down step still failed after its retries. Suspend only.
Production is one of: “disabled”, “restored”, “no_rule” (the project has no production Edge Rule to touch), “no_live_deployment” (nothing to restore it to), “not_processed: …” (the context budget ran out first), or “error: …”.
RowOutcomes is what lifting each open-case row did; an unsuspend_failed or unsuspend_incomplete row stays suspended and is retried by unsuspending again.
object
Complete is false for unsuspend_incomplete and unsuspend_failed.
From is the row’s state when the lift acted on it.
Restore is the unsuspend report when this lift ran one.
object
Complete is true only when every step above succeeded: no error field set, no project error or unprocessed project, no failed purge. The admin UI shows a success toast only then; anything else is a red “incomplete” report and a Re-run button (DEP-774). The handler always answers 200 with the outcome, so this flag is the one thing to check.
HostnamesStillOnline gathers every hostname, across projects and the final purge, that may still be serving: its pointer survived, its zone could not be purged, or its cache could not be evicted. Suspend only. Re-running the suspension retries all of them.
object
HostnamesStillOnline are this project’s hostnames whose take-down step still failed after its retries. Suspend only.
Production is one of: “disabled”, “restored”, “no_rule” (the project has no production Edge Rule to touch), “no_live_deployment” (nothing to restore it to), “not_processed: …” (the context budget ran out first), or “error: …”.
Suspended is the team’s state AFTER the call.
TransitionedNow is whether THIS call moved the flag. False on a re-run, which is also what keeps the statement of reasons from being sent twice.
Suspended is the team’s state AFTER the call.
TransitionedNow is whether THIS call moved the flag. False on a re-run, which is also what keeps the statement of reasons from being sent twice.
Example generated
{ "data": { "complete": true, "functions_error": "example", "functions_reconciled": true, "hostnames_purged": 1, "hostnames_still_online": [ "example" ], "lifted_rows": [ { "case_id": "example", "decided_at": "example", "hold_reason": "example", "id": "example", "last_error": "example", "owner_count": 1, "plan_at_decision": "example", "resolved_at": "example", "resolved_by": "example", "role": "example", "state": "example", "suspended_by_case": true, "team_id": "example", "team_name": "example", "via_user_id": "example" } ], "notification_error": "example", "notification_sent": true, "projects": [ { "domains_processed": 1, "errors": [ "example" ], "hostnames_still_online": [ "example" ], "previews_processed": 1, "production": "example", "project_id": "example", "project_slug": "example", "shares_processed": 1 } ], "purge_errors": [ "example" ], "row_outcomes": [ { "case_id": "example", "complete": true, "error": "example", "from": "example", "restore": { "complete": true, "functions_error": "example", "functions_reconciled": true, "hostnames_purged": 1, "hostnames_still_online": [ "example" ], "notification_error": "example", "notification_sent": true, "projects": [ { "domains_processed": 1, "errors": [ "example" ], "hostnames_still_online": [ "example" ], "previews_processed": 1, "production": "example", "project_id": "example", "project_slug": "example", "shares_processed": 1 } ], "purge_errors": [ "example" ], "ssr_functions_error": "example", "ssr_functions_reconciled": true, "suspended": true, "transitioned_now": true, "zitadel_error": "example", "zitadel_org_deactivated": true }, "result": "example", "team_id": "example", "team_name": "example" } ], "ssr_functions_error": "example", "ssr_functions_reconciled": true, "suspended": true, "transitioned_now": true, "zitadel_error": "example", "zitadel_org_deactivated": true }, "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Bad Request
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Unauthorized
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Forbidden
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Not Found
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}CASE_TEAM_STATE: an open case still wants the team suspended
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Internal Server Error
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Service Unavailable
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Live 022265e7 built