Webhooks
Webhooks permitem integrar a SauBit com prontuários (HIS/EMR) e automações internas do hospital.
Quando configurado, a SauBit envia eventos via POST para um endpoint do hospital (ex: https://hospital.exemplo.com/webhooks/events).
Como configurar
O cadastro do webhook é feito no Admin (organização):
- URL do destino
- Eventos desejados (ou todos)
- Secret (gerado e exibido uma única vez)
Headers enviados
X-SauBit-Event: tipo do eventoX-SauBit-Timestamp: epoch secondsX-SauBit-Signature: assinatura HMAC
Assinatura (HMAC)
O corpo é assinado com:
HMAC_SHA256(secret, "{timestamp}.{raw_body}")
Formato do header:
X-SauBit-Signature: sha256=<hex>
Eventos
analysis.completed
Disparado quando uma análise termina (check ou recheck).
Payload:
{
"event": "analysis.completed",
"data": {
"analysis_id": "uuid",
"endpoint": "/interactions/check",
"cached": false,
"recheck_of": "uuid-opcional"
}
}
chat.message
Disparado quando o hospital envia uma mensagem no chat.
Payload:
{
"event": "chat.message",
"data": {
"session_id": "abc123",
"analysis_id": "uuid-opcional"
}
}
Exemplo de verificação (Node.js)
import crypto from "crypto";
export function verifySauBitWebhook(req, secret) {
const timestamp = req.headers["x-saubit-timestamp"];
const signature = req.headers["x-saubit-signature"];
const rawBody = req.rawBody; // corpo bruto (bytes/string)
const msg = `${timestamp}.${rawBody}`;
const digest = crypto.createHmac("sha256", secret).update(msg).digest("hex");
const expected = `sha256=${digest}`;
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}
Exemplo de verificação (Python)
import hmac
import hashlib
def verify_saubit(signature: str, timestamp: str, raw_body: bytes, secret: str) -> bool:
msg = timestamp.encode() + b"." + raw_body
digest = hmac.new(secret.encode(), msg, hashlib.sha256).hexdigest()
expected = f"sha256={digest}"
return hmac.compare_digest(signature, expected)