Aller au contenu

Gestion des tenants

Les endpoints d’administration vivent sous /api/v1 et sont protégés par l’en-tête X-Admin-Key (opérateur de plateforme). Ils gèrent tout le cycle de vie d’un tenant après l’approvisionnement.

Une seule règle à retenir :

  • provision/tenant prend un corps JSON (aucun tenant_id, il est généré) ;
  • toutes les autres opérations prennent ?tenant_id= en paramètre de requête, et un corps JSON uniquement quand il y a quelque chose à écrire (update/tenant).
MéthodeCheminParamètreEffet
POST/provision/tenantcorpsCrée le tenant ; renvoie tenant_id + tenant_secret + widget_public_key (une fois)
POST/update/tenant?tenant_id= + corpsMise à jour partielle (exclude_unset)
POST/rotate/tenant-secret?tenant_id=Nouveau secret ; l’ancien est invalide immédiatement
POST/rotate/widget-key?tenant_id=Nouvelle clé widget ; l’ancienne cesse de fonctionner immédiatement
POST/suspend/tenant?tenant_id=Les appels HMAC#1 renvoient 403 jusqu’à réactivation
POST/reactivate/tenant?tenant_id=Lève la suspension
GET/fetch/tenant?tenant_id=Renvoie le tenant (sans secret)
GET/fetch/tenants?limit=&offset=Liste paginée (sans secrets)

update/tenant n’écrit que les champs présents dans le corps. Servez-vous en pour le rate limit, l’URL de callback, le branding, les origines, les feature flags, les quotas, le plan_tier et le stripe_customer_id.

Fenêtre de terminal
curl "$BASE_URL/api/v1/update/tenant?tenant_id=019e4ae7-1a2b-7c3d-8e4f-5a6b7c8d9e0f" \
-X POST \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"plan_tier": "pro",
"monthly_msg_quota": 50000,
"agent_seats": 25,
"branding_primary_color": "#0055FF"
}'

La rotation des secrets et les changements de statut ne passent pas par update/tenant — ils ont leurs propres endpoints, ci-dessous.

rotate/tenant-secret génère un nouveau tenant_secret. L’ancien est invalide immédiatement : chaque backend qui signe en HMAC#1 doit basculer sur la nouvelle valeur au même instant.

Fenêtre de terminal
curl "$BASE_URL/api/v1/rotate/tenant-secret?tenant_id=019e4ae7-1a2b-7c3d-8e4f-5a6b7c8d9e0f" \
-X POST \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"status_code": 200,
"data": {
"tenant_id": "019e4ae7-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
"tenant_secret": "sk_...",
"rotated_at": "2026-06-21T11:00:00Z"
},
"message": "Secret rotated. Save the new tenant_secret — old secret is now invalid."
}

rotate/widget-key génère une nouvelle widget_public_key. C’est une opération propre au chat (l’Auth Relay n’a pas d’équivalent). L’ancienne clé cesse de fonctionner immédiatement : mettez à jour chaque balise <script data-public-key=...> et chaque configuration de SDK.

Fenêtre de terminal
curl "$BASE_URL/api/v1/rotate/widget-key?tenant_id=019e4ae7-1a2b-7c3d-8e4f-5a6b7c8d9e0f" \
-X POST \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"status_code": 200,
"data": {
"tenant_id": "019e4ae7-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
"widget_public_key": "pk_...",
"rotated_at": "2026-06-21T11:05:00Z"
},
"message": "Widget public key rotated. Update <script data-public-key=...> on every tenant page; old key stops working immediately."
}

Suspendre un tenant fait répondre 403 à tous ses appels HMAC#1 jusqu’à réactivation — utile en cas d’abus ou d’impayé.

  1. SuspendrePOST /suspend/tenant?tenant_id=.... Les appels backend signés sont refusés (403) ; la configuration reste intacte.
  2. RéactiverPOST /reactivate/tenant?tenant_id=.... Les appels reprennent immédiatement.
Fenêtre de terminal
# Suspendre
curl "$BASE_URL/api/v1/suspend/tenant?tenant_id=019e4ae7-1a2b-7c3d-8e4f-5a6b7c8d9e0f" \
-X POST -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Réactiver
curl "$BASE_URL/api/v1/reactivate/tenant?tenant_id=019e4ae7-1a2b-7c3d-8e4f-5a6b7c8d9e0f" \
-X POST -H "X-Admin-Key: YOUR_ADMIN_KEY"

fetch/tenant renvoie un tenant complet sans son tenant_secret (la widget_public_key, elle, est présente). fetch/tenants pagine la liste via limit (1–500, défaut 100) et offset.

Fenêtre de terminal
curl "$BASE_URL/api/v1/fetch/tenants?limit=50&offset=0" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"