Skip to main content

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.
El endpoint comprueba ventana y cupo, impide doble inscripción del mismo usuario y necesita conexión MT5 activa. Crea cuenta con balance inicial y grupo del torneo; habilita trading si la ventana del torneo ya está en vivo. Si MT5 rechaza la creación, la API revierte la transacción local y responde error. Una respuesta 201 contiene la inscripción, no las contraseñas MT5. GET /api/v1/registrations/me muestra inscripciones propias.

Camino B: enlace privado

El administrador comparte url, 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.
Protege la distribución del enlace privado y no lo uses como endpoint CRM masivo sin controles de elegibilidad propios. A diferencia de la inscripción de competencias, no recibe 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 desde registration_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.
GET /api/v1/tournaments/{id}/registrations es solo administrativo y devuelve datos personales y credenciales de cuentas. Nunca lo publiques en un frontend de participante ni lo uses para poblar un ranking público.