Verificar dirección de correo electrónico
GET/verify-email/:id/:hash
Público (sin autenticación). Destino del enlace firmado que llega por correo; lo abre el navegador del usuario, no se invoca manualmente. La URL completa (incluidos expires y signature) la genera el backend y no debe modificarse. El enlace solo vale para el correo al que se envió: hash debe ser el SHA-1 del correo actual del usuario; si el usuario cambió su correo después de recibirlo (p. ej. con PUT /profile/{id}), el enlace anterior ya no verifica nada y redirige a {FRONTEND_URL}/#/auth/email-resend (un enlace con firma inválida o expirada no redirige: responde 403). Si la firma y hash son válidos marca el email como verificado y redirige al login del frontend; si ya estaba verificado solo redirige. Verificar el correo no cambia active: el registro y la sincronización crean las cuentas activas, así que un usuario inactivo es uno que desactivó un administrador y sigue inactivo (el login lo rechaza) hasta que un administrador lo reactive. Límite: 6 peticiones por minuto por IP.
Request
Responses
- 302
- 403
- 404
- 429
Dos destinos. (1) Email verificado (o ya lo estaba): {FRONTEND_URL}/#/auth/login. (2) Enlace con firma válida pero emitido para un correo anterior (hash no coincide con el SHA-1 del correo actual): {FRONTEND_URL}/#/auth/email-resend, sin verificar nada; el usuario pide un enlace nuevo con POST /email/verification-notification. En ningún caso se modifica active.
Response Headers
URL del frontend: login si se verificó, reenvío del enlace si no.
Firma inválida o enlace expirado. Lo responde el middleware signed antes de llegar al controlador (HTML o, si la petición acepta JSON, {"message": "Invalid signature."}). Para obtener un enlace nuevo use POST /email/verification-notification.
No existe un usuario con ese id.
Más de 6 peticiones por minuto desde la misma IP. Cuentan todos los intentos, incluidos los de enlaces con firma inválida o expirada. Nota: el contador por IP se comparte con otros endpoints públicos que también limitan por IP (retorno del KYC y baja de los correos de novedades), así que las peticiones a esos endpoints desde la misma IP también consumen este cupo. Además aplica el límite general de la API (60 peticiones por minuto por IP, compartido con todos los endpoints públicos); si se agota ese cupo también se responde 429, en ese caso con X-RateLimit-Limit: 60. Cuerpo HTML o, si la petición acepta JSON, {"message": "Too Many Attempts."}. Incluye las cabeceras Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset.
Response Headers
Segundos que faltan para poder reintentar.
Peticiones permitidas por minuto: 6 (límite del endpoint) o 60 (límite general de la API).
Peticiones restantes en la ventana actual.
Unix timestamp en el que se libera el límite.