PMS Integration Guide for Roommatik Kiosks
View Postman Collection
Import this collection to test the API endpoints directly.
Table of Contents
- Overview
- Authentication
- Standard Response Format
- Date Format
- Data Models
- Basic Module (Required)
- Walk-in Module (Optional)
- Upselling Module (Optional)
- Stay Module (Optional)
- 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
| 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)
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) |
- 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: falsefor rooms already checked-in to prevent duplication. - If the
depositvalue 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"
}
}
- The
guestIdis alwaysnullin 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)
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 |
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)
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)
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"
}
returnCode: 0— Check-out successfulreturnCode: -1— Room name not foundreturnCode: -2— Booking code not foundreturnCode: -3— Booking code and room name do not match
10. Integration Requirements
To begin the integration and testing process, please provide us with:
- A testing URL — A base URL where we can reach your API endpoints (e.g.,
https://api.your-pms.com) - API documentation — Method definitions with input/output parameters. Ideally a Swagger or Postman collection with examples.
- Test credentials — An API key and test reservation data we can use during development.
