BIO.RE
User

Deactivate Account

Temporarily deactivate the current account. Profile becomes hidden, all sessions revoked. Reversible via /users/reactivate.

POST /api/v1/users/deactivate โ€” ๐Ÿ”‘ Bearer ยท Rate limit: 3 req / hour

Sets User.status = DEACTIVATED and revokes every active session for this user. Reversible โ€” the user can come back via POST /users/reactivate (auth-session mode) or by clicking a reactivation link sent later (token-bearer mode).

All sessions are revoked, including the one calling this endpoint. The next request with the existing access token will succeed only until the JWT expires (auth.access_token_ttl_seconds); the refresh cookie is dead immediately. Plan a redirect to a logged-out landing page on success.

Deactivation is distinct from deletion. Deactivation is reversible and preserves all data. Deletion is POST /users/delete (or POST /gdpr/delete), which schedules permanent erasure after a grace period. Deactivation by itself does not start any deletion timer.

Request

No body, no params.

HeaderRequiredNotes
Authorization: Bearer <accessToken>โœ“JWT from POST /auth/login

Response

200 OK โ€” SuccessOnlyResponseDto

{
  "success": true
}
FieldTypeNotes
successbooleanAlways true on 200

Errors

HTTPcode / i18nKeyReason
400error.user.account_not_activeUser.status is not ACTIVE (already DEACTIVATED, SUSPENDED, BANNED, or DELETED)
401(guard)Missing / invalid bearer token
404error.user.not_foundToken decoded but user row missing
429(throttle)Rate limit exceeded (3 req/hour)

Side effects

  1. Lookup User; throw not_found if missing.
  2. Reject if User.status !== 'ACTIVE' โ€” no idempotent re-deactivation.
  3. Inside one transaction:
    • User.status = DEACTIVATED.
    • UPDATE Session SET revoked = true, revokedAt = now() WHERE userId = :userId AND revoked = false (every live session).
  4. Audit log: [account] AUDIT: Deactivated by user {userId} (warn level).
  5. No scheduled deletion is created โ€” that requires the separate /users/delete flow.

Code samples

curl -X POST https://api.bio.re/api/v1/users/deactivate \
  -H "Authorization: Bearer $ACCESS_TOKEN"
async function deactivateAccount(accessToken: string): Promise<void> {
  const res = await fetch('https://api.bio.re/api/v1/users/deactivate', {
    method: 'POST',
    headers: { Authorization: `Bearer ${accessToken}` },
  });
  const json = await res.json();
  if (!res.ok || !json.success) {
    throw Object.assign(new Error(json?.error?.message ?? 'Deactivate failed'), {
      code: json?.error?.code,
    });
  }
}
import { useMutation, useQueryClient } from '@tanstack/react-query';

export function useDeactivateAccount() {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: async () => {
      const res = await fetch('/api/v1/users/deactivate', { method: 'POST' });
      const json = await res.json();
      if (!res.ok || !json.success) {
        throw Object.assign(new Error(json?.error?.message ?? 'Deactivate failed'), {
          code: json?.error?.code,
          i18nKey: json?.error?.i18nKey,
        });
      }
    },
    onSuccess: () => {
      // Sessions revoked server-side โ€” drop all caches, force re-auth flow
      qc.clear();
    },
  });
}

Try it

POST
/api/v1/users/deactivate
AuthorizationBearer <token>

In: header

Response Body

application/json

application/json

application/json

curl -X POST "https://loading/api/v1/users/deactivate"
{
  "success": true
}
{
  "success": false,
  "error": {
    "code": "AUTH_UNAUTHORIZED",
    "message": "Invalid credentials",
    "i18nKey": "auth.login.invalid_credentials",
    "i18nVars": {
      "field": "email"
    },
    "details": [
      {
        "message": "email must be an email"
      }
    ],
    "correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
  }
}
{
  "success": false,
  "error": {
    "code": "AUTH_UNAUTHORIZED",
    "message": "Invalid credentials",
    "i18nKey": "auth.login.invalid_credentials",
    "i18nVars": {
      "field": "email"
    },
    "details": [
      {
        "message": "email must be an email"
      }
    ],
    "correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
  }
}

Source

SourcePathLines
Controllerapps/api-core/src/modules/user/user.controller.ts158โ€“167 (deactivateAccount)
DTO (response)apps/api-core/src/common/dto/common-response.dto.tsSuccessOnlyResponseDto
Serviceapps/api-core/src/modules/user/user.service.ts402โ€“421 (deactivateAccount)
Prisma modelspackages/prisma/prisma/schema.prismaUser.status (UserStatus enum), Session.revoked

On this page