# Session endpoints (Client API: account)

> 20 FeatherPanel Client API: account endpoints from user/session.php: methods, paths, auth, permissions, rate limits, parameters and responses.

Source: https://featherpanel.com/docs/api/reference/user/session/

Defined in [`backend/app/routes/user/session.php`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php). Authentication used here: **Signed-in user**. Read [Authentication](https://featherpanel.com/docs/api/authentication/) for how to send credentials and [Rate limits and errors](https://featherpanel.com/docs/api/rate-limits-and-errors/) for the response envelope.

Paths, methods, permissions and rate limits come from the route file. Summaries, parameters and response codes come from the OpenAPI annotations on the controllers; endpoints without annotations show only what the route file declares.

## Endpoints

### GET `/api/user/session`

- Auth: Signed-in user
- Default rate limit: 60 / minute (`user-session`)
- Route name: `session`
- Controller: [`SessionController::get`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/SessionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L27)

**Get user session** Retrieve current user session information including user details, permissions, activities, and mail data.

Response data: [`SessionResponse`](https://featherpanel.com/docs/api/schemas/#schema-sessionresponse)

| Response `data` field | Type | Description |
| --- | --- | --- |
| `user_info` | object | User information |
| `permissions` | string\[\] | User permissions |
| `preferences` | UserPreferences |  |

```bash
curl -X GET "$PANEL_URL/api/user/session" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Session information retrieved successfully · `400` Bad request - Invalid authentication token · `401` Unauthorized - User not authenticated · `500` Internal server error - Failed to retrieve session

### PATCH `/api/user/session`

- Auth: Signed-in user
- Default rate limit: 30 / minute (`user-session`)
- Route name: `session-update`
- Controller: [`SessionController::put`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/SessionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L38)

**Update user session** Update user profile information including username, email, password, avatar, and 2FA settings. Includes CloudFlare Turnstile validation if enabled.

Request body: [`SessionUpdateRequest`](https://featherpanel.com/docs/api/schemas/#schema-sessionupdaterequest) (application/json) · Response data: [`SessionUpdateResponse`](https://featherpanel.com/docs/api/schemas/#schema-sessionupdateresponse)

| Body field | Type | Required | Description |
| --- | --- | --- | --- |
| `username` | string | no | Username (alphanumeric and underscores only) |
| `email` | string (email) | no | User email address |
| `first_name` | string | no | User first name |
| `last_name` | string | no | User last name |
| `password` | string | no | User password |
| `avatar` | string (uri) | no | Avatar URL (must start with https://) |
| `ticket_signature` | string | no | Ticket signature (supports Markdown) |
| `two_fa_enabled` | boolean | no | Two-factor authentication enabled status |
| `turnstile_token` | string | no | CloudFlare Turnstile token (required if Turnstile is enabled) |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `message` | string | Success message |

```bash
curl -X PATCH "$PANEL_URL/api/user/session" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"username":"","email":"","first_name":"","last_name":"","password":"","avatar":"","ticket_signature":"","two_fa_enabled":false,"turnstile_token":""}'
```

Plugin events: [`featherpanel:auth:email:changed`](https://featherpanel.com/docs/plugins/events/auth/#auth-email-changed), [`featherpanel:auth:password:changed`](https://featherpanel.com/docs/plugins/events/auth/#auth-password-changed), [`featherpanel:user:update`](https://featherpanel.com/docs/plugins/events/user/#user-update)

Responses: `200` Session updated successfully · `400` Bad request - Invalid authentication token, request data, field validation, Turnstile validation failed, or Turnstile keys not set · `409` Conflict - Username or email already exists · `500` Internal server error - Failed to update session

### POST `/api/user/avatar`

- Auth: Signed-in user
- Default rate limit: 5 / minute (`user-session`)
- Route name: `avatar-upload`
- Controller: [`SessionController::uploadAvatar`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/SessionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L49)

**Upload user avatar** Upload a new avatar image for the current user. Accepts image files up to 5MB in size.

| Body field | Type | Required | Description |
| --- | --- | --- | --- |
| `avatar` | string (binary) | yes | Avatar image file |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `success` | boolean | Success status |
| `message` | string | Success message |
| `avatar_url` | string | URL to the uploaded avatar |

```bash
curl -X POST "$PANEL_URL/api/user/avatar" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -F "avatar=@./file"
```

Responses: `200` Avatar uploaded successfully · `400` Bad request - Invalid file, file too large, or invalid authentication · `500` Internal server error - Failed to save avatar

### GET `/api/user/preferences`

- Auth: Signed-in user
- Route name: `preferences-get`
- Controller: [`SessionController::getPreferences`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/SessionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L60)

**Get user preferences** Retrieve current user UI/UX preferences including theme, language, sidebar state, and other settings.

Response data: [`PreferencesResponse`](https://featherpanel.com/docs/api/schemas/#schema-preferencesresponse)

| Response `data` field | Type | Description |
| --- | --- | --- |
| `preferences` | UserPreferences |  |

```bash
curl -X GET "$PANEL_URL/api/user/preferences" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Preferences retrieved successfully · `400` Bad request - Invalid authentication token · `401` Unauthorized - User not authenticated

### PATCH `/api/user/preferences`

- Auth: Signed-in user
- Default rate limit: 30 / minute (`user-session`)
- Route name: `preferences-update`
- Controller: [`SessionController::updatePreferences`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/SessionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L69)

**Update user preferences** Update current user UI/UX preferences. Any preference fields can be provided and will be merged with existing preferences.

Request body: [`UserPreferences`](https://featherpanel.com/docs/api/schemas/#schema-userpreferences) (application/json)

| Body field | Type | Required | Description |
| --- | --- | --- | --- |
| `timezone` | string | no | IANA timezone identifier used for date rendering; null means browser default |
| `favorite_server_uuids` | string (uuid)\[\] | no | Pinned server UUIDs (max 50) |
| `hide_server_ips` | boolean | no | Mask server IP addresses in the panel UI for this account only |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `preferences` | UserPreferences |  |
| `message` | string | Success message |

```bash
curl -X PATCH "$PANEL_URL/api/user/preferences" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"timezone":"","favorite_server_uuids":[],"hide_server_ips":false}'
```

Responses: `200` Preferences updated successfully · `400` Bad request - Invalid authentication token or request data · `401` Unauthorized - User not authenticated · `500` Internal server error - Failed to update preferences

### GET `/api/user/notification-settings`

- Auth: Signed-in user
- Route name: `notification-settings-get`
- Controller: [`NotificationSettingsController::get`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/NotificationSettingsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L80)

**Get email and Discord notification settings**

```bash
curl -X GET "$PANEL_URL/api/user/notification-settings" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Settings retrieved

### PUT `/api/user/notification-settings`

- Auth: Signed-in user
- Default rate limit: 30 / minute (`user-session`)
- Route name: `notification-settings-update`
- Controller: [`NotificationSettingsController::update`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/NotificationSettingsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L89)

**Save email and Discord notification settings**

```bash
curl -X PUT "$PANEL_URL/api/user/notification-settings" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Settings saved · `400` Invalid webhook URL

### POST `/api/user/notification-settings/test-discord`

- Auth: Signed-in user
- Default rate limit: 5 / minute (`user-session`)
- Route name: `notification-settings-test-discord`
- Controller: [`NotificationSettingsController::testDiscord`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/NotificationSettingsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L100)

**Send a test message to the saved Discord webhook**

```bash
curl -X POST "$PANEL_URL/api/user/notification-settings/test-discord" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Test sent

### GET `/api/user/preferences/ui`

- Auth: Signed-in user
- Default rate limit: 60 / minute (`user-ui-preferences`)
- Route name: `preferences-ui`
- Controller: [`UiPreferencesController::get`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/UiPreferencesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L111)

**Get synced UI state** Browser UI state stored for the current user, keyed by storage key. Each entry has its value (null when removed) and the server time in milliseconds it was written.

```bash
curl -X GET "$PANEL_URL/api/user/preferences/ui" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` UI state retrieved · `401` Unauthorized

### PATCH `/api/user/preferences/ui`

- Auth: Signed-in user
- Default rate limit: 60 / minute (`user-ui-preferences`)
- Route name: `preferences-ui-update`
- Controller: [`UiPreferencesController::update`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/UiPreferencesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L122)

**Save changed UI state entries** Merges the given entries into the stored UI state. Send {"entries": {"key": "value"}}; a null value removes the key.

```bash
curl -X PATCH "$PANEL_URL/api/user/preferences/ui" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` UI state saved · `400` Invalid entries · `413` UI state too large

### POST `/api/user/data-request`

- Auth: Signed-in user
- Default rate limit: 2 / minute (`user-session`)
- Route name: `data-request-create`
- Controller: [`SessionController::requestDataExport`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/SessionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L133)

**Request account data export** Create a support ticket requesting a personal data export for the authenticated user.

```bash
curl -X POST "$PANEL_URL/api/user/data-request" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Plugin events: [`featherpanel:ticket:created`](https://featherpanel.com/docs/plugins/events/ticket/#ticket-created)

Responses: `201` Data request ticket created successfully · `400` Bad request - Missing ticket configuration · `401` Unauthorized - User not authenticated · `403` Forbidden - Ticket system disabled or open ticket limit reached · `500` Internal server error - Failed to create request

### GET `/api/user/mails`

- Auth: Signed-in user
- Default rate limit: 30 / minute (`user-session`)
- Route name: `mails-get`
- Controller: [`SessionController::getMails`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/SessionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L144)

**Get user mails with pagination** Retrieve paginated mail list for the current user with optional search functionality.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `page` | query | integer | no | Page number (default: 1) |
| `limit` | query | integer | no | Number of records per page (default: 10, max: 100) |
| `search` | query | string | no | Search query to filter mails by subject or body |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `mails` | object\[\] | Array of mail items |
| `pagination` | object |  |
| `search` | object |  |

```bash
curl -X GET "$PANEL_URL/api/user/mails" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Mails retrieved successfully · `400` Bad request - Invalid authentication token · `401` Unauthorized - User not authenticated · `500` Internal server error - Failed to retrieve mails

### POST `/api/user/mails/{id}/resend`

- Auth: Signed-in user
- Default rate limit: 10 / minute (`user-session`)
- Route name: `mails-resend`
- Controller: [`SessionController::resendMail`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/SessionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L155)

**Resend a failed email** Re-queue a failed system email for delivery to the current user.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | yes | Mail list entry ID |

```bash
curl -X POST "$PANEL_URL/api/user/mails/$ID/resend" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Email queued for resend · `400` Bad request - Mail cannot be resent or SMTP disabled · `401` Unauthorized - User not authenticated · `404` Mail not found · `500` Internal server error - Failed to resend mail

### GET `/api/user/activities`

- Auth: Signed-in user
- Route name: `activities-get`
- Controller: [`SessionController::getActivities`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/SessionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L171)

**Get user activities with pagination** Retrieve paginated activity list for the current user with optional search functionality.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `page` | query | integer | no | Page number (default: 1) |
| `limit` | query | integer | no | Number of records per page (default: 10, max: 100) |
| `search` | query | string | no | Search query to filter activities by name, context, or IP address |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `activities` | object\[\] | Array of activity items |
| `pagination` | object |  |
| `search` | object |  |

```bash
curl -X GET "$PANEL_URL/api/user/activities" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Activities retrieved successfully · `400` Bad request - Invalid authentication token · `401` Unauthorized - User not authenticated · `500` Internal server error - Failed to retrieve activities

### DELETE `/api/user/auth/discord/unlink`

- Auth: Signed-in user
- Default rate limit: 5 / minute (`user-auth-discord`)
- Route name: `discord-unlink`
- Controller: [`DiscordController::unlink`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/Auth/DiscordController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L180)

```bash
curl -X DELETE "$PANEL_URL/api/user/auth/discord/unlink" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

### POST `/api/user/sign-api-key`

- Auth: Signed-in user
- Default rate limit: 10 / minute (`user-api-key-sign`)
- Route name: `sign-api-key`
- Controller: [`SessionController::signApiKey`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/SessionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L191)

**Sign API key** Sign an API key

Request body: [`SignApiKeyRequest`](https://featherpanel.com/docs/api/schemas/#schema-signapikeyrequest) (application/json) · Response data: [`SignApiKeyResponse`](https://featherpanel.com/docs/api/schemas/#schema-signapikeyresponse)

| Body field | Type | Required | Description |
| --- | --- | --- | --- |
| `api_key` | string | no | API key to sign |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `signature` | string | Signature |
| `api_key` | string | API key |

```bash
curl -X POST "$PANEL_URL/api/user/sign-api-key" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"api_key":""}'
```

Responses: `200` API key signed successfully · `400` Bad request - Invalid request data, API key cannot be empty, or Invalid API key · `401` Unauthorized - User not authenticated · `500` Internal server error - Failed to sign API key

### GET `/api/user/account/deletion`

- Auth: Signed-in user
- Default rate limit: 30 / minute (`user-account-deletion`)
- Route name: `account-deletion-status`
- Controller: [`AccountDeletionController::status`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/AccountDeletionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L202)

**Get account deletion status** Returns whether self-service account deletion is enabled, verification requirements, mode, and any pending deletion.

```bash
curl -X GET "$PANEL_URL/api/user/account/deletion" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Deletion status retrieved successfully · `401` Unauthorized

### POST `/api/user/account/deletion/otp`

- Auth: Signed-in user
- Default rate limit: 3 / minute (`user-account-deletion`)
- Route name: `account-deletion-otp`
- Controller: [`AccountDeletionController::sendOtp`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/AccountDeletionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L213)

**Send account deletion email OTP** Send a one-time email code required to confirm account deletion when email OTP verification is enabled.

```bash
curl -X POST "$PANEL_URL/api/user/account/deletion/otp" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` OTP sent successfully · `403` Feature disabled or email OTP not required · `429` Rate limited

### POST `/api/user/account/deletion/confirm`

- Auth: Signed-in user
- Default rate limit: 5 / minute (`user-account-deletion`)
- Route name: `account-deletion-confirm`
- Controller: [`AccountDeletionController::confirm`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/AccountDeletionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L224)

**Confirm account deletion** Verify identity (2FA and/or email OTP) and process the deletion according to admin configuration.

```bash
curl -X POST "$PANEL_URL/api/user/account/deletion/confirm" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Account deleted or scheduled · `400` Validation failed · `403` Feature disabled · `409` Active services block deletion

### DELETE `/api/user/account/deletion`

- Auth: Signed-in user
- Default rate limit: 10 / minute (`user-account-deletion`)
- Route name: `account-deletion-cancel`
- Controller: [`AccountDeletionController::cancel`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/User/User/AccountDeletionController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/user/session.php#L235)

**Cancel pending account deletion** Cancel a pending delayed or after-services account deletion request.

```bash
curl -X DELETE "$PANEL_URL/api/user/account/deletion" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Pending deletion cancelled · `404` No pending deletion
