Documentation · PMS interface

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?>

This technical documentation is available in French only.

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
// 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_ ; 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.