Porte compatible Cyberesa
Cette porte reproduit l'api XML de Cyberesa : mêmes messages, mêmes conventions. Si votre système consomme déjà un fournisseur Cyberesa, il fonctionne contre la passerelle sans modification.
Transport
- URL — un
POSTunique,Content-Type: application/x-www-form-urlencoded. - Champ —
strRQ: la chaîne XML complète (fragment sans<?xml?>, sans namespace ; la racine porte le nom du message et sert de dispatch). - Réponse — toujours HTTP 200 + XML valide, sans CDATA.
cURL
curl -s -X POST "https://partners.bravebooking.net/api/cyberesa" \
--data-urlencode "strRQ=<HotelSearchREQ>…</HotelSearchREQ>"
Conventions
<Credential><Login>…</Login><Password>…</Password></Credential>— toujours en premier enfant de la racine.<User>— votre identifiant numérique d'agence.- Dates
d/m/Ypartout (recherches comme politiques d'annulation). - Booléens en chaînes
'True'/'False';Available = 'Disponible'(exact) pour vendable. - Erreurs métier —
<Error><Message>…</Message></Error>,<Error>…</Error>ou<ErrorResult><Message>…</Message></ErrorResult>, toujours en HTTP 200.
Exemples complets
HotelSearchREQ
Requête — strRQ
<HotelSearchREQ>
<Credential>
<Login>demo_cy_login</Login>
<Password>demo_cy_password</Password>
</Credential>
<SearchDetails>
<BookingDetails>
<User>12345</User>
<Language>fr</Language>
<FromDate>15/01/2027</FromDate>
<ToDate>20/01/2027</ToDate>
<IdCity>146070</IdCity>
<Timeout>7000</Timeout>
<Rooms>
<Room id="1">
<Pax>
<Adult>2</Adult>
<Child age="3-5">2</Child>
</Pax>
<Boarding></Boarding>
</Room>
</Rooms>
</BookingDetails>
<Filters>
<PriceBreakDown>False</PriceBreakDown>
<Sort><By></By></Sort>
<hotels_ids>1803258</hotels_ids>
</Filters>
</SearchDetails>
</HotelSearchREQ>
La réponse porte Hotels/@attributes.count, Hotels/Hotel/@attributes.id, Hotel/ThumbImage/@attributes.url, Hotel/rooms/room (attributs id, count ; Title, Adult, Child, AvailableQuantity) et room/Boardings/Boarding (attribut id ; Title, Rate, RateWithoutPromotion, Available=Disponible, NonRefundable=True|False, CancellationPolicy/FromDate|Fee).
HotelQuoteREQ
Le devis vérifie le prix et produit le QuoteId + IdToken nécessaires à la réservation.
Requête — strRQ
<HotelQuoteREQ>
<Credential>
<Login>demo_cy_login</Login>
<Password>demo_cy_password</Password>
</Credential>
<Details>
<User>12345</User>
<Language>fr</Language>
<Currency>TND</Currency>
<IdHotel>1803258</IdHotel>
<FromDate>15/01/2027</FromDate>
<ToDate>20/01/2027</ToDate>
<Rooms>
<Room>
<Pax>
<Adult>2</Adult>
<Child age="0">0</Child>
</Pax>
<Boarding>1</Boarding>
</Room>
</Rooms>
</Details>
</HotelQuoteREQ>
Réponse : FromDate, ToDate (racine), Hotel/QuoteId (= référence reprise au booking), Hotel/rooms/room/… (mêmes champs que la recherche ; CancellationPolicy/FromDate en d/m/Y).
HotelBookingCreationREQ
Requête — strRQ
<HotelBookingCreationREQ>
<Credential>
<Login>demo_cy_login</Login>
<Password>demo_cy_password</Password>
</Credential>
<City id="146070"></City>
<Destination id="1"></Destination>
<User>12345</User>
<Language>fr</Language>
<Currency>TND</Currency>
<HotelID>1803258</HotelID>
<QuoteId>71885</QuoteId>
<IdToken>rk_x9F2kQ8example</IdToken>
<expectedprice>2500.000</expectedprice>
<FromDate>15/01/2027</FromDate>
<ToDate>20/01/2027</ToDate>
<SelectedRooms>
<SelectedRoom id="18">
<Adult>2</Adult>
<Child age="5">1</Child>
<Infant>0</Infant>
<Boarding id="16"/>
<Customers>
<Customer>
<Civility>Mr</Civility>
<FirstName>TEST-A</FirstName>
<LastName>TEST-B</LastName>
<Age>35</Age>
</Customer>
</Customers>
</SelectedRoom>
</SelectedRooms>
</HotelBookingCreationREQ>
Réponse : OrderDetails/@attributes { Id, IdToken (= IdToken reçu), Password }, OrderDetails/TotalRate, OrderDetails/Rooms/Room/…, CancellationPolicy racine optionnelle.
HotelBookingCancellationREQ
Requête — strRQ
<HotelBookingCancellationREQ>
<Credential>
<Login>demo_cy_login</Login>
<Password>demo_cy_password</Password>
</Credential>
<User>12345</User>
<Language>fr</Language>
<OrderId>BPG-2026-000123</OrderId>
</HotelBookingCancellationREQ>
Succès : <ReturnedValue><OrderCancelled>True</OrderCancelled></ReturnedValue>.
StaticDataRQ (liste des hôtels)
Requête — strRQ
<StaticDataRQ gethotelslist="true">
<Credential>
<Login>demo_cy_login</Login>
<Password>demo_cy_password</Password>
</Credential>
<Ilng>1</Ilng>
<User>12345</User>
</StaticDataRQ>
Réponse : Hotels/Hotel avec Id, IdCity, Title.
Pièges à connaître
- HTTP 200 + erreur dans le XML — testez
<ErrorResult>,<Error>avant de parser la réponse métier. Credentialen premier enfant — tout autre placement est refusé.- Dates
d/m/Y— partout, y comprisCancellationPolicy/FromDate. Un2027-01-15est rejeté. Available = 'Disponible'— la chaîne exacte (avec majuscule) indique une offre vendable ; ne testez pasTrue.IdTokenà réinjecter — renvoyé tel quel dansHotelBookingCreationREQ.IdToken; la réponse le redonne dansOrderDetails/@attributes.IdToken.expectedprice— montant avec 3 décimales (2500.000) : un écart avec le prix courant fait échouer la réservation, rejouez alors unHotelQuoteREQ.- Pas de
HotelRoomSelectionRQ— message mort chez le client historique, non implémenté (la sélection se fait parQuoteId+IdToken). publicDataRQ— jamais consommé par les clients connus ; la passerelle répond un XML minimal (pays, devises, langues) mais le format de réponse officiel est indéterminé.