Aller au contenu

Webhooks

Le relais POSTe les événements de chat vers votre backend sous /api/v1/chat-callbacks/*, chacun signé en HMAC#1 — la même recette que vos appels sortants, dans l’autre sens. L’adaptateur du SDK Python monte ces endpoints et vérifie la signature pour vous.

Le relais construit l’URL de callback à partir du callback_url_base du tenant (configuré à l’approvisionnement ou via update/tenant) : il y appose /chat-callbacks/<événement> et signe chaque requête.

POST {callback_url_base}/api/v1/chat-callbacks/<événement>

L’adaptateur monte neuf endpoints. Six existent depuis la première phase ; les trois événements agent_* arrivent avec la prise en main par agent.

CheminÉvénement
POST /api/v1/chat-callbacks/conversation-startedNouvelle conversation ouverte
POST /api/v1/chat-callbacks/message-receivedLe visiteur a envoyé un message
POST /api/v1/chat-callbacks/ticket-createdTicket créé automatiquement par escalade
POST /api/v1/chat-callbacks/ticket-assignedTicket pris par un agent humain
POST /api/v1/chat-callbacks/ticket-resolvedTicket marqué résolu
POST /api/v1/chat-callbacks/escalation-triggeredLe bot a escaladé vers un humain
POST /api/v1/chat-callbacks/agent-assignedUn opérateur a pris la conversation
POST /api/v1/chat-callbacks/agent-releasedL’opérateur a rendu la conversation à la file
POST /api/v1/chat-callbacks/agent-resolvedL’opérateur a marqué la conversation résolue

BloonioChatAdapter.from_env(app) monte les neuf endpoints et câble le client à partir des variables BLOONIO_CHAT_*.

from fastapi import FastAPI
from bloonio_chat_relay_client.adapters.fastapi import BloonioChatAdapter
app = FastAPI()
BloonioChatAdapter.from_env(app) # monte /api/v1/chat-callbacks/* + câble le client

Branchez des handlers pour réagir aux événements de votre côté. Les handlers sont optionnels : un événement sans handler enregistré est quand même accepté (signature HMAC#1 vérifiée), journalisé en debug, et renvoie {"received": true}.

async def on_ticket_created(event):
... # mettre à jour votre CRM, notifier, etc.
BloonioChatAdapter.from_env(app, handlers={
"ticket-created": on_ticket_created,
})

Les trois événements de prise en main par agent partagent la même forme de corps :

{
"conversation_id": "<ObjectId chat_api>",
"tenant_id": "<UUID v7>",
"status": "ASSIGNED" | "WAITING" | "RESOLVED",
"operator_id": "<UUID v7>",
"operator_display_name": "Sarah Chen", // uniquement sur agent-assigned
"visitor_session_id": "vs_<base64url>",
"escalation_reason": "user_requested" | "restricted_topic" | "low_confidence" | "direct" | null,
"claim_count": 1,
"claimed_at": "2026-05-22T12:34:56Z",
"released_at": null,
"resolved_at": null
}

Servez-vous-en pour mettre à jour votre CRM, envoyer des notifications push ou déclencher de l’analytique.

  1. Lisez les trois en-têtes X-Bloonio-* de la requête entrante.
  2. Recalculez hex(hmac_sha256(tenant_secret, f"{ts_ms}.{sha256_hex(body)}")).
  3. Comparez en temps constant ; vérifiez la fraîcheur du timestamp et l’absence de rejeu.
  4. Si tout passe, traitez l’événement ; sinon, répondez 401.

L’adaptateur du SDK fait exactement cela avant d’appeler vos handlers — préférez-le à une vérification maison.