---
title: "Site drill-down head (metadata + moderation state)"
method: GET
path: "/stats/sites/{id}"
tags: ["Stats"]
---

# Site drill-down head (metadata + moderation state)

`GET /stats/sites/{id}`

## Request

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

Admin-only detail for one site: subdomain + URL, lifecycle and suspension state, owning account with plan, the creating user, custom domains, content rollups from the live manifest, and the number of open abuse reports naming the site. The visitor analytics are served separately by `GET /stats/sites/:id/analytics`.

## Path parameters

- `id` string, required

## Response `200`

- APIAdminSiteDetail
  - `id` string, required: Site id (UUID).
  - `subdomain` string, required: Subdomain on the public host.
  - `url` string, required: Public URL of the site.
  - `status` 'pending' | 'awaiting_verification' | 'live' | 'inactive' | 'suspended', required: Lifecycle status.
  - `suspendedReason` 'billing' | 'abuse' | 'duplicate' | 'expired', nullable, required: Why the site is suspended — null whenever status is not `suspended`.
  - `createdAt` string, required: Creation time (ISO 8601).
  - `accountId` string, required: Owning account id (UUID).
  - `accountName` string, nullable, required: Owning account name.
  - `accountKind` 'personal' | 'organization', nullable, required: Owning account kind.
  - `plan` 'free' | 'basic' | 'pro' | 'max', required: The account’s subscription tier (`free` when none).
  - `createdByUserId` string, nullable, required: User who created the site — null when the creator left the account.
  - `createdByName` string, nullable, required: Creator display name.
  - `createdByEmail` string, nullable, required: Creator email.
  - `createdByRiskScore` number, nullable, required: Creator's advisory risk score (ADR 0049); null when not flagged, or when an admin reviewed their cluster as not a problem (ADR 0055).
  - `createdByRiskLevel` 'high' | 'medium' | 'low', nullable, required: Creator's advisory risk level; null when not flagged.
  - `customDomains` APIAdminSiteDomain[], required: Custom domains attached to the site.
    - `hostname` string, required: The custom hostname.
    - `status` 'pending_dns' | 'pending_ssl' | 'active' | 'failed' | 'disabled', required: Provisioning status.
    - `failureReason` string, nullable, required: Why provisioning failed; null unless the domain failed.
    - `verifiedAt` string, nullable, required: When the domain became active (ISO 8601); null until then.
  - `passwordProtected` boolean, required: Whether the site is password-protected.
  - `searchIndexable` boolean, required: Whether search engines may index the site.
  - `analyticsEnabled` boolean, required: Whether visitor analytics are enabled.
  - `showBannerOverride` boolean, nullable, required: Admin-only override of the plan-driven "Made with Nippy" banner — null follows the plan, true/false force it on/off.
  - `fileCount` number, required: Files in the current live manifest (0 when never published).
  - `totalBytes` number, required: Bytes in the current live manifest (0 when never published).
  - `versionCount` number, required: Number of published versions.
  - `lastPublishedAt` string, nullable, required: Time of the latest publish (ISO 8601) — null when never published.
  - `openReportsCount` number, required: Open abuse reports naming this site.

## Other responses

- `403`: Admin access required
- `404`: Site not found

---

[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)
