---
title: "Inspect what would block account deletion"
method: GET
path: "/account/deletion-preview"
tags: ["Account"]
---

# Inspect what would block account deletion

`GET /account/deletion-preview`

## Request

- Base URL: `https://api.percher.run`
- URL: `https://api.percher.run/account/deletion-preview`
- Auth: HTTP bearer

Pure-read blocker inspection — returns the same `DeletionPreview` shape that `DELETE /account` uses internally to gate the request. Owner-only. Never 4xx for blocker state: a clean account returns 200 with `{ canDelete: true, ownedAppCount: 0, blockers: [] }`, the dashboard renders an empty 'Nothing blocking — ready to delete' state. Auth still applies though — missing/invalid tokens get 401, and a caller whose own account is already in delete pipeline gets 403 `ACCOUNT_DELETION_IN_PROGRESS` from the auth-middleware before reaching this handler.

Blocker kinds: `apps_owned`, `apps_with_collaborators` (accepted + non-expired only), `apps_with_pending_invites` (live invites only), `apps_with_active_pr_previews`, `pending_outgoing_transfers` (live), `deploys_in_progress`, `active_restore_jobs`. Each blocker carries `kind`, `count`, and up to 25 `details` entries (`{ appId?, appName?, ref? }`) for UI rendering. Stale-pending transfers are filtered via `expires_at > now` in the SELECT predicate and are NOT mutated by the preview call.

## Response `200`

DeletionPreview JSON

## Other responses

- `401`: Unauthorized
- `403`: Account already in delete pipeline (`ACCOUNT_DELETION_IN_PROGRESS` from auth-middleware).

---

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