---
title: "Archive (soft-delete) or purge users in a target app (v2, tenant actor)"
method: DELETE
path: "/v2/apps/{appId}/users/batch"
tags: ["Users"]
---

# Archive (soft-delete) or purge users in a target app (v2, tenant actor)

`DELETE /v2/apps/{appId}/users/batch`

## Request

- Base URL: `https://api.chat.ethora.com`
- URL: `https://api.chat.ethora.com/v2/apps/{appId}/users/batch`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

**Auth**: Tenant Actor

Default behavior is **soft archive**: each user's `status` flips to
`archived`, login is blocked, and all related data (wallets, files,
chat memberships, XMPP account) is retained for restore via
`POST /v2/apps/{appId}/users/{userId}/restore`.

Pass `?mode=hard` for a **synchronous cascade purge** (irreversible):
per user, XMPP unregister, MinIO blob removal, wallets, files, docs,
memberships, ACL, refresh tokens, sessions, and any rooms the user
created (room destroy + chat row + messages + members of that room).

Returns per-user results so the caller can act on partial failures.

Supports `User JWT` and `B2B Server JWT`.

## Path parameters

- `appId` string, required

## Query parameters

- `mode` 'soft' | 'hard'
- `reason` string

## Request body

- object
  - `usersIdList` string[], required: Array of User IDs to operate on. Users must belong to the target App.

## Response `200`

ok (per-user results in `results[]`)

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found
- `422`: Unprocessable Entity
- `500`: Internal Server Error

---

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