Objetivo

Restaura una cuenta MexCep soft-deleted usando el magic-link que llega en los emails de aviso del día 23 o día 29. El enlace es de un solo uso y está firmado por el servidor — al pulsarlo dentro de la ventana de gracia de 30 días la cuenta se restaura al instante sin contactar a soporte.

Requisitos previos

  • Acceso al buzón de correo que recibió el aviso (asunto: "Tu cuenta MexCep será eliminada permanentemente en N día(s)").
  • La cuenta debe seguir dentro de la ventana de gracia de 30 días (deleted_at con menos de 30 días).
  • El token no debe haberse usado antes (guardia Redis single-use).

Pasos

1. Abre el email de aviso

Busca en tu inbox un email de noreply@mexcep.com con un asunto similar a "Tu cuenta MexCep será eliminada permanentemente en 7 día(s)" o "...en 1 día(s)". El cuerpo explica qué está por eliminarse y ofrece un botón Restaurar mi cuenta.

2. Pulsa el botón Restaurar

El botón hace deep-link a una landing que automáticamente envía tu token firmado al endpoint POST /v1/auth/restore-account. No se requiere contraseña ni cookie de sesión — el JWT del enlace es la única credencial y fue firmado por el servidor MexCep al momento de generar el aviso.

3. (Opcional) Llama al endpoint directamente

Si extrajiste el token de la URL del email (por ejemplo copiando el parámetro ?token=...) también puedes hacer POST directo:

curl -X POST 'https://api.example.com/v1/auth/restore-account' \
  -H 'Content-Type: application/json' \
  -d '{"token": "<jwt-del-email>"}'

Una respuesta exitosa devuelve 200 OK con el timestamp de restauración:

{
  "data": {
    "type": "account_restored",
    "attributes": {
      "user_id": "01948f32-b1df-7d75-8ddd-521703876668",
      "restored_at": "2026-05-28T15:30:00Z",
      "days_since_soft_delete": 23.45,
      "message": "Account restored. Please log in normally to continue."
    }
  }
}

4. Inicia sesión normalmente

Una vez restaurada, el status de la cuenta vuelve a active y el timestamp tokens_invalidated_after se bumpea — cualquier JWT cacheado desde antes del soft-delete queda invalidado. Inicia sesión normalmente con tu email + contraseña para continuar.

Respuestas de error

CódigoErrorDescripción
422restore_token_requiredEl campo token falta en el body de la solicitud.
422restore_token_invalidEl JWT está mal formado, tiene firma inválida, o su claim type no es self_restore.
422restore_token_expiredEl claim exp ya pasó — la ventana de 30 días se cerró.
422restore_token_usedUn click anterior ya consumió este token. Cada token es de un solo uso.
403admin_self_restore_not_allowedLas cuentas admin u owner no son auto-restaurables. Contacta a soporte.
404user_not_restorableLa cuenta no existe, ya está activa, ya fue purgada por el cron, o la ventana de 30 días se cerró.
429rate_limit_exceededDemasiados intentos desde la misma IP. Espera un minuto y reintenta.

Notas

  • Expiración del token: el claim exp del JWT está pinneado al día 30 de la ventana de gracia, no al momento de emisión del aviso. Un token del día 23 sigue válido por ~7 días más; uno del día 29 sigue válido por ~1 día más.
  • Guardia single-use de replay: una restauración exitosa consume el jti del token en Redis (restore_token_used:{jti}) con TTL de 30 días. Un segundo click devuelve 422 restore_token_used.
  • Limitación del magic-link: cualquiera con acceso a tu inbox al momento del email de aviso tiene poder para restaurar tu cuenta. Trátalo como una contraseña de un solo uso — no lo reenvíes.
  • Después de la ventana de gracia: el cron purga la fila y lo único que queda es una entrada anónima de métricas (sin PII). Desde ese punto no hay path de recuperación — contacta a soporte para restauración desde backup solo como último recurso.