Documentation · PMS interface

Bookings

Réservations prises au PMS, feed des réservations Bridg_ et acquittement.

Staginghttps://staging.bridgchannel.appv1.0 · 2026-09-11<?Label BRIDG|DOC|1.0|NEW?>

This technical documentation is available in French only.

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

POST{base}/api/pms/v1/connections/{connectionId}/reservations
Authorization: Bearer {clientToken}
X-Bridg-Signature: sha256={hmac}
Content-Type: application/json
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

JSON
{ "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 :

JSON
{ "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

GET{base}/api/pms/v1/connections/{connectionId}/messages
Authorization: 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.

JSON
{
  "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 :

JSON
{
  "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 MODIFY d'une réservation n'est jamais servi avant son CREATE.
  • Sans acquittement sous 30 minutes, le message est resservi avec un nouveau transactionId : dédupliquez sur cmRef + revision.
  • MODIFY est 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

POST{base}/api/pms/v1/connections/{connectionId}/results
Authorization: Bearer {clientToken}
X-Bridg-Signature: sha256={hmac}
Content-Type: application/json
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é…) :

JSON
{ "transactionId": 42, "success": false, "message": "Type de chambre DLX inconnu dans le PMS" }

Success Response

200 OK

JSON
{ "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 RequesttransactionId 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 transactionId encore ouvert.
  • Un success: false n'est jamais resservi automatiquement : c'est l'hôtelier qui rejoue après avoir corrigé (mapping, données).