Camino A: portal o frontend propio con usuario autenticado
1
Crear usuario
POST /api/v1/users recibe correo, contraseña de mínimo ocho caracteres, nombre y apellido opcionales. Envía código de verificación por correo.2
Verificar correo
POST /api/v1/users/verify-code recibe email y code. Activa la cuenta.3
Iniciar sesión
POST /auth/login devuelve JWT de usuario. No es el bearer administrativo ni la clave CRM.4
Verificar torneo
Consulta
GET /api/v1/tournaments/by-uuid/{uuid}; revisa can_register, ventana, cupos y reglas.5
Inscribir
POST /api/v1/registrations con bearer del usuario y cuerpo {"tournament_id": 12, "user_id": 0}. El servidor sobrescribe user_id con el del JWT.6
Entregar cuenta
La API crea inscripción y cuenta MT5 del torneo, confirma la transacción y programa correo de credenciales. El usuario puede consultar
GET /api/v1/tournaments/{id}/my-credentials con su JWT.201 contiene la inscripción, no las contraseñas MT5. GET /api/v1/registrations/me muestra inscripciones propias.
Camino B: enlace privado
El administrador comparteurl, que apunta a /tournaments/private/{uuid}. Ese formulario llama POST /api/v1/tournaments/by-uuid/{uuid}/private-enroll sin token con first_name, last_name, email y send_email opcional (predeterminado true). Si el correo no existe, el backend crea y verifica el usuario, genera contraseña web, inscribe y crea cuenta MT5; si ya existe, añade inscripción y cuenta del torneo. Envía correo de bienvenida y credenciales cuando send_email es verdadero.
Idempotency-Key: ante timeout, consulta el estado antes de repetir para no provocar un 409 o duplicar intentos de MT5. send_email: false está pensado para pruebas controladas; sin correo, el usuario nuevo no recibe la contraseña generada.
Cuándo se cierra la inscripción
Debe existir ventana de registro. Se acepta desderegistration_start_at hasta registration_end_at inclusivo, pero se cierra antes si faltan menos de 20 minutos para competition_end_at; tampoco se acepta si el torneo está FINISHED. El cupo se verifica contando cuentas MT5 asociadas al torneo. Consulta can_register y muestra el mensaje de la API si devuelve 400.

