Skip to main content

Account Deletion

Autentico supports user-initiated account deletion with two modes: immediate self-service deletion and admin-reviewed deletion requests.

Deletion modes​

Self-service deletion​

When allow_self_service_deletion is true, a user's account is permanently deleted immediately when they submit a deletion request. No admin review is required.

Admin-reviewed deletion​

When allow_self_service_deletion is false (the default), the user's request is stored as a pending deletion request. An admin must review and approve or cancel the request.

Configuration​

curl -X PUT https://auth.example.com/admin/api/settings \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"allow_self_service_deletion": "true"}'
SettingDefaultDescription
allow_self_service_deletionfalseWhen true, deletion requests are executed immediately without admin review

Account API endpoints (user-facing)​

These endpoints are authenticated with the user's access token.

Request deletion​

POST /account/api/deletion-request

Submits a deletion request. In self-service mode, the account is deleted immediately (returns 204). In admin-review mode, a pending request is created (returns 201).

curl -X POST https://auth.example.com/account/api/deletion-request \
-H "Authorization: Bearer $USER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"reason": "No longer using the service"}'
FieldRequiredDescription
reasonNoOptional reason for the deletion request

Returns 409 Conflict if a pending request already exists.

Get deletion request status​

GET /account/api/deletion-request

Returns the current user's pending deletion request, or null if none exists.

curl https://auth.example.com/account/api/deletion-request \
-H "Authorization: Bearer $USER_TOKEN"

Cancel deletion request​

DELETE /account/api/deletion-request

Cancels the current user's pending deletion request.

curl -X DELETE https://auth.example.com/account/api/deletion-request \
-H "Authorization: Bearer $USER_TOKEN"

Returns 204 on success, 404 if no pending request exists.

Admin API endpoints​

These endpoints require admin authentication.

List deletion requests​

GET /admin/api/deletion-requests

Lists all pending deletion requests with pagination, sorting, search, and date filtering.

curl https://auth.example.com/admin/api/deletion-requests \
-H "Authorization: Bearer $ADMIN_TOKEN"
ParameterDescription
sortSort field: requested_at (default), username, email
orderSort order: asc (default), desc
searchSearch by username, email, or reason
requested_at_fromFilter: requested at or after (ISO 8601)
requested_at_toFilter: requested at or before (ISO 8601)
limitMax results per page (1--100, default 100)
offsetNumber of results to skip (default 0)

Approve deletion​

POST /admin/api/deletion-requests/{id}/approve

Permanently deletes the user and all associated data.

curl -X POST https://auth.example.com/admin/api/deletion-requests/$REQUEST_ID/approve \
-H "Authorization: Bearer $ADMIN_TOKEN"

Returns 204 on success. Logs a deletion_approved audit event.

Cancel (dismiss) deletion request​

DELETE /admin/api/deletion-requests/{id}

Cancels a deletion request without deleting the user.

curl -X DELETE https://auth.example.com/admin/api/deletion-requests/$REQUEST_ID \
-H "Authorization: Bearer $ADMIN_TOKEN"

What gets deleted​

When a deletion is approved (or executed in self-service mode), the user and all associated data are permanently removed:

  • User account record
  • All OAuth sessions
  • All IdP sessions
  • All access and refresh tokens
  • All MFA challenges and TOTP secrets
  • All passkey credentials
  • All trusted device tokens
  • All federated identity links
  • All group memberships
  • All consent records
  • The deletion request itself
caution

Account deletion is permanent and irreversible. There is no soft-delete or recovery period. Make sure admin review is enabled if you want a safety net.

Database table​

The deletion_requests table stores pending requests:

ColumnTypeDescription
idTEXTPrimary key (xid)
user_idTEXTForeign key to users.id
reasonTEXTOptional reason (nullable)
requested_atDATETIMEWhen the request was submitted