Trois messages : RESERVATION (dans les deux sens), RESULT (dans les deux sens) et
MESSAGEREQUEST (PMS → Bridg_). Tous circulent sur l'URL unique …/messages
(API Reference XML).
RESERVATION entrante (PMS → Bridg_)
Une réservation créée, modifiée ou annulée dans le PMS. Bridg_ la crée ou la met à jour dans le
tableau de bord avec la source PMS, sans toucher à la disponibilité (c'est le RTAV suivant
qui la porte). Schéma reservation.fidelio.* (4.0 et 5.0 acceptés ; le préfixe de namespace n'est
pas contrôlé).
Request
{base}/api/pms/v1/connections/{connectionId}/messages?key={secret}Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<?Label ATLALG|RESERVATION|2841300|NEW?>
<Reservation xmlns="reservation.fidelio.5.0" mfReservationAction="ADD">
<HotelReference>
<hotelCode>ATLALG</hotelCode>
</HotelReference>
<reservationID>1543212</reservationID>
<ResProfiles>
<ResProfile>
<Profile xmlns="profile.fidelio.5.0" profileType="GUEST">
<IndividualName>
<nameFirst>Samir</nameFirst>
<nameSur>Benali</nameSur>
</IndividualName>
</Profile>
</ResProfile>
</ResProfiles>
<RoomStays>
<RoomStay reservationStatusType="RESERVED">
<roomStayRPH>1</roomStayRPH>
<roomInventoryCode>DLX</roomInventoryCode>
<TimeSpan timeUnitType="DAY">
<startTime>2026-10-10T00:00:00.000</startTime>
<numberOfTimeUnits>3</numberOfTimeUnits>
</TimeSpan>
<GuestCounts>
<GuestCount><ageQualifyingCode>ADULT</ageQualifyingCode><mfCount>2</mfCount></GuestCount>
<GuestCount><ageQualifyingCode>CHILD</ageQualifyingCode><mfCount>0</mfCount></GuestCount>
</GuestCounts>
<RatePlans>
<RatePlan>
<ratePlanCode>BAR1</ratePlanCode>
<Rates>
<Rate rateBasisTimeUnitType="DAY">
<Amount currencyCode="DZD"><valueNum>12000</valueNum></Amount>
<rateBasisUnits>1</rateBasisUnits>
<TimeSpan timeUnitType="DAY">
<startTime>2026-10-10T00:00:00.000</startTime>
<numberOfTimeUnits>2</numberOfTimeUnits>
</TimeSpan>
</Rate>
<Rate rateBasisTimeUnitType="DAY">
<Amount currencyCode="DZD"><valueNum>15000</valueNum></Amount>
<rateBasisUnits>1</rateBasisUnits>
<TimeSpan timeUnitType="DAY">
<startTime>2026-10-12T00:00:00.000</startTime>
<numberOfTimeUnits>1</numberOfTimeUnits>
</TimeSpan>
</Rate>
</Rates>
</RatePlan>
</RatePlans>
</RoomStay>
</RoomStays>
</Reservation>Fields
| Élément / attribut | Requis | Traduction |
|---|---|---|
Label/transactionId |
oui | révision de la réservation (doit croître d'un message à l'autre pour une même réservation) et clé de déduplication |
Reservation/@mfReservationAction |
oui | ADD, CHANGE : état complet ; CANCEL et DELETE : toutes les lignes annulées (une réservation supprimée dans le PMS ne doit pas revenir dans les arrivées) |
reservationID |
oui | numéro de confirmation OPERA → pmsReference, clé de la réservation côté Bridg (externalId = pms:<reservationID>) et affiché sur la fiche |
confirmationID |
non | notre numéro de réservation quand OPERA renvoie une réservation que Bridg a émise : elle est alors reconnue et rattachée (numéro et état PMS posés sur la réservation Bridg), jamais recréée ; son contenu n'est pas appliqué |
RoomStay/@reservationStatusType |
non | CANCELED (ou toute valeur contenant CANCEL) annule la ligne ; la valeur brute est conservée en pmsStatus et pilote le séjour côté Bridg : RESERVED → confirmée (un check-in annulé efface l'arrivée réelle), INHOUSE → check-in fait, CHECKEDOUT → check-out fait, NOSHOW → no-show, REQUESTED/WAITLISTED → en attente. Pour une réservation émise par Bridg et renvoyée par OPERA, seuls arrivée, départ, no-show et retour en réservée sont suivis : une annulation côté PMS reste affichée mais n'annule pas la réservation Bridg |
RoomStay/roomID |
non | chambre attribuée → pmsRoomNumber. C'est un état, pas un diff : absent, la chambre est considérée désattribuée et effacée côté Bridg |
RoomStay/TimeSpan/numberOfTimeUnits = 0 |
— | nuits restantes, pas durée du séjour : c'est la forme d'un message de départ (au check-out, tous les TimeSpan tombent à 0 alors que la réservation portait ses nuits à l'arrivée). Sur une réservation déjà connue, un tel message ne met à jour que l'état du séjour (statut, chambre, horodatages) : dates, nuits, montants et lignes restent ceux qui ont été vendus |
marketSegmentCode, mfsourceCode, GuaranteeInfo/mfGuaranteeType, PaymentInstruction/mfPaymentMethod, reservationOriginatorCode, originalBookingDate, ResGuest/arrivalTime, departureTime |
non | conservés tels quels dans pmsMeta (codes marché et source, garantie, mode de paiement, origine, date de prise, heures annoncées) ; l'heure d'arrivée alimente aussi l'heure d'arrivée prévue à la création |
ResComments/ResComment/comment |
non | notes de réservation saisies au PMS (hors type SYSTEM) → notes réception, à la création seulement |
RoomStay/roomStayRPH |
recommandé | lineCode |
RoomStay/roomInventoryCode |
oui | unitTypeCode (mapping UNIT_TYPE) |
RoomStay/TimeSpan |
oui | séjour de la ligne (from, to) |
GuestCounts/GuestCount |
non | ageQualifyingCode ADULT → adultes ; toute autre valeur → enfants ; mfCount = 0 ignoré |
RatePlan/ratePlanCode |
non | ratePlanCode (mapping RATE_PLAN) ; non bloquant s'il n'est pas mappé |
Rate/Amount/valueNum |
oui (ligne active) | montant par nuit ; Rate/TimeSpan dit sur quelles nuits — plusieurs <Rate> = tarifs journaliers variables |
Rate/Amount/@currencyCode |
non | devise ; à défaut DZD |
Profile/IndividualName |
non | nameSur → nom, nameFirst → prénom (le premier IndividualName trouvé) |
Success Response
200 OK
{ "accepted": true, "reference": "1543212", "action": "CREATED", "bookingId": "cm…", "bookingNumber": "BRG-2026-001240" }action : CREATED, UPDATED, CANCELLED, IGNORED_STALE (révision ≤ dernière traitée),
IGNORED_UNKNOWN (annulation d'une réservation inconnue). Un RESULT SUCCESS est mis en file.
Error Response
200 OK + RESULT FAILED en file (refus déterministe) :
Code dans resultMessage |
Cause |
|---|---|
UNMAPPED_UNIT_TYPE |
roomInventoryCode non mappé |
NO_LINES |
aucune ligne active exploitable |
MISSING_REFERENCE |
ni reservationID ni confirmationID |
MISSING_AMOUNT |
<Rate> sans Amount/valueNum sur une ligne active |
DUPLICATE_NIGHT |
une nuit tarifée deux fois (deux <Rate> ou <RatePlan> qui se recouvrent) |
500 — échec transitoire, réémettre.
Note
- Modification = remplacement : Bridg_ remplace toutes les lignes par celles du message.
- Annulation :
mfReservationAction="CANCEL"ou toutes les lignes enCANCELED. Annuler une réservation inconnue de Bridg_ n'est pas une erreur (IGNORED_UNKNOWN). - Idempotence : la clé est
reservationID:r<transactionId>. Rejouer le même message renvoie le résultat mémorisé. - Le paiement est enregistré
ON_SITE(à régler sur place).
RESERVATION sortante (Bridg_ → PMS)
Servie par GET …/messages pour toute réservation OTA ou directe créée, modifiée ou annulée
dans Bridg_. Namespaces émis : reservation.fidelio.4.0 et profile.fidelio.4.0 (compatibles
avec les schémas 5.0).
Message servi
HTTP/1.1 200 OK Content-Type: text/xml; charset=UTF-8 title: ATLALG|RESERVATION|42|NEW
<?xml version="1.0" encoding="UTF-8"?>
<?Label ATLALG|RESERVATION|42|NEW?>
<Reservation xmlns="reservation.fidelio.4.0" mfReservationAction="ADD">
<HotelReference>
<hotelCode>ATLALG</hotelCode>
</HotelReference>
<confirmationID>BRG-2026-001234</confirmationID>
<StayDateRange timeUnitType="DAY">
<startTime>2026-10-10T00:00:00.000</startTime>
<numberOfTimeUnits>3</numberOfTimeUnits>
</StayDateRange>
<GuestCounts>
<GuestCount>
<ageQualifyingCode>ADULT</ageQualifyingCode>
<mfCount>2</mfCount>
</GuestCount>
</GuestCounts>
<ResComments>
<ResComment>
<resCommentRPH>0</resCommentRPH>
<guestViewable>0</guestViewable>
<comment>Reservation Bridg BRG-2026-001234 - Source : Booking.com (ref 4321567890) - Prise le 16/09/2026 10:30 UTC
Client : Samir Benali - samir@example.com - +213 555 00 00 00
Sejour : du 10/10/2026 au 13/10/2026 (3 nuits) - 2 adultes
Chambre : DLX, tarif BAR1, 12000 DZD/nuit
Total : 36000 DZD - Paiement : prepaye (encaisse par le canal)
Demandes client : Lit bebe / Arrivee prevue : 22:00</comment>
<mfcommentType>RESERVATION</mfcommentType>
<mfcommentDate>2026-09-16T10:31:00.000</mfcommentDate>
</ResComment>
</ResComments>
<ResGuests>
<ResGuest>
<resGuestRPH>0</resGuestRPH>
<profileRPHs>0</profileRPHs>
<InHouseTimeSpan timeUnitType="DAY">
<startTime>2026-10-10T00:00:00.000</startTime>
<numberOfTimeUnits>3</numberOfTimeUnits>
</InHouseTimeSpan>
</ResGuest>
</ResGuests>
<ResProfiles>
<ResProfile>
<Profile xmlns="profile.fidelio.4.0" profileType="GUEST">
<IndividualName>
<nameFirst>Samir</nameFirst>
<nameSur>Benali</nameSur>
</IndividualName>
<ElectronicAddresses>
<ElectronicAddress electronicAddressType="EMAIL">
<eAddress>samir@example.com</eAddress>
<mfPrimaryYN>Y</mfPrimaryYN>
</ElectronicAddress>
</ElectronicAddresses>
<PostalAddresses>
<PostalAddress addressType="HOME">
<countryCode>DZ</countryCode>
<mfPrimaryYN>Y</mfPrimaryYN>
</PostalAddress>
</PostalAddresses>
<PhoneNumbers>
<PhoneNumber phoneNumberType="MOBILE">
<phoneNumber>+213 555 00 00 00</phoneNumber>
<mfPrimaryYN>Y</mfPrimaryYN>
</PhoneNumber>
</PhoneNumbers>
</Profile>
<resProfileRPH>0</resProfileRPH>
</ResProfile>
</ResProfiles>
<RoomStays>
<RoomStay mfReservationAction="ADD" reservationStatusType="RESERVED">
<roomStayRPH>01</roomStayRPH>
<roomInventoryCode>DLX</roomInventoryCode>
<TimeSpan timeUnitType="DAY">
<startTime>2026-10-10T00:00:00.000</startTime>
<numberOfTimeUnits>3</numberOfTimeUnits>
</TimeSpan>
<GuestCounts>
<GuestCount>
<ageQualifyingCode>ADULT</ageQualifyingCode>
<mfCount>2</mfCount>
</GuestCount>
</GuestCounts>
<RatePlans>
<RatePlan>
<ratePlanRPH>0</ratePlanRPH>
<ratePlanCode>BAR1</ratePlanCode>
<TimeSpan timeUnitType="DAY">
<startTime>2026-10-10T00:00:00.000</startTime>
<numberOfTimeUnits>3</numberOfTimeUnits>
</TimeSpan>
<Rates>
<Rate rateBasisTimeUnitType="DAY">
<rateRPH>0</rateRPH>
<Amount currencyCode="DZD">
<valueNum>12000</valueNum>
</Amount>
<rateBasisUnits>1</rateBasisUnits>
<TimeSpan timeUnitType="DAY">
<startTime>2026-10-10T00:00:00.000</startTime>
<numberOfTimeUnits>3</numberOfTimeUnits>
</TimeSpan>
</Rate>
</Rates>
</RatePlan>
</RatePlans>
<resGuestRPHs>0</resGuestRPHs>
<resCommentRPHs>0</resCommentRPHs>
<mfsourceCode>BOOKING_COM</mfsourceCode>
</RoomStay>
</RoomStays>
<resCommentRPHs>0</resCommentRPHs>
<resProfileRPHs>0</resProfileRPHs>
</Reservation>Fields
| Élément / attribut | Valeur |
|---|---|
Label/transactionId, en-tête title |
entier 1..999999999, unique par message servi ; à renvoyer dans le RESULT |
ResGuests/ResGuest + RoomStay/resGuestRPHs |
chaîne d'identification du client principal (resGuestRPHs → ResGuest → profileRPHs → ResProfile/Profile) — exigée par le traducteur d'OXI, qui refuse sinon (« Can't identify the primary ResGuest ») |
Reservation/@mfReservationAction |
ADD à la création ; EDIT à la modification (état complet, OPERA retrouve la réservation par confirmationID) ; CANCEL quand toutes les lignes sont annulées — l'annulation est la réservation complète, lignes en CANCELED, le dialecte n'a pas de message d'annulation autonome |
confirmationID |
numéro de réservation Bridg_ (cmRef), stable à travers les révisions — le « numéro de confirmation du système externe » de la spec Oracle, clé de recherche d'OXI pour toute modification/annulation. Jamais dans reservationID : c'est le numéro de confirmation OPERA (un entier attribué par OPERA), et une référence alphanumérique y fait échouer le traducteur (ORA-06502) |
reservationID |
numéro de confirmation OPERA, dès qu'il est connu : renvoyé par le RESULT d'acceptation (ResultIds/ResultId/pmsId), mémorisé sur la réservation Bridg (pmsReference) et joint à toute modification ou annulation — second critère de recherche d'OXI après confirmationID |
StayDateRange, GuestCounts (racine) |
fenêtre totale du séjour et occupants de la réservation — « Required field for OPERA » ; c'est ce GuestCounts-là qu'OPERA lit, celui du RoomStay est ignoré |
ResGuest/InHouseTimeSpan |
séjour du client principal (« Required field in OPERA ») — égal à StayDateRange pour un client unique |
Profile/@profileType |
GUEST |
Profile/ElectronicAddresses, PostalAddresses, PhoneNumbers |
e-mail (EMAIL), pays (countryCode ISO alpha-2, adresse HOME) et téléphone (MOBILE) du client, chacun omis s'il est inconnu — dans cet ordre (séquence XSD du profil) |
ResComments/ResComment |
note de réservation pour l'hôtel (type RESERVATION, guestViewable=0), rattachée par resCommentRPHs au séjour et à la racine : référence Bridg_, canal et référence chez le canal, date de prise, client et contacts, séjour et occupation, type de chambre / tarif / prix par nuit pour chaque chambre, total et mode de paiement, demandes du client. Texte ASCII (sans accents) pour survivre à une base OPERA non UTF-8 ; 2 000 caractères max |
RoomStay/mfsourceCode |
code source = canal Bridg_ (BOOKING_COM, EXPEDIA, AIRBNB, HOTELS_COM, AGODA, DIRECT, PHONE, WALK_IN…). OXI le convertit via sa table Source Codes (valeur externe → code source OPERA) ; sans conversion, il valide contre les codes OPERA puis retombe sur le défaut de l'interface. À renseigner chez l'hôtel pour ventiler ses sources |
RoomStay/@mfReservationAction, @reservationStatusType |
ADD / RESERVED, ou CANCEL / CANCELED par ligne |
roomStayRPH, ratePlanRPH, rateRPH |
reference placeholders (entiers) ; roomStayRPH = lineCode (01, 02… ; une ligne par chambre) |
RatePlan/TimeSpan |
fenêtre du plan tarifaire (= séjour de la ligne) |
roomInventoryCode, ratePlanCode |
codes PMS (mappings) |
RoomStay/TimeSpan |
séjour |
GuestCounts |
ADULT, CHILD |
Rates/Rate |
un <Rate> par palier de prix : montant par nuit + nuits couvertes (tarifs variables rendus nativement) |
Amount/@currencyCode |
devise de la réservation |
Profile/IndividualName |
nom et prénom du réservant |
Non porté aujourd'hui : extras, ventilation des taxes (gross = net), jeton de paiement,
code marché (OPERA le dérive du code tarif, ou applique le défaut de l'interface OXI).
Verdict attendu du PMS
Après traitement, le PMS envoie un RESULT sur POST …/messages, corrélé sur le transactionId
du message servi :
<?xml version="1.0" encoding="UTF-8"?>
<?Label ATLALG|RESULT|42|SUCCESS?>
<RESULT xmlns="result.fidelio.4.0" success="SUCCESS" timeStamp="2026-09-11T10:40:00.000">
<resortId>ATLALG</resortId>
<resultMessage>Reservation created</resultMessage>
<ResultIds>
<ResultId resultMsgType="RESERVATION">
<crsId>BRG-2026-001234</crsId>
<pmsId>1543299</pmsId>
</ResultId>
</ResultIds>
</RESULT>Réponse de Bridg_ : 200 OK
{ "accepted": true, "transactionId": 42, "outcome": "CONFIRMED" }outcome |
Signification |
|---|---|
CONFIRMED |
ligne close (DONE). Un succès avec réserve (WARNING, SUCCESSINFO) est aussi un CONFIRMED : le resultMessage est conservé sur la ligne et affiché dans l'écran Interface PMS, pour que l'opérateur voie ce que le PMS a substitué (tarif par défaut, chambre retirée…) |
REQUEUED |
RESULT en échec transitoire : la réservation sera resservie plus tard avec un nouveau transactionId (backoff 30 s → 30 min) |
FAILED |
dead-letter, visible dans l'écran Interface PMS, rejouable à la main : soit après 8 échecs transitoires, soit immédiatement sur un refus déterministe |
UNKNOWN |
transactionId inconnu (déjà clos, ou resservi sous un autre identifiant) |
Un refus est déterministe quand resservir le même message donnerait le même verdict :
validation OPERA (Invalid …, … is not set, … not found, mandatory, Can't …), erreur
Oracle (ORA-xxxxx). Il part en dead-letter sans rejeu — inutile d'user huit tentatives et de
remplir le Message Status du PMS pendant une heure pour un problème de configuration. Les motifs
transitoires (record locked, timeout, try again, busy, temporarily unavailable) et le
verdict REQUEUE sont rejoués. Un motif non reconnu reste au rejeu borné.
Sans RESULT sous 30 minutes, la réservation est resservie avec un nouveau transactionId :
dédupliquez sur reservationID.
RESULT — accusé de traitement
Schéma result.fidelio.4.0. Même forme dans les deux sens.
<?xml version="1.0" encoding="UTF-8"?>
<?Label ATLALG|RESULT|2841179|FAILED?>
<RESULT xmlns="result.fidelio.4.0" success="FAIL" timeStamp="2026-09-11T10:39:18.896">
<resortId>ATLALG</resortId>
<resultMessage>1 item(s) rejeté(s) : #0 UNMAPPED_UNIT_TYPE — Type d'unité "SUP" non mappé sur cette connexion</resultMessage>
</RESULT>| Champ | Description |
|---|---|
Label/transactionId |
le transactionId du message d'origine (pas un identifiant propre) |
Label/status |
SUCCESS ou FAILED ; certains OXI posent NEW sur un accusé de succès |
RESULT/@success |
SUCCESS, SUCCESSINFO, WARNING = appliqué ; FAIL, REQUEUE = non appliqué |
resortId |
code de l'établissement |
resultMessage |
texte libre ; Bridg_ y met le détail par item (#index CODE — message) |
ResultIds/ResultId/@resultMsgType |
type du message d'origine quand il existe dans l'énumération (RATE, RESERVATION, RATEAVAIL pour RAVL…) ; omis sinon |
ResultIds/ResultId/pmsId, ReservationReference[@type=PMSID]/@referenceNumber |
numéro OPERA de la réservation. Le numéro de leg que certaines versions suffixent (1543463.1) est retiré : la référence nue est mémorisée, puis renvoyée en reservationID, qui n'accepte qu'un entier |
Lecture d'un RESULT reçu du PMS : c'est l'attribut @success du corps qui fait foi, puisque
c'est lui que le schéma définit. Le status de l'enveloppe ne tranche qu'en l'absence de cet
attribut. Les exemples officiels d'Oracle posent d'ailleurs <?Label …|RESULT|…|NEW?> sur un corps
success="SUCCESS" : exiger SUCCESS dans l'enveloppe ferait lire ces accusés comme des échecs,
donc réémettre la réservation et la dupliquer dans le PMS.
Les RESULT émis par Bridg_ sont servis par GET dans l'ordre, avant ou après les
réservations selon leur date de mise en file, et sont clos à la remise (ils n'attendent rien en
retour).
MESSAGEREQUEST — redemander une réservation
Le PMS peut redemander une réservation qu'il a perdue ou jamais reçue. Bridg_ la remet en file
avec son état courant puis met un RESULT en file. Seul le type RESERVATION est servi ; les
autres reçoivent un RESULT FAILED explicite.
Request
<?xml version="1.0" encoding="UTF-8"?>
<?Label ATLALG|MESSAGEREQUEST|2841400|NEW?>
<MessageRequest xmlns="messagerequest.fidelio.3.0" responseDetail="DETAIL">
<messageType>RESERVATION</messageType>
<keyId>BRG-2026-001234</keyId>
<HotelReference>
<hotelCode>ATLALG</hotelCode>
</HotelReference>
</MessageRequest>| Champ | Description |
|---|---|
messageType |
RESERVATION |
keyId |
le reservationID Bridg_ (numéro de réservation) |
Success Response
200 OK — { "accepted": true, "requeued": "BRG-2026-001234" }, puis dans la file : la
RESERVATION (nouveau transactionId) et un RESULT SUCCESS corrélé à 2841400.
Error Response
200 OK + RESULT FAILED en file : type autre que RESERVATION, réservation inconnue de
l'établissement, ou réservation créée dans le PMS (jamais réémise, anti-boucle).