Trois endpoints :
| Endpoint | Sens | Rôle |
|---|---|---|
POST …/reservations |
PMS → Bridg_ | réservation créée, modifiée ou annulée dans le PMS |
GET …/messages |
Bridg_ → PMS | feed : prochaine réservation OTA / directe à écrire dans le PMS (mode feed) |
POST …/results |
PMS → Bridg_ | acquittement d'un message du feed (mode feed) |
En mode webhook, les réservations Bridg_ → PMS passent par l'API du PMS : voir Webhooks. L'objet réservation est décrit dans l'API Reference commune.
Create or update a PMS reservation
Une réservation prise dans le PMS. Bridg_ la crée ou la met à jour dans le tableau de bord avec la
source PMS et ne touche pas à la disponibilité (c'est le prochain message ARI qui la porte).
Request
{base}/api/pms/v1/connections/{connectionId}/reservationsAuthorization: Bearer {clientToken}
X-Bridg-Signature: sha256={hmac}
Content-Type: application/json{
"externalRef": "PMS-778812",
"cmRef": "",
"channel": "PMS",
"revision": 1,
"currency": "DZD",
"totalAmount": { "gross": 39000, "net": 39000 },
"paymentType": "ON_SITE",
"booker": { "lastName": "Benali", "firstName": "Samir", "email": "samir.benali@example.com", "phone": "+213550000000" },
"reservations": [
{
"lineCode": "01",
"state": "CONFIRMED",
"unitTypeCode": "DLX",
"ratePlanCode": "BAR1",
"from": "2026-10-10",
"to": "2026-10-13",
"occupancy": [ { "bucket": "ADULT", "count": 2 } ],
"nights": [
{ "date": "2026-10-10", "gross": 12000, "net": 12000 },
{ "date": "2026-10-11", "gross": 12000, "net": 12000 },
{ "date": "2026-10-12", "gross": 15000, "net": 15000 }
]
}
]
}Annulation : même message avec revision incrémentée et toutes les lignes en CANCELLED (ou
reservations: []).
Success Response
200 OK
{ "accepted": true, "reference": "PMS-778812", "action": "CREATED", "bookingId": "cm…", "bookingNumber": "BRG-2026-001240" }action |
Signification |
|---|---|
CREATED |
réservation créée dans Bridg_ |
UPDATED |
lignes remplacées par celles du message |
CANCELLED |
passée en annulée |
IGNORED_STALE |
revision ≤ dernière traitée : ignorée |
IGNORED_UNKNOWN |
annulation d'une réservation que Bridg_ ne connaît pas : ignorée (pas une erreur) |
202 Accepted — même référence:révision reçue pendant son traitement.
Error Response
400 Bad Request — { "error": "cmRef ou externalRef requis", "code": "VALIDATION_ERROR" } ;
aussi reservations[] requis, currency requise, Corps JSON invalide.
422 Unprocessable Entity — refus déterministe, ne pas réémettre sans corriger :
{ "error": "Type d'unité \"SUP\" non mappé sur cette connexion", "code": "UNMAPPED_UNIT_TYPE" }Autres codes : NO_LINES (aucune ligne active exploitable), MISSING_REFERENCE.
500 — échec transitoire, réémettre.
Fields
Voir Réservation (booking). Particularités du sens entrant :
| Champ | Requis | Remarque |
|---|---|---|
externalRef ou cmRef |
l'un des deux | La référence du PMS. cmRef prime si les deux sont fournis. Enregistrée pms:<référence>. |
revision |
recommandé | Défaut 0 (pas de contrôle de révision). Croissant pour une même référence. |
currency |
oui | |
reservations[] |
oui | Peut être vide pour une annulation. |
reservations[].ratePlanCode |
non | Non bloquant s'il n'est pas mappé. |
paymentType |
non | PREPAID → réservation marquée payée ; sinon en attente de paiement. |
customer |
non | Prime sur booker pour le nom et le contact du client. |
Note
- Idempotence : clé
<référence>:r<revision>. Rejouer le même message renvoie le résultat mémorisé. - Modification = remplacement de toutes les lignes.
- Deux lignes du même type de chambre sont regroupées en quantité 2 côté Bridg_.
Bookings feed
Mode feed uniquement (adapterId = winner). Bridg_ sert un message par appel, FIFO :
RESERVATION (création ou modification, état complet) ou CANCEL. Le message reste dû tant que
le PMS n'a pas envoyé son verdict sur POST …/results.
Request
{base}/api/pms/v1/connections/{connectionId}/messagesAuthorization: Bearer {clientToken}
X-Bridg-Signature: sha256={hmac du corps vide}Success Response
200 OK avec un message. L'en-tête HTTP title (winner|RESERVATION|42|CREATE) permet de
router sans parser le corps.
{
"dialect": "winner",
"version": 1,
"type": "RESERVATION",
"event": "CREATE",
"transactionId": 42,
"cmRef": "BRG-2026-001234",
"payload": {
"externalRef": "4412345678",
"cmRef": "BRG-2026-001234",
"channel": "BOOKING_COM",
"revision": 1,
"currency": "DZD",
"totalAmount": { "gross": 36000, "net": 36000 },
"paymentType": "ON_SITE",
"booker": { "lastName": "Benali", "firstName": "Samir", "email": "samir.benali@example.com", "phone": "+213550000000" },
"reservations": [
{
"lineCode": "01",
"state": "CONFIRMED",
"unitTypeCode": "DLX",
"ratePlanCode": "BAR1",
"from": "2026-10-10",
"to": "2026-10-13",
"occupancy": [ { "bucket": "ADULT", "count": 2 } ],
"nights": [
{ "date": "2026-10-10", "gross": 12000, "net": 12000 },
{ "date": "2026-10-11", "gross": 12000, "net": 12000 },
{ "date": "2026-10-12", "gross": 12000, "net": 12000 }
]
}
]
}
}Annulation :
{
"dialect": "winner",
"version": 1,
"type": "CANCEL",
"event": "CANCEL",
"transactionId": 43,
"cmRef": "BRG-2026-001234",
"payload": { "cmRef": "BRG-2026-001234", "revision": 2, "lines": "ALL" }
}200 OK sans message : corps vide, Content-Length: 0.
Error Response
401 · 403 CONNECTION_INACTIVE · 404 · 429
Fields
| Champ | Type | Description |
|---|---|---|
dialect |
string | winner — identifiant du fil JSON feed. |
version |
integer | Version du fil (1). Incrémentée sur tout changement incompatible. |
type |
enum | RESERVATION (création ou modification : état complet) · CANCEL · RESULT (non utilisé en JSON). |
event |
enum | CREATE, MODIFY, CANCEL. |
transactionId |
integer | Identifiant du message servi, à renvoyer dans l'acquittement. |
cmRef |
string | Numéro de réservation Bridg_. |
payload |
object | RESERVATION : la réservation complète ; CANCEL : { cmRef, revision, lines: "ALL" }. |
Note
- Rythme : interroger toutes les 30 à 60 secondes ; quand un message est servi, ré-interroger immédiatement jusqu'à obtenir un corps vide.
- Ordre garanti par réservation : le
MODIFYd'une réservation n'est jamais servi avant sonCREATE. - Sans acquittement sous 30 minutes, le message est resservi avec un nouveau
transactionId: dédupliquez surcmRef+revision. MODIFYest un état complet : remplacez la réservation entière (toute ligne absente est annulée).
Acknowledge a feed message
Le PMS rend son verdict après avoir écrit (ou refusé d'écrire) la réservation. N'acquittez positivement qu'une réservation réellement enregistrée.
Request
{base}/api/pms/v1/connections/{connectionId}/resultsAuthorization: Bearer {clientToken}
X-Bridg-Signature: sha256={hmac}
Content-Type: application/json{ "transactionId": 42, "success": true, "pmsReference": "1543299", "message": "Écrite dans le PMS" }Refus déterministe (type de chambre inconnu, réservation introuvable, séjour déjà commencé…) :
{ "transactionId": 42, "success": false, "message": "Type de chambre DLX inconnu dans le PMS" }Success Response
200 OK
{ "accepted": true, "transactionId": 42, "outcome": "CONFIRMED" }outcome |
Signification |
|---|---|
CONFIRMED |
ligne close ; le message ne sera plus servi |
FAILED |
success: false : dead-letter immédiat, visible dans l'écran Interface PMS, rejouable à la main après correction |
UNKNOWN |
transactionId inconnu (déjà clos, ou resservi sous un autre identifiant) |
Error Response
400 Bad Request — transactionId entier positif requis, success booléen requis, Corps JSON invalide.
Fields
| Champ | Type | Requis | Description |
|---|---|---|---|
transactionId |
integer ≥ 1 | oui | Le transactionId du message servi. |
success |
boolean | oui | true = écrite dans le PMS. false = refus déterministe (jamais pour une panne transitoire). |
pmsReference |
string | non | Numéro de confirmation côté PMS, affiché dans le journal. |
message |
string | non | Détail humain (cause du refus). |
Note
- Panne transitoire côté PMS (base indisponible, réseau) : n'envoyez pas de verdict. Le
message sera resservi après 30 minutes, ou plus tôt si vous ré-interrogez le feed avec le même
transactionIdencore ouvert. - Un
success: falsen'est jamais resservi automatiquement : c'est l'hôtelier qui rejoue après avoir corrigé (mapping, données).