Skip to content

Registro de Cliente VLT

POST /api/clientes/register

Da de alta al cliente con su información esencial. No pide tarjeta, correo, teléfono ni dirección: eso llega después por sus propios endpoints, Datos Complementarios y Asignación de Tarjeta.

Dos contratos conviviendo

El endpoint acepta el contrato desacoplado (este documento) y el anterior (payload en español con codigoClienteVLT), que sigue operativo mientras VLT migra. La presencia de playerId decide cuál se aplica; los dos nunca se mezclan. Ver Contrato anterior.

Solicitud

Headers

HeaderValorRequerido
Content-Typeapplication/json
Acceptapplication/json

Endpoint Público

Acceso público. No requiere X-Client-Secret ni token. Protegido por rate limit (60 solicitudes por minuto por IP).

Parámetros del Body

ParámetroTipoRequeridoDescripción
playerIdintegerIdentificador del jugador en el sistema de la contraparte. Único
documentTypeinteger1 = DNI · 2 = Carné de Extranjería · 3 = Pasaporte
documentNumberstringNúmero de documento (máx. 20 caracteres)
firstNamestringNombre(s)
paternalLastNamestringApellido paterno
maternalLastNamestring | nullPresenteApellido materno. Debe enviarse, puede ir vacío o null
birthDatestring (fecha)Fecha de nacimiento (YYYY-MM-DD o ISO 8601)
genderintegerIdentificador de sexo

Ejemplo de Solicitud

bash
curl -X POST 'https://api.syssoft1.com/api/clientes/register' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -d '{
    "documentType": 1,
    "documentNumber": "87654321",
    "firstName": "John",
    "paternalLastName": "Doe",
    "maternalLastName": "Smith",
    "birthDate": "1985-05-15",
    "gender": 1,
    "playerId": 1
  }'

Reglas de identidad

ReglaDetalle
Documento únicoEl par documentType + documentNumber identifica a una persona. El mismo número con otro tipo es otra persona
playerId únicoDos perfiles distintos no pueden compartirlo
IdempotenciaSi documento y playerId ya existen y apuntan al mismo registro, la petición responde 200 sin crear nada
Cruce de identidadesSi cada identificador apunta a un perfil distinto, la petición se aborta sin escribir

Respuestas

Ambos escenarios de éxito devuelven los mismos dos identificadores: id es el nuestro y playerId el de la contraparte.

Cliente Nuevo — 201 Created

json
{
  "id": 1024,
  "playerId": 1
}

Cliente Preexistente / Idempotencia — 200 OK

El documento y el playerId enviados ya existen y coinciden con un mismo registro.

json
{
  "id": 1024,
  "playerId": 1
}

Respuestas de Error

Ramifique por code, no por message

code es la parte estable del contrato: no cambia. message es informativo y puede reformularse sin previo aviso — de hecho ERR_MISSING_REQUIRED_FIELDS comparte un único texto en los tres endpoints. Cuando la respuesta trae errors, ahí está el detalle por campo.

HTTPcodeCuándo
400ERR_MISSING_REQUIRED_FIELDSFalta un campo obligatorio o no cumple el formato
409ERR_DUPLICATE_DOCUMENTEl documento ya está registrado bajo otro playerId
409ERR_DUPLICATE_PLAYER_IDEl playerId ya está en uso por otro documento
409ERR_IDENTITY_COLLISIONEl documento pertenece a un perfil y el playerId a otro
429Rate limit excedido (60 por minuto por IP)
503El sistema no tiene configurado el operador destino. Contacte a soporte
500Error interno procesando el registro

Ejemplo 409 Conflict

json
{
  "code": "ERR_DUPLICATE_DOCUMENT",
  "message": "El documento ingresado ya se encuentra registrado."
}

Ejemplo 400 Bad Request

errors detalla exactamente qué campo falló.

json
{
  "code": "ERR_MISSING_REQUIRED_FIELDS",
  "message": "Faltan campos obligatorios para actualizar el perfil",
  "errors": {
    "documentNumber": ["The document number field is required."]
  }
}

Pruébelo

API PlaygroundPOST

Cuerpo de la petición

URL de Petición

https://api.syssoft1.com/api/clientes/register

Flujo recomendado

  1. POST /api/clientes/register → guarde el id que devuelve.
  2. PUT /api/clientes/contact-info → complete contacto, ubicación y preferencias.
  3. PUT /api/clientes/card → vincule la tarjeta RFID cuando el cliente la reciba.

Los pasos 2 y 3 son independientes entre sí y pueden repetirse cuantas veces haga falta.


Contrato anterior

En proceso de reemplazo

Se mantiene únicamente para no interrumpir la integración vigente. Los registros nuevos deben usar el contrato desacoplado descrito arriba.

Se activa cuando el body incluye codigoClienteVLT. En ese caso el endpoint exige correo, las tres preferencias y tarjeta, y responde con la forma antigua ({ id, tarjeta, mensaje, esDuplicado }) y con 422 de Laravel ante un error de validación.

Parámetros del Body

ParámetroTipoRequeridoDescripción
codigoClienteVLTintegerCódigo interno único del cliente en el sistema VLT
correostringDirección de correo electrónico
enviarWhatsAppbooleanConsentimiento para comunicaciones por WhatsApp
enviarCorreobooleanConsentimiento para comunicaciones por correo
enviarSmsbooleanConsentimiento para comunicaciones por SMS
tarjetastringIdentificador físico de la tarjeta RFID
tipoDocumentointegerNoIdentificador del tipo de documento
dnistringNoNúmero de documento (máx. 20 caracteres)
passwordstringNoContraseña de acceso al lobby: 4 a 8 caracteres, sin espacios
pinstringNoAlias de password. Nombre anterior del mismo campo
nombrestringNoNombre(s)
apellidoPaternostringNoApellido paterno
apellidoMaternostringNoApellido materno
fechaNacimientostring (ISO 8601)NoFecha de nacimiento
direccionstringNoDirección de residencia
telefonostringNoTeléfono de contacto
ubigeostringNoCódigo de ubicación geográfica
sexointegerNoIdentificador de sexo
currencystring (ISO 4217)NoMoneda del jugador. Por defecto PEN

Contraseña de acceso

La contraseña es la segunda vía de entrada al terminal, para el jugador que llega sin su tarjeta. Queda asociada a la tarjeta que quede vigente.

En el terminal el jugador escribe su documento y después su contraseña: la contraseña por sí sola no identifica a nadie, porque no es única, y es el par documento + contraseña el que resuelve la cuenta. Para poder usar esta vía el jugador debe tener dni registrado.

ReglaDetalle
FormatoDe 4 a 8 caracteres, sin espacios. Admite letras y distingue mayúsculas: "Ab12" no es "ab12"
Longitud en salaEl terminal teclea exactamente 4, que es lo que emite el sistema de identidad. El registro admite más para no rechazar ningún alta
TipoEnvíela como string. Como número, una contraseña con cero inicial ("0421") perdería el cero
UnicidadNo es única. Una contraseña repetida por otro jugador se registra con normalidad
OpcionalUn registro sin password conserva la que el jugador ya tuviera
Tarjeta nuevaSi la tarjeta nueva no trae password, hereda la del jugador

El campo se llamaba pin

pin se sigue aceptando como alias, así que una integración existente no necesita cambiar nada. Si llegan los dos, manda password. El error de validación se reporta siempre sobre password.

Cambiar o quitar una contraseña

Para cambiarla, envíe un registro nuevo con la password deseada. No hay forma de borrarla por API: omitir el campo conserva la existente, no la elimina.

Respuestas

EscenarioHTTPmensajeesDuplicado
Cliente nuevo201"cliente nuevo"false
Tarjeta agregada a un cliente existente201"tarjeta agregada al cliente existente"false
Tarjeta ya registrada200"registro duplicado"true
json
{
  "id": 11,
  "tarjeta": "A0C2BBCA",
  "mensaje": "cliente nuevo",
  "esDuplicado": false
}

Errores

CódigoDescripción
422Validación fallida, con el detalle en errors
429Rate limit excedido
503Operador destino sin configurar
500Error interno

Notas para el Integrador VLT

  • El endpoint nunca duplica un jugador. Con el contrato nuevo, repetir la misma identidad responde 200; con el anterior, repetir la misma tarjeta responde 200 registro duplicado.
  • El identificador de tarjeta debe ser el UID físico que devuelve el lector RFID. Es el mismo valor que el lobby enviará luego como cardIdentifier al autenticar.
  • La password nunca viaja de vuelta: no aparece en la respuesta de este endpoint ni en ningún otro. Tampoco se escribe en los registros de actividad.

Documentación de la API para Clientes