We won't cover the specific calls for them you can refer to our dynamics reference
in
the homepage.
Here we will try to give a bit of context about how integrate your OTA as a partner
for Octorate using also our APIs.
Inside our system, every accommodation connect the OTAs he want to connect.
For your case you will use the both the leverage of our admin api operations to create a new "Portal" entity inside our system.
We will react in a special way afterwards letting you receive content and availability
Property Name | Description |
Logo (Icon) | Inside our system in many points we show a small icon (that's normally a square)
to let the user recognize your portal. Since the experience will be very ugly otherwise, we ask you this field as mandatory. Please provide the url to a JPG or PNG image here, we will upload on our server. |
Banner | Inside the list of portals we show an horizontal rectangle that helps
user to recognize your portal Please provide the url to a JPG or PNG image here, we will upload on our server |
Internal Name | You can choose an identifier for your connection, should be something without spaces that we will use as ID. You are not allowed to change it after it has been created. |
Display Name | Please specify the name for your connection here. We will show this to your customer. |
Color (Hex) | Hexadecimal value (like #c5c5c5) of the color of this connection. Useful for recognize the portal in the calendar of the reservations |
calendarValues | What kind of values do you are able to handle? Set as null if you don't expect to receive any data or rooms and availability. |
ContentMetas | What kind of values do you expect to receive from customers as content? We
suggest you to enable everything in developing phase and in the tests properties
you will see a bug icon with the alt text of the name of the tag that you may
want to remove after. If you leave empty (not null, the key should not compare) in the first POST, we will enable everything. Set array of values to enable content fields, explicitly set as null to disable all content fields. |
In order to receive contents and prices you should add a new Portal inside Octorate.
You should create them according to the info of your site, an example of "Portal", available for all the customers would be "Booking.com".We will notify the informations regarding the connection in the links you provide
us.
In order to do it, please subscribe to these events:
CONTENT_PUSH To receive content from Octorate,
PORTAL_SUBSCRIPTION_CALENDAR To receive Prices, Rates and Minstay from our calendar
We support these type of rejections and params, please follow this table to understand how to reject the information
Please, in case something went wrong, reply with the http status 500 if you don't know how to handle the failure, or 4xx in case you know how
You can provide the complete list of the errors marshalling them as list. I.e. {data:[{...},{...}]}RejectionType | Description | Accepted Params | Example in frontend | Small (complete) example |
RejectLength | The specified field cannot be validated because doesn't respect the expected length |
field the label of the field message the label of the message type use one of CONTACT, GENERIC, CANC_POLICY, DESCRIPTION, EXTRA, PICTURE, SERVICE, FEE, AMENITY, ROOM, ACCOMMODATION, RATE, RESERVATION, SUBROOMS, REGULATION, RULES, PRODUCT_BENEFIT, CANC_POLICY_DEPOSIT max (boolean) set true if the value is over the limit, false is below length the expected length userProvided what the user have provided (optional) typeClass set always as RejectLength |
(Inside the description content part) The element 'description' should be at least of 400 characters. You have specified only 200. | { "userProvided":3, "field":"url", "max":true, "length":300, "message":"labelUrl", "type":"GENERIC", "typeClass":"RejectLength" } |
RejectRequired | The specified field is required and the user has not given it | field the label of the field message the label of the message type use one of CONTACT, GENERIC, CANC_POLICY, DESCRIPTION, EXTRA, PICTURE, SERVICE, FEE, AMENITY, ROOM, ACCOMMODATION, RATE, RESERVATION, SUBROOMS, REGULATION, RULES, PRODUCT_BENEFIT, CANC_POLICY_DEPOSIT |
The element 'description' is required. | |
RejectInvalid | The content of that field cannot be accepted | field the label of the field message the label of the message type use one of CONTACT, GENERIC, CANC_POLICY, DESCRIPTION, EXTRA, PICTURE, SERVICE, FEE, AMENITY, ROOM, ACCOMMODATION, RATE, RESERVATION, SUBROOMS, REGULATION, RULES, PRODUCT_BENEFIT, CANC_POLICY_DEPOSIT |
The checkin time you have inserted (13.00) is not supported by AppName. | |
RejectConfiguration | The property configuration is not good | field the label of the field message the label of the message currentValue you can specify here what you were expecting type use one of CONTACT, GENERIC, CANC_POLICY, DESCRIPTION, EXTRA, PICTURE, SERVICE, FEE, AMENITY, ROOM, ACCOMMODATION, RATE, RESERVATION, SUBROOMS, REGULATION, RULES, PRODUCT_BENEFIT, CANC_POLICY_DEPOSIT |
(Usually with content generic/section generic): Please before pushing this listing, configure a valid payment method inside AppName | |
RejectLang | The field in that language, cannot be accepted | field the label of the field lang the code of the language in iso code. secondary another RejectValue like RejectLength to describe the field that having the issue. This will be appended to the first text message the label of the message type use one of CONTACT, GENERIC, CANC_POLICY, DESCRIPTION, EXTRA, PICTURE, SERVICE, FEE, AMENITY, ROOM, ACCOMMODATION, RATE, RESERVATION, SUBROOMS, REGULATION, RULES, PRODUCT_BENEFIT, CANC_POLICY_DEPOSIT |
The element 'description' is language EN is not valid. (secondary) The element 'description' should be at least of 400 characters. You have specified only 200 | { "field":"$.description.name[it]", "message":"labelDescription", "type":"DESCRIPTION", "lang":"IT", "typeClass":"RejectLang" "secondary": { "typeClass":"RejectLenght", "userProvided":5, "field":"$.description.name[it]", "max":true,"length":200, "message":"labelDescription", "type":"DESCRIPTION" } } |
RejectListItem | An element to a particular position cannot be accepted (i.e. you can say the 3rd photo is not valid) | field the label of the field message the label of the message secondary another RejectValue like RejectLength type use one of CONTACT, GENERIC, CANC_POLICY, DESCRIPTION, EXTRA, PICTURE, SERVICE, FEE, AMENITY, ROOM, ACCOMMODATION, RATE, RESERVATION, SUBROOMS, REGULATION, RULES, PRODUCT_BENEFIT, CANC_POLICY_DEPOSIT |
The 3rd element of the list of fee is not valid. |
When you subscribe to the PORTAL_SUBSCRIPTION_CALENDAR event, we will notify all the changes inside our calendar.
We have an optimizer that will group these changes by room and period of dates.
An example of the request we will send you will be like this.
{
"content":"
{
\"data\":[
{
\"id\":225214,
\"name\":\"Apartment 2 pax\",
\"days\":[
{
\"availability\":1,
\"closeToArrival\":true,
\"closeToDeparture\":false,
\"cutOffDays\":0,
\"days\":[
\"2020-12-05\",\"2020-12-06\",\"2020-12-07\",\"2020-12-08\",\"2020-12-09\",\"2020-12-10\",\"2020-12-11\",\"2020-12-12\",\"2020-12-13\",\"2020-12-14\",\"2020-12-15\",\"2020-12-16\",\"2020-12-17\",\"2020-12-18\",\"2020-12-19\",\"2020-12-20\",\"2020-12-21\",\"2020-12-22\",\"2020-12-23\",\"2020-12-24\"
],
\"maxStay\":99,
\"minStay\":1,
\"price\":0.00,
\"stopSells\":false
},
{
\"availability\":2,
\"closeToArrival\":true,
\"closeToDeparture\":false,
\"cutOffDays\":0,
\"days\":[
\"2020-11-27\",\"2020-11-28\",\"2020-11-29\",\"2020-11-30\",\"2020-12-01\",\"2020-12-02\",\"2020-12-03\",\"2020-12-04\"],
\"maxStay\":99,
\"minStay\":1,
\"price\":105.00,
\"stopSells\":false
}
]
}
]
}
",
"createTime":"2020-11-27T18:47:18.19Z[UTC]",
"reference":"77370",
"retry":14,
"subscription":{
"apiMember":359,
"createTime":"2020-11-27T10:43:46Z[UTC]",
"endpoint":"http://localhost:8080/connect/rest/utility/webhooks",
"id":488,
"type":"PORTAL_SUBSCRIPTION_CALENDAR"
},
"type":"PORTAL_SUBSCRIPTION_CALENDAR"
}
Reply with 200 if you have processed correctly the request
Reply anything except 200, if you're not able to process the request. We will retry the call at least one time if you don't provide 5xx status codes.
Please be aware: You must reply in short times, otherwise we will consider the http request as failed. So don't do anything time expensive here, but if requires more than some minutes, schedule it asynchronously.
In order to prevents overbooking we have developed an endpoint that we will check in that exact moment if the calendar is open for the given Octorate Product - Checkin Date - Checkout Date.
Please use that endpoint otherwise we won't consider the analysis of an overbooking.
Either if the customer has enabled a super special calendar params, that you cannot actually support, we will reject the call in this case, but this is the behavior expected since the property has denied this date. If you ask the PM to improve the booking experience you can ask the PM to not use these params.
You can see them opening the calendar, clicking a day. A window will popup, check also the "advanced params".
You can either check them by the values supported when creating a new portals, inside our documentation (check the model of the portal)
Creating a reservations doesn't have any special recommendations.
Remember only that if you want the reservations appear with your logo, specify your channel ID to registered as yours.
Cancelling reservations is an action that's expected to be done on your side.
We follow strict security requirements for credit cards (PSD2 european normative), so we cannot directly take credit cards. You can check the addCard method to get an idea, but you will need to contact us to accredit you in the secure channel
To go live we expect you to...