Skip to content

VLT Client Registration

POST /api/clientes/register

Registers the client with their essential information. It does not ask for a card, email, phone or address: those arrive later through their own endpoints, Contact Details and Card Assignment.

Two contracts side by side

The endpoint accepts the decoupled contract (this document) and the previous one (Spanish payload with codigoClienteVLT), still live while VLT migrates. The presence of playerId decides which one applies; the two never mix. See Previous contract.

Request

Headers

HeaderValueRequired
Content-Typeapplication/jsonYes
Acceptapplication/jsonYes

Public Endpoint

Publicly accessible. It does not require X-Client-Secret or any token. Protected by rate limiting (60 requests per minute per IP).

Body Parameters

ParameterTypeRequiredDescription
playerIdintegerYesPlayer identifier in the counterparty system. Unique
documentTypeintegerYes1 = National ID · 2 = Foreigner ID · 3 = Passport
documentNumberstringYesDocument number (max 20 chars)
firstNamestringYesFirst name(s)
paternalLastNamestringYesFather's last name
maternalLastNamestring | nullPresentMother's last name. Must be sent, may be empty or null
birthDatestring (date)YesBirth date (YYYY-MM-DD or ISO 8601)
genderintegerYesGender identifier

Request Example

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
  }'

Identity rules

RuleDetail
Unique documentThe documentType + documentNumber pair identifies a person. The same number under a different type is a different person
Unique playerIdTwo distinct profiles cannot share it
IdempotencyIf the document and playerId already exist and point to the same record, the request answers 200 without creating anything
Identity collisionIf each identifier points to a different profile, the request is aborted without writing

Responses

Both success scenarios return the same two identifiers: id is ours, playerId is the counterparty's.

New Client — 201 Created

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

Existing Client / Idempotency — 200 OK

The document and playerId sent already exist and match the same record.

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

Error Responses

Branch on code, not on message

code is the stable part of the contract: it does not change. message is informative and may be reworded without notice — in fact ERR_MISSING_REQUIRED_FIELDS shares a single text across the three endpoints. When the response carries errors, the per-field detail is there.

HTTPcodeWhen
400ERR_MISSING_REQUIRED_FIELDSA required field is missing or malformed
409ERR_DUPLICATE_DOCUMENTThe document is already registered under a different playerId
409ERR_DUPLICATE_PLAYER_IDThe playerId is already in use by a different document
409ERR_IDENTITY_COLLISIONThe document belongs to one profile and the playerId to another
429Rate limit exceeded (60 per minute per IP)
503The target operator is not configured. Contact support
500Internal error while processing the registration

409 Conflict Example

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

400 Bad Request Example

errors states exactly which field failed.

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

Try It

API PlaygroundPOST

Request Body

Request URL

https://api.syssoft1.com/api/clientes/register
  1. POST /api/clientes/register → keep the returned id.
  2. PUT /api/clientes/contact-info → fill in contact, location and preferences.
  3. PUT /api/clientes/card → bind the RFID card once the client receives it.

Steps 2 and 3 are independent of each other and may be repeated as often as needed.


Previous contract

Being replaced

Kept only so the current integration is not interrupted. New registrations should use the decoupled contract described above.

It applies when the body includes codigoClienteVLT. In that case the endpoint requires correo, the three preferences and tarjeta, and answers with the old shape ({ id, tarjeta, mensaje, esDuplicado }) and with Laravel's 422 on a validation error.

Body Parameters

ParameterTypeRequiredDescription
codigoClienteVLTintegerYesInternal unique client identifier in the VLT system
correostringYesClient's email address
enviarWhatsAppbooleanYesConsent to receive WhatsApp communications
enviarCorreobooleanYesConsent to receive email communications
enviarSmsbooleanYesConsent to receive SMS communications
tarjetastringYesPhysical RFID card identifier
tipoDocumentointegerNoDocument type identifier
dnistringNoNational document number (max 20 chars)
passwordstringNoLobby access password: 4 to 8 characters, no spaces
pinstringNoAlias of password. The field's former name
nombrestringNoClient's first name(s)
apellidoPaternostringNoFather's last name
apellidoMaternostringNoMother's last name
fechaNacimientostring (ISO 8601)NoBirth date
direccionstringNoResidential address
telefonostringNoContact phone number
ubigeostringNoGeographic location code
sexointegerNoGender identifier
currencystring (ISO 4217)NoPlayer currency. Defaults to PEN

Access password

The password is the second way into the terminal, for the player who arrives without their card. It is bound to whichever card ends up active.

At the terminal the player types their document and then their password: the password alone identifies nobody, because it is not unique, and it is the document + password pair that resolves the account. To use this route the player must have a dni on record.

RuleDetail
Format4 to 8 characters, no spaces. Letters allowed and case-sensitive: "Ab12" is not "ab12"
Length on the floorThe terminal types exactly 4, which is what the identity system issues. Registration accepts more so that no sign-up is ever rejected
TypeSend it as a string. As a number, a password with a leading zero ("0421") would lose it
UniquenessNot unique. A password repeated by another player registers normally
OptionalA registration without password keeps whatever the player already had
New cardIf the new card carries no password, it inherits the player's

The field used to be called pin

pin is still accepted as an alias, so an existing integration needs no changes. If both arrive, password wins. Validation errors are always reported against password.

Changing or removing a password

To change it, send a new registration with the desired password. There is no way to delete it through the API: omitting the field keeps the existing one, it does not remove it.

Responses

ScenarioHTTPmensajeesDuplicado
New client201"cliente nuevo"false
Card added to an existing client201"tarjeta agregada al cliente existente"false
Card already registered200"registro duplicado"true
json
{
  "id": 11,
  "tarjeta": "A0C2BBCA",
  "mensaje": "cliente nuevo",
  "esDuplicado": false
}

Errors

CodeDescription
422Validation failed, with the detail in errors
429Rate limit exceeded
503Target operator not configured
500Internal error

Notes for the VLT Integrator

  • The endpoint never duplicates a player. With the new contract, repeating the same identity answers 200; with the previous one, repeating the same card answers 200 registro duplicado.
  • The card identifier must be the physical UID returned by the RFID reader. It is the same value the lobby will later send as cardIdentifier when authenticating.
  • The password never travels back: it appears neither in this endpoint's response nor in any other.

Client API Documentation