Le modèle JSON s'adresse aux PMS cloud : une API REST en JSON, une URL par ressource, une authentification par jeton et signature HMAC, un accusé de traitement synchrone dans la réponse HTTP.
Pages du modèle JSON :
- Availability and Rates —
POST …/ari - Bookings —
POST …/reservations, feedGET …/messages, acquittementPOST …/results - Webhooks — l'API que le PMS expose pour recevoir les réservations (mode webhook)
Topologie
Le PMS pousse toujours ses données vers Bridg_. Pour recevoir les réservations de Bridg_, deux modes au choix, fixés à la création de la connexion :
| Mode | adapterId |
Réservations Bridg_ → PMS | Pour qui |
|---|---|---|---|
| Webhook | bridg-hms |
Bridg_ appelle l'API HTTPS du PMS (POST /api/connector/v1/bookings/…) |
PMS qui expose une API publique |
| Feed | winner |
le PMS appelle GET …/messages et acquitte par POST …/results |
PMS sans adresse publique, agents installés chez l'hôtel |
PMS ──POST …/ari ────────────────▶ Bridg_ (dispo, prix, restrictions)
PMS ──POST …/reservations ───────▶ Bridg_ (réservations prises au PMS)
Webhook : PMS ◀──POST {pmsBaseUrl}/api/connector/v1/bookings/add|update|cancel── Bridg_
Feed : PMS ──GET …/messages ─▶ Bridg_ ; PMS ──POST …/results ─▶ Bridg_
Endpoints
Base : {base}/api/pms/v1/connections/{connectionId}
| Méthode | Chemin | Rôle | Mode |
|---|---|---|---|
POST |
/ari |
disponibilité, prix, restrictions | tous |
POST |
/reservations |
réservation créée, modifiée, annulée dans le PMS | tous |
GET |
/messages |
prochain message à traiter (réservation OTA/directe) | feed |
POST |
/results |
verdict du PMS sur un message du feed | feed |
POST …/messages (point d'entrée unique) est réservé au modèle XML : 405 INGRESS_NOT_SUPPORTED
en JSON.
Authentification
Chaque requête vers Bridg_ porte deux en-têtes :
| En-tête | Valeur | Rôle |
|---|---|---|
Authorization |
Bearer <clientToken> |
identifie la connexion |
X-Bridg-Signature |
sha256=<hex> |
HMAC-SHA256 du corps brut de la requête avec le secret, en hexadécimal minuscule |
La signature porte sur les octets exactement envoyés : sérialisez le JSON une fois, signez cette
chaîne, envoyez cette chaîne. Les deux en-têtes sont obligatoires (401 UNAUTHORIZED sinon). Un
GET (feed) se signe sur un corps vide.
// Node.js
const crypto = require('crypto');
const body = JSON.stringify(message);
const signature = 'sha256=' + crypto.createHmac('sha256', SECRET).update(body).digest('hex');
await fetch(`${BASE}/api/pms/v1/connections/${CONNECTION_ID}/ari`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${CLIENT_TOKEN}`,
'X-Bridg-Signature': signature,
'Content-Type': 'application/json',
},
body,
});# Python
import hmac, hashlib, json, requests
body = json.dumps(message, separators=(',', ':')).encode('utf-8')
signature = 'sha256=' + hmac.new(SECRET.encode(), body, hashlib.sha256).hexdigest()
requests.post(f'{BASE}/api/pms/v1/connections/{CONNECTION_ID}/ari', data=body, headers={
'Authorization': f'Bearer {CLIENT_TOKEN}',
'X-Bridg-Signature': signature,
'Content-Type': 'application/json',
})# curl
BODY='{"messageId":"ari-2026-09-11-001","items":[{"unitTypeCode":"DLX","from":"2026-10-10","to":"2026-10-13","availability":12}]}'
SIG="sha256=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | sed 's/^.* //')"
curl -X POST "https://staging.bridgchannel.app/api/pms/v1/connections/$CONNECTION_ID/ari" \
-H "Authorization: Bearer $CLIENT_TOKEN" \
-H "X-Bridg-Signature: $SIG" \
-H "Content-Type: application/json" \
--data-binary "$BODY"En-tête optionnel sur POST …/ari : Idempotency-Key. Une clé déjà vue sur la connexion
renvoie la réponse mémorisée sans retraiter. Le messageId du corps joue déjà ce rôle ; l'en-tête
est utile quand le PMS régénère un messageId à chaque tentative.
Conventions
| Sujet | Convention |
|---|---|
| Corps | JSON, UTF-8, Content-Type: application/json |
| Casse | camelCase pour tout ce que le PMS envoie à Bridg_ et lit sur le feed ; PascalCase pour ce que Bridg_ envoie à l'API du PMS (webhook) |
| Dates | AAAA-MM-JJ, dates civiles sans fuseau |
| Plages | [from, to) : from inclus, to exclu |
| Montants | nombres décimaux (pas de chaînes), dans la devise de l'établissement |
| Identifiants de message | messageId chaîne unique par connexion (UUID ou compteur) |
| Réponses | JSON ; erreurs { "error": "…", "code": "…" } |
Réponses et erreurs
| HTTP | Sens |
|---|---|
200 OK |
traité ; le corps porte l'accusé (par item pour l'ARI) |
202 Accepted |
même message reçu pendant son traitement ; ne pas réémettre |
400 |
JSON invalide, champ requis absent |
401 |
Authorization ou X-Bridg-Signature absents ou invalides |
403 |
CONNECTION_INACTIVE |
404 |
connectionId inconnu |
405 |
endpoint non prévu pour ce dialecte |
422 |
refus déterministe d'une réservation (UNMAPPED_UNIT_TYPE, NO_LINES, MISSING_REFERENCE) |
429 |
débit dépassé (600 req/min/IP) |
500 |
échec transitoire, message conservé : réémettre après un délai |
Codes et sémantique détaillés : API Reference commune.