Suspend a team (opens a suspension case)
const url = 'https://api.deploybase.eu/api/v1/api/v1/admin/teams/example/suspend';const options = { method: 'POST', headers: {Authorization: '<Authorization>', 'Content-Type': 'application/json'}, body: '{"class":"phishing","confirmed_transferee_ids":["example"],"reason":"Phishing kit imitating a bank login at /secure/login","subject_user_ids":["example"]}'};
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/suspend \ --header 'Authorization: <Authorization>' \ --header 'Content-Type: application/json' \ --data '{ "class": "phishing", "confirmed_transferee_ids": [ "example" ], "reason": "Phishing kit imitating a bank login at /secure/login", "subject_user_ids": [ "example" ] }'Opens a suspension case and takes the team offline: sign-in, the API and API keys are refused, every site, preview, share link, custom domain, serverless function and form endpoint stops serving, and the team is emailed a statement of reasons carrying the reason verbatim. Nothing is deleted, so unsuspend restores the account as it was.
class is required. The cascade classes (phishing, malware, spam_network, illegal_content) need subject_user_ids: members of this team held responsible. Every other team a subject owns is suspended too, with a notice that never names this team, unless it has other owners, a paid or comped plan, or the subject became owner of this team by transfer in the last 90 days: those teams are held (they keep serving, deploys are paused) for review. A transferee listed in confirmed_transferee_ids is confirmed responsible and classified like any other subject (recorded on the case). The subjects cannot open new accounts while the case is open. copyright, payment and other suspend this team only and refuse subject_user_ids.
When the team already has an open case (case_created false): with the same class, new subjects are merged and their teams cascade, failed rows are retried and a team unsuspend of this team is undone; a single-team case given a cascade class is escalated in place (case_escalated, the original reason stays); any other class is 409 CASE_ALREADY_OPEN. The flat fields are this team’s suspend outcome: check complete, and when false hostnames_still_online. A team that could not be suspended is never a 200 (500 ORIGIN_NOT_SUSPENDED).
Authorizations
Section titled “ Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “ Path Parameters ”Team ID (UUID)
Request Body
Section titled “ Request Body ”Class, reason (sent to the team verbatim) and responsible people
object
Example
phishingExample
Phishing kit imitating a bank login at /secure/loginResponses
Section titled “ Responses ”OK
object
object
object
object
Escalation evidence: set when an open single-team case was escalated in place to a cascade class. Class/Cascades are the new values; EscalatedFrom is the class it had, Reason stays the original statement and EscalationReason is the escalating admin’s.
OpenedByEmail is resolved at read time for the admin view; never stored.
object
ConfirmedTransferee: the person became owner of the origin by a recent transfer (T1) and the admin confirmed them responsible anyway; their teams were classified like any subject’s.
Email is resolved at read time from the person’s memberships for the admin view; the case stores only the hash.
object
CaseCreated is false when the origin already had an open case: the request was applied to it (new subjects merged, failed rows retried, a lifted origin re-armed).
CaseEscalated is true when that open case was single-team and this request escalated it to the cascade class (case.escalated_from holds the class it had).
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.
Example
{ "data": { "case": { "class": "phishing", "escalated_from": "phishing" } }}Malformed body or ID
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_ALREADY_OPEN (details.case_id) or CASE_CLOSED
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}CLASS_REQUIRED, INVALID_CLASS, INVALID_REASON, TOO_MANY_SUBJECTS, SUBJECTS_REQUIRED, SUBJECTS_FORBIDDEN, SUBJECT_NOT_IN_ORIGIN or INVALID_TRANSFEREE_CONFIRMATION
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}ORIGIN_NOT_SUSPENDED (details.case_id, details.state) or INTERNAL_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