Download OpenAPI specification:Download
This document outlines the API of Termino, utilized by Slevomat to enable the sale of online bookings on Slevomat.cz and Zlavomat.sk. This API is used for connecting channel management (CM) and property management systems (PMS).
Note: This API does not cover the synchronization of prices (rate plans), payments, or cancellation policies. These elements are beyond the scope of this API's functionalities.
This API is bi-directional, meaning both sides can request or push information to the other's API. Given that this API covers various system setups, there are multiple ways to establish communication. The synchronization of hotel structure and capacities is typically achieved by CM/PMS pushing information to Termino. A periodic pull of capacity information can also be configured, but push is preferred as it facilitates faster change propagation and reduces traffic between systems.
Typical usage for channel managers includes:
reservation
and ping
endpoints on your sidecapacities-update
endpoint to push capacity changesget-hotel
endpoint to retrieve the hotel structure and set up the connectionFor property management systems, the typical usage involves:
hotel
, reservation
, and get-reservation
endpoints. The ping
endpoint is not needed because the hotel
endpoint should provide the same information (whether the hotel is active or not).capacities
on your side or calling the capacities-update
push endpoint on Termino to deliver updates.All requests are required to communicate over HTTPS. Termino API endpoints support TLS protocol versions 1.2 and higher.
All requests contain the property accessToken
with a value assigned during the API verification process. These values identify the communicating parties - CM/PMS on one side and Termino on the other.
Both sides accept only HTTP POST
. Requests and responses are sent with the Content-Type
header set to application/json
and a JSON body depending on the operation to be performed. Content encoding is always UTF-8
.
If a message is received and processed, the HTTP response code should be 200 OK
for successful results and any 4xx
for unsuccessful results (the concrete error type is described in the response body).
5xx
response codes indicate unexpected and internal errors, and the request can be retried without change. No specific response should be expected for server errors (JSON is not guaranteed). The response header Retry-After
(if present) should be respected for retrying the request.
The type of message is determined by the URL.
For push endpoints, the request should be repeated until it is successfully delivered to Termino. Similarly, Termino will repeat requests until they are accepted by your system. Successful delivery means either responding with success or an expected error described in the API specification.
Each reservation has to have a unique ID for reference between systems. This identifier is later used in case of modification and cancellation of the reservation is needed. Termino can either generate and send our identifier with reservation creation, or it can accept and later use the reservation ID returned in response. Using the ID from Termino is preferred because it allows us to reference the reservation even in case this create request fails with a timeout or other unexpected error. When using your ID, another system or manual intervention is needed in this case.
{
"accessToken": "foobar",
// other properties
}
{
"success": true,
}
{
"error": {
"code": "invalid-access-token",
"message": "Access token not found."
}
}
These errors can occur on any API endpoint.
Code | Description |
---|---|
invalid-format |
Unparsable JSON |
missing-value |
A required property is missing. |
invalid-value |
A property has invalid format (e.g., wrong date, time, datetime, interval, URL...). |
invalid-access-token |
Invalid or expired access token |
Changes to API and its documentation
reservation.children
)reservation.meal
)reservation.contact.email
)occupations
and occupations-update
endpoints to be used for blockages. Use capacities instead.rooms
parameter from RoomType structure. Only roomCount
parameter is now needed to define room type structureroomId
parameter from Occupation and Reservation structure. Only roomTypeId
parameter is now needed to define occupationEndpoints on Termino side are called from PMS/CM system and mostly used to push data changes. If unsuccessful response is returned, the request has to be repeated until it is successfully delivered to Termino.
Synchronization of changed reservations on the hotel side.
It is deprecated to send updates for other reservations then those created by Termino/Slevomat.
Usage:
Updates of occupations in multiple hotels has to be sent in multiple requests.
accessToken required | string Access token to your API. |
required | string or integer Hotel id. |
required | Array of objects (Occupation) List of updated occupations. |
{- "accessToken": "string",
- "hotelId": "string",
- "occupations": [
- {
- "id": "string",
- "type": "reservation",
- "status": "string",
- "roomId": "string",
- "roomTypeId": "string",
- "created": "2019-08-24T14:15:22Z",
- "term": {
- "start": "2019-08-24",
- "end": "2019-08-24"
}
}
]
}
{- "success": true
}
Synchronization of changed capacities
Usage:
accessToken required | string Access token to your API. |
required | string or integer Your hotel id. |
required | Array of objects (Capacity) List of updated capacities. |
{- "accessToken": "string",
- "hotelId": "string",
- "capacities": [
- {
- "roomTypeId": 123,
- "interval": {
- "start": "2019-08-24",
- "end": "2019-08-24"
}, - "availableRooms": 5
}
]
}
{- "success": true
}
Synchronization of changed hotel info and structure.
Usage:
accessToken required | string Access token to your API. |
required | object (Hotel) |
Array of objects (RoomType) Updated room types. |
{- "accessToken": "string",
- "hotel": {
- "id": "123456",
- "name": "Hotel Example",
- "address": {
- "street": "Pernerova 691",
- "city": "Praha 8",
- "country": "CZ"
}
}, - "roomTypes": [
- {
- "id": "123456",
- "name": "Double room",
- "beds": 2,
- "extraBeds": 1,
- "roomsCount": 10,
- "rooms": [
- {
- "id": "125",
- "name": "Room 125"
}
]
}
]
}
{- "success": true
}
Provides same information as /hotel endpoint, but in reversed direction. This endpoint is called by CM to load room types created on Termino side and set up mapping.
accessToken required | string Access token to your API. |
required | string or integer Hotel id. |
{- "accessToken": "string",
- "hotelId": "string"
}
{- "hotel": {
- "id": "123456",
- "name": "Hotel Example",
- "address": {
- "street": "Pernerova 691",
- "city": "Praha 8",
- "country": "CZ"
}
}, - "roomTypes": [
- {
- "id": "123456",
- "name": "Double room",
- "beds": 2,
- "extraBeds": 1,
- "roomsCount": 10,
- "rooms": [
- {
- "id": "125",
- "name": "Room 125"
}
]
}
]
}
Partner endpoints should be implemented in your PMS/CM system and are called by Termino, either periodically or when specific action is performed (eg. new reservation, hotel connection).
Information about hotel for registration process and structure of room type and rooms.
Usage:
accessToken required | string Access token for authorization |
required | string or integer Your hotel id |
{- "accessToken": "aa5ae844-051c-4d30-9c67-54b70c99b580",
- "hotelId": "123456"
}
{- "hotel": {
- "id": "123456",
- "name": "Hotel Example",
- "address": {
- "street": "Pernerova 691",
- "city": "Praha 8",
- "country": "CZ"
}
}, - "roomTypes": [
- {
- "id": "123456",
- "name": "Double room",
- "beds": 2,
- "extraBeds": 1,
- "roomsCount": 10,
- "rooms": [
- {
- "id": "125",
- "name": "Room 125"
}
]
}
]
}
Synchronizing available space.
Usage:
accessToken required | string Access token to your API. |
required | string or integer Hotel id. |
required | object (DateInterval) |
Array of strings or integers Requested room type ids. When not provided, return capacities for all room types of given hotel. |
{- "accessToken": "string",
- "hotelId": "string",
- "interval": {
- "start": "2019-08-24",
- "end": "2019-08-24"
}, - "roomTypeIds": [
- "string"
]
}
{- "capacities": [
- {
- "roomTypeId": 123,
- "interval": {
- "start": "2019-08-24",
- "end": "2019-08-24"
}, - "availableRooms": 5
}
]
}
Creating new reservations, updating reservations, canceling reservations.
Behavior of this endpoint heavily depends on the agreed scheme of communication:
The default scheme is "dual requests" - the first request contains status: option
and does not contain customer data. The second request contains status: confirmed
and includes customer data. This scheme allows more gradual control of the state of the reservation. Both statuses are expected to block the room for the reservation.
The second option is "single request" - in this scheme, even the first request with status: option
contains all customer data and the voucher code. The confirmation request is sent also with the same data but does not have to be relayed to the hotel. Single-request mode is more suited for systems which do not support modifying existing reservations without canceling them and creating a new one (OTA-like behavior). You should specify which behavior better suits your system capabilities when consulting the integration with Termino.
For referencing reservations between Termino and your system, either your ID or our ID can be used. In case your ID is used, the first (option
) request does not contain the property id
. You have to generate and send it in response.
In case our ID is used, the first (option
) request contains the property id
with our ID. You have to store it and use it in all subsequent requests.
Using your ID can be problematic in case communication during the first request fails due to any unexpected error (timeout, outage, etc.). This may cause a reservation being created in your system, but not in Termino. That's why we prefer using our ID, which we can use to check and remove such un-synced reservation.
Termino expects the room to be blocked for reservation when the option
request is successfully processed.
option
and then confirmed
when creating a new reservation (see above)canceled
status to cancel the reservationGrouped reservations are currently not implemented; one request always contains only one reservation. Reservation group ID is the same as reservation ID. Reservation response should contain the same data as the request.
accessToken required | string Access token to your API. |
required | string or integer Your hotel id. |
required | object (ReservationGroup) |
{- "accessToken": "11-11-11-11",
- "hotelId": 123456,
- "reservationGroup": {
- "id": 123456,
- "description": "New Year's Eve 2019",
- "totalPrice": {
- "amount": 1000,
- "currency": "CZK"
}, - "reservations": [
- {
- "id": 123456,
- "status": "option",
- "roomTypeId": 123,
- "term": {
- "start": "2019-01-01",
- "end": "2019-01-02"
}, - "price": {
- "amount": 1000,
- "currency": "CZK"
}, - "adultsCount": 2,
- "children": [
- {
- "age": 5,
- "bedEntitlement": true
}
], - "guestNote": "I would like to have a room with a view.",
- "voucher": "1234567890",
- "contact": {
- "name": "John Doe",
- "phone": "+420123456789"
}
}
]
}
}
{- "hotelId": "string",
- "accessToken": "string",
- "reservationGroup": {
- "id": "string",
- "description": "string",
- "reservations": [
- {
- "id": "string",
- "status": "option",
- "roomTypeId": "string",
- "roomId": "string",
- "term": {
- "start": "2019-08-24",
- "end": "2019-08-24"
}, - "price": {
- "amount": "string",
- "currency": "string"
}, - "meal": "none",
- "adultsCount": 0,
- "childrenCount": 0,
- "children": [
- {
- "age": 0,
- "bedEntitlement": true
}
], - "guestNote": "string",
- "voucher": "string",
- "contact": {
- "name": "string",
- "phone": "string",
- "email": "string"
}
}
], - "totalPrice": {
- "amount": "string",
- "currency": "string"
}
}
}
Request for current state of the reservation
Usage:
accessToken required | string Access token to your API. |
required | string or integer Hotel id. |
required | string or integer Reservation id. |
{- "accessToken": "string",
- "hotelId": "string",
- "reservationId": "string"
}
{- "id": "string",
- "status": "option",
- "roomTypeId": "string",
- "roomId": "string",
- "term": {
- "start": "2019-08-24",
- "end": "2019-08-24"
}, - "price": {
- "amount": "string",
- "currency": "string"
}, - "meal": "none",
- "adultsCount": 0,
- "childrenCount": 0,
- "children": [
- {
- "age": 0,
- "bedEntitlement": true
}
], - "guestNote": "string",
- "voucher": "string",
- "contact": {
- "name": "string",
- "phone": "string",
- "email": "string"
}
}
This endpoint was previously used as alternative to /capacities
. This usage is deprecated. Use capacities instead.
Synchronization of changes in reservations created by Termino/Slevomat. This allows changes in reservation made in PMS to be propagated to Termino and Slevomat. Changes can also be pushed via /occupations-update endpoint.
Usage:
accessToken required | string Access token to your API. |
required | string or integer Your hotel id. |
required | object (DateInterval) |
Array of strings or integers Filter occupations on given room types. |
{- "accessToken": "string",
- "hotelId": "string",
- "interval": {
- "start": "2019-08-24",
- "end": "2019-08-24"
}, - "roomTypeIds": [
- "string"
]
}
{- "occupations": [
- {
- "id": "string",
- "type": "reservation",
- "status": "string",
- "roomId": "string",
- "roomTypeId": "string",
- "created": "2019-08-24T14:15:22Z",
- "term": {
- "start": "2019-08-24",
- "end": "2019-08-24"
}
}
]
}
Ping endpoint is used to check if hotel exists and synchronization is active on your side.
If you implement /hotel endpoint, you can ignore this endpoint.
Usage:
accessToken required | string Access token to your API. |
required | string or integer Hotel id. |
{- "accessToken": "string",
- "hotelId": "string"
}
{- "success": true
}