PMS Integration Guide for Roommatik Kiosks

Purpose: This document describes the RESTful API that a Property Management System (PMS) must implement so that Roommatik self-check-in kiosks can communicate with it. The kiosk acts as a client — your PMS is the server.



View Postman Collection

Import this collection to test the API endpoints directly.

Table of Contents

  1. Overview
  2. Authentication
  3. Standard Response Format
  4. Date Format
  5. Data Models
  6. Basic Module (Required)
  7. Walk-in Module (Optional)
  8. Upselling Module (Optional)
  9. Stay Module (Optional)
  10. Integration Requirements

1. Overview

The integration between a PMS and a Roommatik check-in kiosk is based on a series of HTTP requests/responses that provide the information needed by the kiosk to perform guest operations:

  • System date/time synchronization
  • Reservation lookup by booking code or guest surname
  • Guest registration from scanned identity documents
  • Payment registration (card, cash, or other methods)
  • Check-in and check-out operations
  • Room availability and pricing for walk-in guests
  • Upselling products and room upgrades

We strongly recommend implementing a RESTful JSON API. Other standards (SOAP, XML-RPC) and file-based communication are also supported — contact us for details.

2. Authentication

All requests include an API-Key header for authentication:

GET /v2/basic/DateTime HTTP/1.1
Host: your-pms-server.com
API-Key: your-api-key-here

3. Standard Response Format

Every endpoint must return a JSON response with the following structure:

{
    "returnCode": 0,
    "description": "Success",
    "result": { ... },
    "pmsMessage": null,
    "userMessage": null
}
Field Type Description
returnCode int 0 = success, negative values = error
description string Human-readable status description
result object / array / bool / null Response payload (varies per endpoint)
pmsMessage string | null Optional internal message for logging
userMessage string | null Optional message to display to the guest

4. Date Format

All dates use the format yyyyMMddTHHmm. Example: 20200414T1217 represents April 14, 2020 at 12:17.

Date-only fields use yyyyMMdd. Example: 19420618 represents June 18, 1942.

5. Data Models

5.1 Guest Object

Field Type Description
guestId string PMS guest identifier (null for new guests)
loyaltyId string | null Loyalty program identifier
firstName string First name
lastName1 string Surname
lastName2 string | null Second surname (if applicable)
nationality string ISO 3166-1 alpha-3 country code
birthdate string Date of birth (yyyyMMdd)
gender string "M" or "F"
idTypeName string Document type: C (driver license), X (EU residence permit), D (ID document), I (ID number), P (passport), N (Spanish residence permit)
idNumber string Document number
idIssueDate string Document issue date (yyyyMMdd)
idExpirationDate string Document expiration date (yyyyMMdd)
landline string Landline phone number
mobile string Mobile phone number
email string Email address
street string Street address
city string City
stateOrProvince string State or province
country string Country code (ISO 3166-1 alpha-3)
zipCode string Postal code
precheckin boolean Whether the guest completed online pre-check-in

Spanish Regulatory Fields

The following fields are mandatory for hotels operating in Spain, as required by the Traveller Registry regulations.
Field Type Description
documentSupportNumber string Unique alphanumeric code on the physical Spanish DNI
relationShip string Legal/familial relationship between main guest and any accompanying minors (e.g., "HJ" for son/daughter)
c_pro_ine string INE province code (e.g., "28" for Madrid, "08" for Barcelona)
c_mun_ine string INE municipality code (3-digit number unique within the province)

5.2 Room Type Object

Field Type Description
roomTypeId int / string Room type identifier
roomTypeName string Room type name (e.g., “Twin room”)
maxOccupancy int Maximum number of guests
description string Description of the room type

5.3 Room Object

Field Type Description
roomId string Room identifier
roomName string Room name/number (e.g., “101”)
status string Room status (e.g., “Confirmed”, “CheckIn”)
isAvailable boolean Whether the room is available for check-in
roomType object Room Type Object (see above)
guest array Array of Guest Objects assigned to this room

5.4 Reservation Component Object

Field Type Description
arrivalDateTime string Arrival date/time
departureDateTime string Departure date/time (used for key-card expiration)
numberOfAdults int Number of adult guests
numberOfChildren int Number of children
notes_remarks string Special requests or notes
price decimal Room price
deposit decimal Amount already paid as deposit
taxPrice decimal Tax amount
extrasPrice decimal Extras amount
currency string Currency code (e.g., “EUR”)
boardTypeId int / string Board type identifier
boardTypeName string Board type name (e.g., “AD”)
collectiveType string Collective type code
room object Room Object (see above)

5.5 Payment Types

Type Fields
cardPayment amount, currency, dateTime, accountNumber, securityCode, cardType (Mastercard, VISA, etc.)
cashPayment amount, currency, dateTime
genericPayment paymentType (e.g., “Bizum”), amount, currency, dateTime, transactionId



6. Basic Module (Required)

The basic module is the only module that must be implemented. It covers the core check-in flow: reservation lookup, guest registration, payment recording, and check-in execution.

6.1 DateTime

Retrieves the current date and time from the PMS. Used for time synchronization and health-check (verifying the PMS is up and running).

Method GET
URL /v2/basic/DateTime
Parameters None

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "pmsDateTime": "20200414T1217"
    },
    "pmsMessage": null,
    "userMessage": null
}

6.2 BookingFormId

Retrieves the registration form number generated by the PMS for a specific reservation-guest combination. This number will be printed on the registration form PDF generated by the kiosk.

Method GET
URL /v2/basic/BookingFormId

Query parameters:

Parameter Type Description
reservationId string Reservation identifier
guestId string Guest identifier

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "bookingFormId": "A/2022/123675"
    },
    "pmsMessage": null,
    "userMessage": null
}

6.3 Reservation

Validates a guest booking reference and retrieves the full reservation data. Supports search by booking code or by guest surname + departure date.

Method GET
URL /v2/basic/Reservation

Query parameters (option A — by booking code):

Parameter Type Description
bookingCode string Guest booking reference

Query parameters (option B — by surname):

Parameter Type Description
lastName string Guest surname
departure string Departure date (yyyyMMdd)
Important notes:

  • If there is no valid reservation for the given booking code, return an empty reservation in the result.
  • For multi-room reservations, the kiosk allows partial check-in. If the same reservation code is queried again, set isAvailable: false for rooms already checked-in to prevent duplication.
  • If the deposit value equals or exceeds the total price, the kiosk will not ask for additional payment.

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "reservationId": "1234",
        "totalPrice": 102.14,
        "currency": "EUR",
        "partialPaymentsAllowed": true,
        "reservationHolder": {
            "reservationHolderId": "ESB34567891",
            "name": "ACME SL",
            "lastName1": null,
            "lastName2": null,
            "isACompany": true
        },
        "reservationComponent": [
            {
                "arrivalDateTime": "20200108T1600",
                "departureDateTime": "20200109T1200",
                "numberOfAdults": 1,
                "numberOfChildren": 0,
                "notes_remarks": "guest requested a room in the lower floors",
                "price": 100,
                "deposit": 100,
                "taxPrice": 2.09,
                "extrasPrice": 100.05,
                "currency": "EUR",
                "boardTypeId": "1",
                "boardTypeName": "AD",
                "collectiveType": "001",
                "room": {
                    "roomId": "5436",
                    "roomName": "101",
                    "isAvailable": true,
                    "status": "Confirmed",
                    "roomType": {
                        "roomTypeId": "1",
                        "roomTypeName": "Twin room",
                        "maxOccupancy": 3,
                        "description": "Sea sight non-smoker"
                    },
                    "guest": [
                        {
                            "guestId": "58796",
                            "firstName": "Paul",
                            "lastName1": "McCartney",
                            "nationality": "UK",
                            "birthdate": "19420618",
                            "gender": "M",
                            "idTypeName": "D",
                            "idNumber": "53487956B",
                            "email": "[email protected]",
                            "precheckin": true
                        }
                    ]
                }
            }
        ]
    },
    "pmsMessage": null,
    "userMessage": null
}

6.4 NewGuest

Registers a new guest or updates an existing one in the PMS with identification data captured by the kiosk (typically from a scanned ID document or passport).

Method POST
URL /v2/basic/NewGuest

Request body:

{
    "reservationId": "1234",
    "roomId": "5436",
    "guest": {
        "guestId": null,
        "loyaltyId": "qwe3498",
        "firstName": "Adriano",
        "lastName1": "Celentano",
        "lastName2": null,
        "nationality": "ITA",
        "birthdate": "19380106",
        "gender": "M",
        "idTypeName": "D",
        "idNumber": "53487956B",
        "idIssueDate": "20010101",
        "idExpirationDate": "20110101",
        "landline": "+34987654321",
        "mobile": "+34654987321",
        "email": "[email protected]",
        "street": "via Cristoforo Gluck",
        "city": "Milano",
        "stateOrProvince": "Lombardía",
        "country": "ITA",
        "zipCode": "20125",
        "documentSupportNumber": "1234ABC",
        "relationShip": "HJ",
        "c_pro_ine": "20",
        "c_mun_ine": "100"
    }
}
Notes:

  • The guestId is always null in the request. The PMS returns the assigned ID in the response.
  • Data validation must be performed on the PMS side.
  • Empty fields are allowed and will be sent.
  • If the guest already exists in the PMS, their data should be updated.

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "guestId": 12345
    },
    "pmsMessage": null,
    "userMessage": null
}

6.5 TouristTax

Retrieves the local tourist tax. This endpoint is not necessary if the tax is already included in the price returned by the Reservation endpoint.

Method GET
URL /v2/TouristTax

Query parameters:

Parameter Type Description
arrivalDate string Arrival date (yyyyMMdd)
departureDate string Departure date (yyyyMMdd)
numberOfAdults int Number of adults
numberOfChildren int Number of children
roomTypeId int Room type identifier

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "price": 9.50,
        "currency": "EUR"
    },
    "pmsMessage": null,
    "userMessage": null
}

6.6 AddPayment

Records a payment made by the guest at the kiosk. The request can contain one or more payment types simultaneously (card, cash, and/or generic).

Method POST
URL /v2/basic/AddPayment

Request body:

{
    "reservationId": "123456",
    "roomId": "123",
    "paymentType": {
        "cardPayment": {
            "amount": 12.50,
            "currency": "EUR",
            "dateTime": "20200130T0551",
            "accountNumber": 0,
            "securityCode": null,
            "cardType": "Mastercard"
        },
        "cashPayment": {
            "amount": 25.00,
            "currency": "EUR",
            "dateTime": "20200130T0551"
        },
        "genericPayment": {
            "paymentType": "Bizum",
            "amount": 25.00,
            "currency": "EUR",
            "dateTime": "20200130T0551",
            "transactionId": "3409jpf0gddfs"
        }
    }
}

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": true,
    "pmsMessage": null,
    "userMessage": null
}

6.7 CheckIn (Execute)

Executes the check-in for a reservation and room.

Method POST
URL /v2/basic/CheckIn

Request body:

{
    "reservationId": "1234",
    "roomId": "5436"
}

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": true,
    "pmsMessage": null,
    "userMessage": null
}

6.8 CheckIn (Cancel)

Cancels a check-in if an error occurs during the process. The PMS must revert the check-in state.

Method DELETE
URL /v2/basic/CheckIn

Request body:

{
    "reservationId": "123ABC",
    "roomId": "5436"
}

Response: Standard response with result: null on success.

6.9 SelectedCultureName

Notifies the PMS of the language selected by the guest on the kiosk, so the PMS can adapt its responses accordingly.

Method PUT
URL /v2/basic/SelectedCultureName

Request body:

{
    "cultureName": "ES"
}

Response: Standard response with result: true on success.



7. Walk-in Module (Optional)

Implement this module if you want the kiosk to accept walk-in guests — guests without a prior reservation who want to book and check in directly at the kiosk.

7.1 GuestTypes

Retrieves the available guest types (e.g., Standard, Loyalty).

Method GET
URL /v2/GuestTypes
Parameters None

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "guestType": [
            { "guestTypeId": 1, "guestTypeName": "Standard" },
            { "guestTypeId": 2, "guestTypeName": "Loyalty" }
        ]
    },
    "pmsMessage": null,
    "userMessage": null
}

7.2 RoomTypes

Retrieves available room types with their availability status.

Method GET
URL /v2/RoomTypes
Parameters None

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "roomType": [
            {
                "roomTypeId": 1,
                "roomTypeName": "Individual",
                "maxOcuppancy": 1,
                "description": "Sea sight non-smoker",
                "isAvailable": true
            },
            {
                "roomTypeId": 2,
                "roomTypeName": "Double",
                "maxOcuppancy": 1,
                "description": "Sea sight non-smoker",
                "isAvailable": true
            },
            {
                "roomTypeId": 4,
                "roomTypeName": "Junior Suite",
                "maxOcuppancy": 1,
                "description": "Sea sight non-smoker",
                "isAvailable": false
            }
        ]
    },
    "pmsMessage": null,
    "userMessage": null
}

7.3 BoardTypes

Retrieves available board types (meal plans) with pricing.

Method GET
URL /v2/BoardTypes

Query parameters:

Parameter Type Description
RoomTypeId int Room type identifier
NumberGuests int Number of guests
Nights int Number of nights

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "boardType": [
            {
                "boardTypeId": 1,
                "boardTypeName": "AD",
                "description": "bed & breakfast",
                "isAvailable": true,
                "price": 100
            },
            {
                "boardTypeId": 2,
                "boardTypeName": "MP",
                "description": "half board",
                "isAvailable": true,
                "price": 200
            }
        ]
    },
    "pmsMessage": null,
    "userMessage": null
}

7.4 TimeSlots

Retrieves available time slot options for the stay.

Method GET
URL /v2/TimeSlots
Parameters None

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "timeSlots": [
            {
                "timeSlotId": 43,
                "timeSlotName": "12 hours",
                "description": "only for some kind of guests",
                "isAvailable": true
            },
            {
                "timeSlotId": 1,
                "timeSlotName": "1 night",
                "description": "check-in from 22:00 and check-out before 12:00",
                "isAvailable": true
            }
        ]
    },
    "pmsMessage": null,
    "userMessage": null
}

7.5 Rates

Retrieves available rate plans.

Method GET
URL /v2/Rates
Parameters None

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": [
        { "rateId": 1, "name": "Rack rate", "isAvailable": true },
        { "rateId": 2, "name": "Group rate", "isAvailable": true },
        { "rateId": 3, "name": "Family rate", "isAvailable": true }
    ],
    "pmsMessage": null,
    "userMessage": null
}

7.6 TotalPrice

Calculates the total price for a given combination of parameters.

Method GET
URL /v2/TotalPrice

Query parameters:

Parameter Type Description
arrivalDate string Arrival date (yyyyMMdd)
numberOfNights int Number of nights
roomTypeId int Room type ID
numberOfAdults int Number of adults
numberOfChildren int Number of children
boardTypeId int Board type ID
timeSlotId int Time slot ID
rateId int Rate plan ID
If there is no availability for the given combination, return an empty result.

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "stayPrice": 100.0,
        "currency": "EUR"
    },
    "pmsMessage": null,
    "userMessage": null
}

7.7 Walk-in CheckIn

Creates a new reservation and performs the check-in for a walk-in guest in a single operation.

Method POST
URL /v2/walk-in/CheckIn

Request body:

{
    "roomTypeId": 1,
    "arrival": "20200108T1600",
    "departure": "20200110T1600",
    "numberOfAdults": 1,
    "numberOfChildren": 0,
    "notes_remarks": "guest requested a room in the lower floors",
    "price": 100,
    "outstanding": 0,
    "currency": "EUR",
    "boardTypeId": 0,
    "guests": [
        {
            "guestId": null,
            "firstName": "Adriano",
            "lastName1": "Celentano",
            "nationality": "ITA",
            "birthdate": "19380106",
            "gender": "M",
            "idTypeName": "D",
            "idNumber": "53487956B",
            "idIssueDate": "20010101",
            "idExpirationDate": "20110101",
            "email": "[email protected]",
            "country": "ITA",
            "documentSupportNumber": "1234ABC",
            "relationShip": "HJ"
        }
    ]
}

Response: Returns the full reservation data (same structure as the Reservation endpoint response), including the assigned room and reservation ID.



8. Upselling Module (Optional)

Implement this module to offer guests room upgrades and additional services (spa, breakfast, airport shuttle, etc.) during the check-in process at the kiosk.

8.1 RoomUpgradeOptions

Retrieves available room upgrade options for a given reservation.

Method GET
URL /v2/upselling/RoomUpgradeOptions

Query parameters:

Parameter Type Description
reservationId string Reservation identifier
roomId string Current room identifier

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": [
        {
            "roomType": {
                "roomTypeId": 1,
                "roomTypeName": "Twin room",
                "maxOccupancy": 3,
                "description": "Sea sight non-smoker",
                "isAvailable": true
            },
            "priceIncrement": 25.00,
            "touristTaxIncrement": 1.00,
            "currency": "EUR"
        },
        {
            "roomType": {
                "roomTypeId": 4,
                "roomTypeName": "Presidential suite",
                "maxOccupancy": 6,
                "description": "Sea sight non-smoker",
                "isAvailable": true
            },
            "priceIncrement": 35.00,
            "touristTaxIncrement": 5.00,
            "currency": "EUR"
        }
    ],
    "pmsMessage": null,
    "userMessage": null
}

8.2 UpsellingOptions

Retrieves available upselling services (e.g., breakfast, spa, airport shuttle).

Method GET
URL /v2/upselling/UpsellingOptions

Query parameters (all optional):

Parameter Type Description
bookingCode string Booking reference
roomId string Room identifier
RoomTypeId string Room type ID
Arrival string Arrival date
Departure string Departure date

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": [
        {
            "upsellingId": "s1",
            "name": "Continental breakfast",
            "description": "The best continental breakfast you have ever tasted",
            "price": 8.50,
            "currency": "EUR",
            "isAService": false,
            "startDateTime": null,
            "endDateTime": null,
            "minUnits": 1,
            "maxUnits": 1,
            "appliesPerGuest": true,
            "appliesPerDay": true
        },
        {
            "upsellingId": "s3",
            "name": "Airport shuttle",
            "description": "Enjoy our airport ride at the most affordable prices",
            "price": 50.00,
            "currency": "EUR",
            "isAService": true,
            "startDateTime": null,
            "endDateTime": null,
            "minUnits": 1,
            "maxUnits": 1,
            "appliesPerGuest": false,
            "appliesPerDay": false
        }
    ],
    "pmsMessage": null,
    "userMessage": null
}

Upselling field reference:

Field Type Description
isAService boolean If true, the item is a bookable service with date/time slots
appliesPerGuest boolean If true, price is per guest (multiplied by number of guests)
appliesPerDay boolean If true, price is per day (multiplied by number of nights)

8.3 Upselling (Execute)

Confirms the selected upselling products for a reservation.

Method POST
URL /v2/upselling/Upselling

Request body:

{
    "bookingCode": "ABC123",
    "roomId": "123",
    "guestId": "3",
    "upsellingProduct": [
        {
            "upsellingId": 1,
            "count": 1,
            "startDateTime": "20222601T1700",
            "endDateTime": "20222601T1900"
        },
        {
            "upsellingId": 2,
            "count": 1,
            "startDateTime": null,
            "endDateTime": null
        }
    ]
}

Response: Standard response with result: null on success.

8.4 ExtraChargeToFolio

Adds extra charges to the guest folio (for items purchased outside the standard upselling flow).

Method POST
URL /v2/upselling/ExtraChargeToFolio

Request body:

{
    "bookingCode": "ABC123",
    "extraCharge": [
        {
            "roomId": 123,
            "guestId": 3,
            "concept": "golf lesson",
            "count": 1,
            "netAmount": 100.00,
            "taxAmount": 21.00,
            "grossValue": 121.00,
            "currency": "EUR",
            "startDateTime": "20222601T1700",
            "endDateTime": "20222601T1900",
            "chargeReference": "3ew6eg3-1245g44"
        }
    ]
}

Response: Standard response with result: null on success.



9. Stay Module (Optional)

Implement this module to allow guests to manage their stay from the kiosk: view current stay details, extend the stay, and perform check-out.

9.1 Stay

Retrieves the current stay data for a room.

Method GET
URL /v2/Stay

Query parameters (one of):

Parameter Type Description
roomId string Room identifier
roomName string Room name/number

Response example:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "roomId": "5436",
        "roomName": "101",
        "roomTypeId": 1,
        "roomTypeName": "Twin room",
        "description": "Sea sight non-smoker",
        "adults": 1,
        "children": 0,
        "isAvailable": false,
        "status": "CheckIn",
        "price": 100,
        "deposit": 90,
        "currency": "EUR",
        "boardTypeId": 1,
        "boardTypeName": "AD",
        "guests": [
            {
                "guestId": 1476,
                "firstName": "Joaquín Ramón",
                "lastName1": "Martínez",
                "lastName2": "Sabina",
                "nationality": "ESP",
                "birthdate": "19490212",
                "gender": "M",
                "idTypeName": "D",
                "idNumber": "53487956B",
                "email": "[email protected]",
                "city": "Madrid",
                "country": "ESP"
            }
        ]
    },
    "pmsMessage": null,
    "userMessage": null
}

9.2 ExtendStayOption

Checks whether a stay can be extended and returns the price increment.

Method GET
URL /v2/ExtendStayOption

Query parameters:

Parameter Type Description
reservationCode string Reservation code
roomName string Room name
nights int Number of additional nights

Success response:

{
    "returnCode": 0,
    "description": "Success",
    "result": {
        "totalPriceIncrement": 80.0,
        "totalTouristTaxIncrement": 4.00,
        "currency": "EUR"
    },
    "pmsMessage": null,
    "userMessage": null
}

Not possible response:

{
    "returnCode": -1,
    "description": "The stay can not be extended",
    "result": null,
    "pmsMessage": null,
    "userMessage": null
}

9.3 ExtendStay

Confirms the stay extension.

Method POST
URL /v2/ExtendStay

Request body:

{
    "reservationCode": "1234",
    "roomName": "101",
    "nights": "2"
}

Response: Standard response with returnCode: 0 on success, returnCode: -1 on failure.

9.4 CheckOut

Performs the check-out for a room. The kiosk verifies there are no pending charges (via the Stay endpoint) before calling this.

Method POST
URL /v2/CheckOut

Request body:

{
    "bookingCode": "123456",
    "roomId": "1234",
    "roomName": "101"
}
Error codes for CheckOut:

  • returnCode: 0 — Check-out successful
  • returnCode: -1 — Room name not found
  • returnCode: -2 — Booking code not found
  • returnCode: -3 — Booking code and room name do not match

10. Integration Requirements

To begin the integration and testing process, please provide us with:

  1. A testing URL — A base URL where we can reach your API endpoints (e.g., https://api.your-pms.com)
  2. API documentation — Method definitions with input/output parameters. Ideally a Swagger or Postman collection with examples.
  3. Test credentials — An API key and test reservation data we can use during development.
Need help? Contact our integration team at [email protected] for support during the development process.