التوثيق · واجهة PMS

API Reference JSON

Endpoints, authentification Bearer + HMAC-SHA256, conventions, réponses et erreurs.

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

هذا التوثيق التقني متاح باللغة الفرنسية فقط.

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 RatesPOST …/ari
  • BookingsPOST …/reservations, feed GET …/messages, acquittement POST …/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
// 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
# 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
# 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.