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 POST unique, 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/Y partout (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.
  • Credential en premier enfant — tout autre placement est refusé.
  • Dates d/m/Y — partout, y compris CancellationPolicy/FromDate. Un 2027-01-15 est rejeté.
  • Available = 'Disponible' — la chaîne exacte (avec majuscule) indique une offre vendable ; ne testez pas True.
  • IdToken à réinjecter — renvoyé tel quel dans HotelBookingCreationREQ.IdToken ; la réponse le redonne dans OrderDetails/@attributes.IdToken.
  • expectedprice — montant avec 3 décimales (2500.000) : un écart avec le prix courant fait échouer la réservation, rejouez alors un HotelQuoteREQ.
  • Pas de HotelRoomSelectionRQ — message mort chez le client historique, non implémenté (la sélection se fait par QuoteId + 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é.

Cette page vous a-t-elle été utile ?