---
title: "Forms across every customer site"
method: GET
path: "/stats/forms"
tags: ["Stats"]
---

# Forms across every customer site

`GET /stats/forms`

## Request

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

Admin-only paginated directory of every form Nippy has discovered, with its reply count and recency, the site it sits on, and the owning account, plan and email. Filterable by search, plan, capture state and whether any replies have arrived; sortable by recency, reply count, first-seen time or name. Carries no reply contents — this is an index of where replies are accumulating, not of what they say.

## Query parameters

- `search` string
- `plan` 'free' | 'basic' | 'pro' | 'max'
- `captureEnabled` boolean
- `hasReplies` boolean
- `sort` 'lastReply' | 'replies' | 'created' | 'name'
- `sortDir` 'asc' | 'desc'
- `page` number
- `pageSize` number

## Response `200`

- APIPaginatedAdminFormsResponse
  - `data` APIAdminForm[], required
    - `id` string, required: Form UUID
    - `siteId` string, required: Site UUID the form was found on
    - `subdomain` string, required: Site subdomain
    - `siteUrl` string, required: Public URL of the site
    - `siteStatus` 'pending' | 'awaiting_verification' | 'live' | 'inactive' | 'suspended', required: Lifecycle state of the site
    - `accountId` string, required: Owning account UUID
    - `accountName` string, nullable, required: Owning account name, or null
    - `ownerEmail` string, nullable, required: Email of the user who created the site, or null
    - `plan` 'free' | 'basic' | 'pro' | 'max', required: The account's plan tier (`free` when unsubscribed)
    - `ownerUnlocked` boolean, required: Whether the account's plan includes reading reply contents. False means the owner is looking at masked rows in their own dashboard.
    - `name` string, required: Display name of the form
    - `pagePath` string, required: Path of the page the form appears on
    - `fieldLabels` string[], required: Field labels as last seen, in the order they appear
    - `captureEnabled` boolean, required: Whether replies to this form are being stored
    - `siteCaptureEnabled` boolean, required: Whether the site-wide capture switch is on
    - `submissionCount` number, required: Number of replies stored for this form
    - `lastSubmissionAt` string, nullable, required: ISO timestamp of the most recent reply, or null
    - `createdAt` string, required: ISO timestamp the form was first seen
  - `page` number, required
  - `pageSize` number, required
  - `total` number, required
  - `totalPages` number, required

## Other responses

- `403`: Admin access required

---

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