< All Topics
Print

PMS API 1 – Wallet

Version – 19/11/2025.

Scope

The scope is integration with the PMS to obtain reservation information and manage physical key recording.
With this information, we can provide the option of connecting to Vingcard Wallet.

For this scope, the following information is received and sent between VConnect and the PMS:

PMS -> VConnectVConnect -> PMS
Reservation information* Reservation info event
(Reports current reservation information)
Keycard* Create key
* Read Key (optional)
* Update additional access (optional)
* Get encoders list (optional)
* Get doors list (optional)

Introduction

This document describes the public HTTP API of VConnect for receiving messages from PMS systems integrated with Vingcard Wallet.

The categories of messages needed from the PMS are:

  • Reservation events (required): PMS must send an event every time a reservation is updated. On creation, cancellation, update, check-in, room move, stays dates changes and check-out.
  • KeyCard commands (optional): Commands to create a plastic key or to read and other functionalities of the key.

VConnect supports two types of messages, Commands and Events. Below we describe what an event and a command are:

  • Event: message generated by a System (S1), which is delivered to VConnect and only waits for the ACK of that delivery. After responding with ACK, VConnect does whatever it has to do with it. By default, VConnect sends the event to all Systems that support receiving it. In this case:
    • The PMS sends the event ‘reservation.event.info’ to VConnect.
    • VConnect responds with the ACK to the PMS.
    • VConnect does whatever it has to do with this information.
  • Command: message generated by a System (S1), which passes through VConnect and has to be executed by another System (S2) and S1 waits for the result of the execution of S2. For example, an order to read a key card, arrives from a PMS, passes through VConnect, waits for the response from the Door Lock System and returns the result. Every command has a response.
    • The PMS sends the event ‘keycard.command.createKey’ to VConnect.
    • The PMS waits for a response.
    • VConnect sends it to a Door Lock system.
    • VConnect receives the response from the Key Access system and send it to the PMS.

PMS -> VConnect Communication protocol

  • VConnect API receives events and commands from the external system (PMS), processes them, and sends them to the VConnect core to be distributed to other hotel systems.
  • VConnect API acts as an HTTP server and the PMS acts as an HTTP client sending messages to the server.
  • The communication protocol is HTTPS with HTTP Basic authentication. Requests will be sent using HTTP POST Requests. The message is encoded as “application/json”.
  • VConnect technicians will provide BASE_URL and Authentication values to be used by the PMS System.
  • VConnect provides unique endpoints for each external system of a subscription. If a single subscription/hotel has two external systems of the same type, different endpoints will be provided for each of the external systems.

For Keycard messages the url should be:

 POST [BASE_URL]/command

For Reservation messages the url should be:

POST [BASE_URL]/event

Message flow

The communication from the PMS system to VConnect will follow this flow.

  • HTTP client -> HTTP server: sends POST request (to command or event url) + json payload body
  • Response HTTP server -> HTTP client:
    • HTTP response CODE: will indicate the result at the HTTP link level: 200 OK (received), 404 unauthorized, etc.
    • If HTTP code 200, the response will include in the BODY a json with information about the processing of the message:
      • For /event messages: the response body indicates the result of processing message by the receiver. VConnect response only indicates if there is any error in processing the received JSON, it will not indicate the result of sending that data to other systems.
      • For /command messages: will return the result of executing the command in the Door Lock System.

Request Payload

All messages will send a JSON containing:

  • Identifying part (id, action, etc.)
  • Payload: Dependent on the type of action being processed.
NameTypeDescriptionNotes
actionstringSee list below[required]
payloadJSON request structureContent will depend on each action.[optional or required depending on type of message]
idstringUnique Id to identify each request. It will be used in responses and to help tracing of requests for support purposes.
VConnect will always send a unique ID in its request to other systems. It is not required for other systems to include this field in their requests to VConnect. VConnect will generate an unique ID if receives a request without it.
[optional]
stampYYYY-MM-ddTHH:mm:ssZ Date time of the external system in UTC format.
It can be useful when dealing with support requests in order to look for specific logs in external system time.
[optional]

Response Payload

All responses will include a JSON containing:

  • Payload: Dependent on the type of action being processed.
  • Common part with result, identifiers, etc. (code, description, id, etc.)
NameTypeDescriptionNotes
codestringResult code:
“0”: OK
“1xx” error that requires retry (range 100-125)
“2xx” non-recoverable error on retry (range 200-225)
[required]
payloadJSON response structContent will depend on each event/command[optional/required depending on type of message]
descriptionstringMessage with technical description in case of error[recommended]
end_user_messagestringMessage to be shown to end users. This is useful mainly for commands. For example, if a PMS sends a keycard.command.createKey. EndUserMsg will include a message to be shown to end user in the PMS UI.[optional]
request_idstringID from the request message. VConnect will include this field when acting as server in order to help tracing at requester’s logs. VConnect does not require order systems to include this field in their responses.[optional]
idstringUnique ID for this response message. VConnect will include this ID in their responses. VConnect does not require order systems to include this field in their responses.[optional]
List of result codes
CodeDescription
0OK
1xxNot accepted, Retry later. To be used if the receiver had some kind of internal problem that requires the sender to keep the message in queue and send it again later.
201Not accepted, don’t retry later.

List of actions

Reservation

Reservation.event.info

ActionDescriptionNotes
reservation.event.infoReports current reservation informationMandatory for wallet

The PMS must send a reservation.even.info message with information about a reservation when any of these changes are done in the PMS.

Method: POST [BASE_URL]/event

NameTypeDescriptionNotes
chainstringHotel Chain ID.[optional]
propertystringHotel ID.[optional]
reservation_idstringReservation number.[required]
confirmation_idstringConfirmation number.[recommended]
statusstringCurrent reservation status. Possible values:
– expected
– checkedin
– checkedout
– canceled
– noshow
[required]
locatorstringPublic locator of the booking, if it does not exist, the same value as the ‘id’ field will be sent.[optional]
roomstringRoom name occupied by the booking. Required for the “check-in”, “checkout” status. In case of room move, new room assigned.[optional]
accountstringAccount associated to the booking. If the PMS trats them ata occupant level, it is the account of the main guest.[optional]
arrivalstringArrival Date-Time (UTC) in fomat YYYY-MM-DDTHH:NN:SSZ[required]
departurestringDeparture Date-Time (UTC) in fomat YYYY-MM-DDTHH:NN:SSZ[required]
levelstringGeneric VIP level of the booking. If the PMS treats them at occupant level, it must be used the VIP level of the main guest.[optional]
paxnumberTotal number of occupants.[optional]
childrennumberNumber of children.[optional]
notes_staystringNotes of the stay.[optional]
notes_preferencestringNotes of the preferences.[optional]
originstringReservation Origin.[optional]
agencystringReservation Agency.[optional]
rate_planstringReservation rate plan.[optional]
booking_guestsArrayGuest list for the reservation:
guest_idstringInternal guest UID.[required]
guest_mainbooleantrue: Main Guest.
false: Additional occupant.
If the PMS does not send the specific data, VConnect will assing the first in the list as the main guest.
[optional]
guest_adultbooleantrue: adult
false: children
[optional]
guest_accountstringAccount associated with the guest.[optional]
guest_titlestringGuest treatment.[optional]
guest_firstnamestringGuest’s name.[required]
guest_lastnamestringGuest’s surname.[required]
guest_genderstringGuest’s gender.[optional]
guest_levelstringGuest’s VIP level.[optional]
guest_nationalitystringGuest’s nationality.[optional]
guest_languagestringGuest’s language.[required]
guest_birth_datestringDate of birth in format YYYY-MM-DD[optional]
guest_emailstringGuest’s e-mail address.[required]
guest_phonestringGuest’s phone number.[required]
guest_allow_contactbooleantrue: Contact is allowed.
false: Contact is not allowed.
[optional]
guest_passportstringGuest’s passport.[optional]
guest_identity_cardstringGuest’s identity card.[optional]
guest_addressstringGuest’s address.[optional]
guest_postal_codestringGuest’s postal/ZIP code.[optional]
guest_statestringGuest’s state.[optional]
guest_countrystringGuest’s country.[optional]

reservation.event.info example:

{
    "id": "804fb2b2-1986-4d01-83af-3f81a0788a45",
    "stamp": "2025-11-14T15:45:02.839Z",
    "action": "reservation.event.info",
    "payload": {
        "chain": "4433",
        "property": "A1122",
        "reservation_id": "74147",
        "confirmation_id": "475471",
        "status": "expected",
        "locator": "95754",
        "room": "110",
        "account": "58815",
        "arrival": "2025-11-14T10:22:13Z",
        "departure": "2025-11-19T10:00:00Z",
        "level": "VIP",
        "pax": 1,
        "children": 0,
        "booking_guests": [
       {
            "guest_id": "442123_1",
            "guest_main": true,
            "guest_adult": true,
            "guest_account": "58815_1",
            "guest_title": "Mr.",
            "guest_firstname": "John",
            "guest_lastname": "Doe",
            "guest_gender": "male",
            "guest_level": "VIP",
            "guest_nationality": "US",
            "guest_language": "en",
            "guest_birth_date": "1980-01-01",
            "guest_email": "john.doe@example.com",
            "guest_phone": "+1234567890",
            "guest_allow_contact": true,
            "guest_passport": "271234111",
            "guest_identity_card": "33126423C",
            "guest_address": "123 Main St",
            "guest_city": "Anytown",
            "guest_postal_code": "12345",
            "guest_state": "CA",
            "guest_country": "US"
        }
    ],
    "notes_stay": "comming with one kids",
    "notes_preferences": "king size bed, please",
    "origin": "Spain",
    "agency": "Booking",
    "rate_plan": "AI"
  }
 }

Response

{
    "action": "reservation.event.info",
    "code": 0,
    "description": "",
    "end_user_message": "",
    "id": "939b2eda-9397-49b9-8301-e2d25e1fc8a4",
    "request_id": "804fb2b2-1986-4d01-83af-3f81a0788a45",
    "stamp": "2025-11-14T15:45:03.123433601Z"
}

Keycard

ActionDescriptionNotes
keycard.command.createKeyCreate a Key.
VConnect will order the Door Lock System (DLS) to create the key and return the result to the PMS.
Mandatory to generate plastic cards.
keycard.command.readKeyRead a plastic Key.
VConnect will order the Door Lock System to read a key and return the result to the PMS.
Optional.
keycard.command.getEncodersObtains list of encoders.
Retrieves the identifiers of the Encoders configured in the Door Lock System.
Optional.
keycard.command.getDoorsObtains list of doors (room and aditional accesses).
Retrieves the list of doors configured in the Door Lock System.
Optional.

Method: POST [BASE_URL]/command

Keycard.command.createKey payload (physical key)

This command can be used by the PMS to send and order to create a plastic key card.

VConnect receives the command, sends it to the Door Lock System and returns the result of the execution of the command to the PMS.

NameTypeDescriptionNotes
key_typenumberFor key card the value is 2[required]
mainbooleantrue: Indicates the creation of New/Primary key card.
false: Indicates a Duplicate/Copy key card.
[required]
card_encoderstringID of the Door Lock System encoder to be used to create the plastic key card.[required]
cards_qtynumberNumber of cards to be recorded.[required]
chainstringChain Hotel ID.[optional]
propertystringHotel ID.[optional]
reservation_idstringReservation number.[required]
confirmation_idstringConfirmation number.[recommended]
roomstringRoom number.[required]
arrivalYYYY-MM-ddTHH:mm:ssZArrival date and time (UTC).[required]
departureYYYY-MM-ddTHH:mm:ssZDeparture date and time (UTC).[required]
namestringName of the main guest.[recommended]
emailstringEmail of the main guest.[recommended]
extra_roomsArrayExtra rooms in the array should be enclosed in quotation marks and delimited by commas.[optional]
extra_accessArrayExtra accesses in the array should be enclosed in quotation marks and delimited by commas.[optional]
keytrack1stringAdditional data recorded on the public tracks of the card.[optional]
keytrack2stringAdditional data recorded on the public tracks of the card[optional]

keycard.command.createKey example:

{
    "id": "4d2eb7d1-9802-4581-9b46-cb9eaa3af53f",
    "stamp": "2025-11-14T07:21:36.728Z",
    "action": "keycard.command.createKey",
    "payload": {
        "key_type": 2,
        "main": true,
        "card_encoder": "1",
        "cards_qty": 1,
        "chain": "1234",
        "property": "33333",
        "reservation_id": "74147",
        "confirmation_id": "475471",
        "room": "110",
        "arrival": "2025-11-14T10:22:13Z",
        "departure": "2025-11-16T10:00:00Z",
        "name": "John Doe",
        "email": "john.doe@example.com",
        "extra_rooms": ["111","112"],
        "extra_access": ["SPA"],
        "keytrack1": "track1",
        "keytrack2": "track2"
    }
}

Response

Based on the “Response Payload” section, the fields with relevant information are:

  • code: Response code.
  • description: Provides technical details in case of an error.
  • end_user_message: Message to be displayed as a user-friendly message to the end user.
  • payload:
    • serialNumbers: Serial number of the recorded key card.

Response of a key card recording operation (OK)

{
    "action": "keycard.command.createKey",
    "code": 0,
    "description": "createKey command executed successfully:",
    "id": "aea2780a-1d75-48b3-9a76-ea462d9dacc1",
    "end_user_message": "",
    "payload": {
        "credential": "",
        "internalCardId": [
            "c527529d-ba04-4982-b53d-d81e3e848ee7"
        ],
        "keytrack2": [
            "0491a2b2d97281"
        ],
        "serialNumbers": [
            "0491a2b2d97281"
        ],
        "token": ""
    },
    "request_id": "4d2eb7d1-9802-4581-9b46-cb9eaa3af53f",
    "stamp": "2025-11-14T07:21:44.631928638Z"
}


Response when an error occurs:

{
    "action": "keycard.command.createKey",
    "code": 200,
    "description": "error sending order HardKeyCreate to Assavostio: ErrorCode:ENCODER_NOT_FOUND Message: Could not find encoder 2",
    "end_user_message": "Could not find encoder 2. Please make sure the encoder is defined in Vostio",
    "id": "4cf57b91-e8e1-4739-84e2-85ccf63808ce",
    "payload": {
        "credential": "",
        "token": ""
    },
    "request_id": "4f836930-15ff-4c58-b4f2-444056b2a359",
    "stamp": "2025-11-14T12:05:19.452531183Z"
}
 
 

Keycard.command.readKey payload (physical key)

This command can be used by the PMS to send and order to read the information from a plastic key card.

VConnect receives the command, sends it to the Door Lock System and returns the result of the execution of the command to the PMS.

NameTypeDescriptionNotes
key_typenumberFor Keycard the value is 2[required]
card_encoderstringID of the Door Lock System encoder to be used to create the plastic key card.[required]
chainstringChain Hotel ID[optional]
propertystringHotel ID[optional]

Example:

{
    "id": "5b26bee0-792c-4a11-bcb5-5b9e3d01cf4f",
    "stamp": "2025-11-14T08:18:10.698Z",
    "action": "keycard.command.readKey",
    "payload": {
        "key_type": 2,
        "card_encoder": "1",
        "chain": "1234",
        "property": "33333"
    }
}

Response

Based on the “Response Payload” section, the fields with relevant information are:

  • code: Response code.
  • description: Provides technical details in case of an error.
  • end_user_message: Message to be displayed as a user-friendly message to the end user.
  • payload:
    • createdAtUtc: Date / Time of the recording of the key card.
    • media_card_uid: Serial number of the recorded key card.
    • validFromUtc: From Date / Time.
    • validToUtc: To Date / Time.
    • doors:
      • name: Room number.

Response payload (OK):

{
    "action": "keycard.command.readKey",
    "code": 0,
    "description": "ok",
    "end_user_message": "Key successfully read",
    "id": "24588818-cca8-4953-851c-a7ed092c70a3",
    "payload": {
        "createdAt": "2025-11-14T13:10:40Z",
        "createdAtUtc": "2025-11-14T12:10:40Z",
        "createdUsing": "VOSTIO_GUEST_API",
        "doors": [
            {
                "code": 0,
                "description": "",
                "id": 0,
                "name": "110",
                "pms_id": "",
                "type": "GuestDoor"
            }
        ],
        "hasCheckedOut": false,
        "id": "712981c2-9c40-4b25-853a-bcb2b258417c",
        "media_card_uid": "0491a2b2d97281",
        "media_type": "Card",
        "validFrom": "2025-11-14T13:10:00Z",
        "validFromUtc": "2025-11-14T12:10:00Z",
        "validTo": "2025-11-16T10:00:00Z",
        "validToUtc": "2025-11-16T09:00:00Z"
    },
    "request_id": "2a6177ae-d507-4ff7-9992-e8502ac3e3cd",
    "stamp": "2025-11-14T12:11:01.682375336Z"
} 

keycard.command.updateAdditionalAccess payload

This command can be used by the PMS to update access permissions for an existing key or reservation. Not supported by all Door Lock Systems. ONLY valid for “online” Door Lock Systems that supports receiving access permissions update for existing keys/reservations.
VConnect receives the command, sends it to the Door Lock System and returns the result of the execution of the command to the PMS.

NameTypeDescriptionNotes
key_typenumberValue: 5[required]
chainstringChain Hotel ID[optional]
propertystringHotel ID[optional]
reservation_idstringReservation number[required]
confirmation_idstringConfirmation number[recommended]
roomstringRoom number[required]
arrivalYYYY-MM-ddTHH:mm:ssZArrival date and time (UTC)[optional]
departureYYYY-MM-ddTHH:mm:ssZDeparture date and time (UTC)[optional]
extra_roomsArrayExtra rooms in the array should be enclosed in quotation marks and delimited by commas.[optional]
extra_accessArrayExtra acceses in the array should be enclosed in quotation marks and delimited by commas.[optional]

Request of Update Additional Access example:

{
    "id": "6ec56aa7-5ca8-4fb3-baf4-d72d3fc46280",
    "stamp": "2025-11-14T12:25:20.488Z",
    "action": "keycard.command.updateAdditionalAccess",
    "payload": {
        "key_type": 5,
        "chain": "1234",
        "property": "33333",
        "reservation_id": "74147",
        "confirmation_id": "475471",
        "room": "110",
        "arrival": "2025-11-14T10:22:13Z",
        "departure": "2025-11-19T10:00:00Z",
        "extra_rooms": [
            "101"
        ],
        "extra_access": [
            "SPA"
        ]
    }
} 

Response

Based on the “Response Payload” section, the fields with relevant information are:

  • code: Response code.
  • description: Provides technical details in case of an error.
  • end_user_message: Message to be displayed as a user-friendly message to the end user.

Response payload with example (OK):

{
    "action": "keycard.command.updateAdditionalAccess",
    "code": 0,
    "description": "updateAdditionalAccess command executed successfully: Reservation ID: 475471, Room: 110, ExtraRooms: [101], ExtraAccess: [SPA]",
    "end_user_message": "",
    "id": "d1fd7149-8ea9-4b9c-8ade-6864414f6994",
    "payload": {
        "credential": "",
        "token": ""
    },
    "request_id": "6ec56aa7-5ca8-4fb3-baf4-d72d3fc46280",
    "stamp": "2025-11-14T12:25:20.982019256Z"
}

Response payload with example (DLS returned and error):

{
    "action": "keycard.command.updateAdditionalAccess",
    "code": 200,
    "description": "error sending AssignAccess to Vostio: assign access request returned != 201. Returned: 422 - {ErrorCode:DOOR_NOT_FOUND Message:Could not find door with id POOL Code:0 Id: CausedBy:[]}",
    "end_user_message": "Could not find door with id POOL",
    "id": "a7a7373a-264a-488a-8798-d9fd4ab2a69e",
    "payload": {
        "credential": "",
        "token": ""
    },
    "request_id": "9d5fa8b5-9b03-43e3-8eee-cbae53b0de65",
    "stamp": "2025-11-14T12:32:15.282756182Z"
}


keycard.command.getEncoders payload

Retrieves encoder list from the Door Lock System, if supported by the connected system.

The ‘id’ field in the response corresponds to the internal encoder identifier used during physical key encoding and reading.

NameTypeDescriptionNotes
chainstringChain Hotel ID[optional]
propertystringHotel ID[optional]

Encoder request example:

{
    "id": "3235fce6-fb01-4b7e-8ff5-4d83f0a45cd5",
    "stamp": "2025-11-19T12:07:56.421Z",
    "action": "keycard.command.getEncoders",
    "payload": {
        "chain": "4433",
        "property": "A1122"
    }
}

Response

Based on the “Response Payload” section, the fields with relevant information are:

  • code: Response code.
  • description: Provides technical details in case of an error.
  • end_user_message: Message to be displayed as a user-friendly message to the end user.
  • payload:
    • encoders:
      • id: Encoder ID.
      • name: Name of the encoder.

{
    "action": "keycard.command.getEncoders",
    "code": 0,
    "description": "ok, getEncoders command executed successfully: 2 encoders received",
    "end_user_message": "",
    "id": "b8effa6b-5794-4d8d-9e38-d65dbe3789e5",
    "payload": {
        "encoders": [
            {
                "id": "1",
                "name": "Encoder 1"
            },
            {
                "id": "2",
                "name": "Encoder 2"
            }
        ]
    },
    "request_id": "17487c82-40fc-410c-8f37-29b6eb2d79f9",
    "stamp": "2025-11-19T12:11:12.19303439Z"
}         

keycard.command.getDoors payload

Retrieves rooms and common spaces list from the Door Lock System, if supported by the connected system.

The ‘name’ field in the response corresponds to the room used during physical key encoding and reading.

NameTypeDescriptionNotes
chainstringChain Hotel ID[optional]
propertystringHotel ID[optional]

Example for doors request:

{
    "id": "1f8f6549-d98e-479e-9a16-44be6d54a6b0",
    "stamp": "2025-11-19T12:24:51.226Z",
    "action": "keycard.command.getDoors",
    "payload": {
        "chain": "4433",
        "property": "A1122"
    }
}
    "code": 0,

Response of door request:

Based on the “Response Payload” section, the fields with relevant information are:

  • code: Response code.
  • description: Provides technical details in case of an error.
  • end_user_message: Message to be displayed as a user-friendly message to the end user.
  • payload:
    • doors:
      • name: Room name.
      • type: Type of doors (Values: GuestDoor, CommonDoor, EntranceDoor, Elevator)

{
    "action": "keycard.command.getDoors",
    "code": 0,
    "description": "ok, getDoors command executed successfully: 3 doors received",
    "end_user_message": "",
    "id": "f21a9836-38f9-4170-901c-c6fec1a7770a",
    "payload": {
        "doors": [
            {
                "code": 0,
                "description": "",
                "id": 100,
                "name": "100",
                "pms_id": "",
                "type": "GuestDoor"
            },
            {
                "code": 0,
                "description": "",
                "id": 101,
                "name": "101",
                "pms_id": "",
                "type": "GuestDoor"
            },
            {
                "code": 0,
                "description": "",
                "id": 0,
                "name": "SPA",
                "pms_id": "",
                "type": "CommonDoor"
            }
        ]
    },
    "request_id": "1f8f6549-d98e-479e-9a16-44be6d54a6b0",
    "stamp": "2025-11-19T12:24:51.56571493Z"
}

Table of Contents