---
title: "Suspend a site for abuse, or lift an abuse suspension"
method: PATCH
path: "/stats/sites/{id}/suspension"
tags: ["Stats"]
---

# Suspend a site for abuse, or lift an abuse suspension

`PATCH /stats/sites/{id}/suspension`

## Request

- Base URL: `https://api.nippy.host`
- URL: `https://api.nippy.host/stats/sites/{id}/suspension`
- Auth: `bearer` (a scheme the document does not define)

Admin-only moderation switch. Suspending moves a `live` or `inactive` site to `suspended` with an `abuse` reason and republishes the edge record so the worker serves 451 on every hostname. Restoring only applies to `abuse` suspensions (billing holds lift automatically on re-upgrade) and returns the site to `live`. Both directions record a site.suspended / site.restored activity attributed to the acting admin.

## Path parameters

- `id` string, required

## Request body

- UpdateSiteSuspensionDto
  - `suspended` boolean, required: true suspends the site for abuse (worker serves 451 on every hostname); false lifts an abuse suspension and returns the site to `live`. Billing suspensions cannot be lifted here — they clear automatically on re-upgrade.

## Response `200`

- APIAdminSiteSuspension
  - `id` string, required: Site id (UUID).
  - `status` 'pending' | 'awaiting_verification' | 'live' | 'inactive' | 'suspended', required: Lifecycle status after the change.
  - `suspendedReason` 'billing' | 'abuse' | 'duplicate' | 'expired', nullable, required: Suspension reason after the change.

## Other responses

- `403`: Admin access required
- `404`: Site not found
- `409`: Site is in a state the action does not apply to (already suspended, not suspended, billing-suspended, or not yet published)

---

[API](https://skmtc.dev/nippy/apis/nippy-backend-api.md) · [All operations](https://skmtc.dev/nippy/apis/nippy-backend-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nippy/apis/nippy-backend-api/revisions/7ab23f040a55?raw)
