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: réservations prises dans le PMS - Webhooks — l'API que le PMS expose pour recevoir les réservations de Bridg_
Topologie
Une connexion JSON porte l'identifiant d'adaptateur json (« JSON Connectivity » dans l'écran
Interface PMS). Les deux sens passent par HTTPS :
- PMS → Bridg_ : le PMS pousse sa disponibilité, ses prix, ses restrictions et les
réservations prises chez lui (
POST). - Bridg_ → PMS : Bridg_ appelle l'API du PMS pour chaque réservation OTA ou directe créée, modifiée ou annulée (webhook). Le PMS n'a rien à venir chercher.
PMS ──POST …/ari ────────────────▶ Bridg_ (dispo, prix, restrictions)
PMS ──POST …/reservations ───────▶ Bridg_ (réservations prises au PMS)
PMS ◀──POST {pmsBaseUrl}/api/connector/v1/bookings/add|update|cancel── Bridg_
L'adresse de l'API du PMS et ses deux jetons s'enregistrent dans l'écran Interface PMS → Réglages → API du PMS (voir Webhooks). Une connexion peut rester en entrée seule ; ses réservations Bridg_ restent alors en échec dans le journal, rejouables une fois l'API enregistrée.
Votre PMS n'a pas d'adresse publique joignable par Bridg_ ? Contactez Bridg_ avant de commencer.
Endpoints
Base : {base}/api/pms/v1/connections/{connectionId}
| Méthode | Chemin | Rôle |
|---|---|---|
POST |
/ari |
disponibilité, prix, restrictions |
POST |
/reservations |
réservation créée, modifiée, annulée dans le PMS |
POST …/messages et GET …/messages (point d'entrée unique et récupération) sont réservés au
modèle XML : une connexion JSON n'y reçoit rien.
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).
// 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_ ; 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 (celle de ses tarifs dans Bridg_), avec au plus les décimales de la devise : aucune pour le franc CFA (XOF, XAF) |
| 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.