> ## Documentation Index
> Fetch the complete documentation index at: https://tournaments-partners.exuratech.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Incorporar participantes a un torneo

> Registro de usuario, inscripción autenticada y enlace privado que crea la cuenta.

## 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.

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{"first_name":"Ana","last_name":"Pérez","email":"ana@example.com"}
```

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`.

> [!WARNING]
>
> `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.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.