HansaChat

Documentation

Webhook in entrata

Crei URL di webhook e pubblichi messaggi JSON compatibili con Slack nei canali.

I webhook in entrata permettono a strumenti esterni di pubblicare messaggi automatici in un canale HansaChat. Sono utili per aggiornamenti di deployment, avvisi di monitoraggio, notifiche di ticket, invii di moduli e altri eventi che dovrebbero comparire nella chat di team.

Solo gli amministratori del workspace possono creare e gestire i webhook in entrata.

Aprire i Webhook dalle Impostazioni

Creare un webhook

  1. Apra Impostazioni dalla barra laterale in basso a sinistra.
  2. Selezioni Webhook.
  3. Scelga Crea webhook.
  4. Inserisca un nome chiaro per il webhook, ad esempio CI Deployments.
  5. Scelga il canale in cui devono essere pubblicati i messaggi.
  6. Inserisca facoltativamente un URL per l’icona.
  7. Scelga Crea webhook.

Pagina dei webhook vuota

Modulo di creazione del webhook

Copiare l’URL del webhook

Dopo la creazione, HansaChat mostra l’URL del webhook una sola volta. Copi l’URL e lo conservi in modo sicuro nello strumento esterno che invierà gli eventi.

URL del webhook mostrato una sola volta

Se chiude questa schermata senza salvare l’URL, ruoti l’URL per generare un nuovo segreto. L’URL precedente smette di funzionare immediatamente dopo la rotazione.

Gestire i webhook

Dalla pagina Webhook, gli amministratori possono:

  • Modificare il nome del webhook, il canale, l’URL dell’icona o lo stato attivo.
  • Disattivare un webhook per rifiutare i nuovi messaggi senza eliminarlo.
  • Ruotare l’URL per invalidare il vecchio segreto e generare un nuovo URL.
  • Eliminare un webhook. I messaggi esistenti in chat non vengono rimossi.

Riferimento tecnico

Invii una richiesta POST all’URL del webhook:

https://{workspace-domain}/api/webhooks/{publicID}/{secret}

L’URL identifica il webhook. Ogni consegna deve inoltre essere firmata con il segreto del webhook: invii un’intestazione X-Webhook-Signature contenente un timestamp e una firma HMAC-SHA256 calcolata sul corpo della richiesta. Le consegne non firmate o scadute vengono rifiutate con 401. Conservi l’URL completo in modo segreto.

Firmi le proprie consegne

Ogni richiesta richiede un’intestazione X-Webhook-Signature in questo formato:

t=<unix timestamp>,v1=<hex signature>

La firma è un digest HMAC-SHA256 di <timestamp>.<corpo> — il timestamp Unix, un punto e il corpo non elaborato della richiesta — utilizzando come chiave il segreto del webhook dell’URL. Le consegne con un timestamp più vecchio di 5 minuti vengono rifiutate, quindi firmi ogni consegna subito prima di inviarla.

Bash (openssl):

URL='https://{workspace-domain}/api/webhooks/{publicID}/{secret}'
BODY='{"text":"Deployment completed successfully"}'
TS=$(date +%s)
SIG=$(printf '%s.%s' "$TS" "$BODY" | \
  openssl dgst -sha256 -hmac "$(basename "$URL")" | awk '{print $NF}')
curl -X POST "$URL" \
  -H 'Content-Type: application/json' \
  -H "X-Webhook-Signature: t=$TS,v1=$SIG" \
  -d "$BODY"

Python:

import hashlib, hmac, time, requests

url = "https://{workspace-domain}/api/webhooks/{publicID}/{secret}"
secret = url.rsplit("/", 1)[-1]
body = b'{"text":"Deployment completed successfully"}'
ts = str(int(time.time()))
sig = hmac.new(secret.encode(), f"{ts}.".encode() + body, hashlib.sha256).hexdigest()
requests.post(url, data=body,
              headers={"Content-Type": "application/json",
                       "X-Webhook-Signature": f"t={ts},v1={sig}"})

Node.js:

import { createHmac } from "node:crypto";

const url = "https://{workspace-domain}/api/webhooks/{publicID}/{secret}";
const secret = new URL(url).pathname.split("/").at(-1);
const body = JSON.stringify({ text: "Deployment completed successfully" });
const ts = Math.floor(Date.now() / 1000);
const sig = createHmac("sha256", secret).update(`${ts}.${body}`).digest("hex");
await fetch(url, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-Webhook-Signature": `t=${ts},v1=${sig}`,
  },
  body,
});

Dopo che HansaChat restituisce ok, il messaggio compare nel canale selezionato.

Messaggio di prova del webhook in un canale

Payload compatibile con Slack

L’endpoint accetta payload JSON compatibili con Slack con text, blocks e attachments.

{
  "text": "Deployment completed successfully",
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "Deployment completed"
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "Branch `main` is now live."
      }
    }
  ]
}

Almeno uno tra text, blocks o attachments deve contenere testo leggibile.

Campi supportati

Campo Obbligatorio Note
text No Contenuto del messaggio in testo semplice.
blocks No Blocchi in stile Slack Block Kit. Fino a 50 blocchi. Tipi di blocco supportati: section, header, context, image.
attachments No Allegati in stile Slack. Fino a 100 allegati.

La dimensione massima del payload è 1 MB.

Limiti di frequenza

L’ingestione dei webhook in entrata è limitata in frequenza per ogni URL di webhook.

Ogni webhook può accettare fino a 10 richieste autenticate al minuto e fino a 100 richieste autenticate all’ora. Quando uno dei due limiti viene raggiunto, HansaChat restituisce 429 resource_exhausted.

Ci contatti se desidera aumentare il limite di frequenza.

I limiti del payload sono applicati separatamente: la dimensione massima del corpo è 1 MB, blocks accetta fino a 50 elementi, attachments accetta fino a 100 elementi e il payload deve contenere testo leggibile.

Idempotenza

Aggiunga un’intestazione Idempotency-Key quando il suo sistema può ritentare lo stesso evento:

curl -X POST 'https://{workspace-domain}/api/webhooks/{publicID}/{secret}' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: deploy-1247' \
  -d '{"text":"Deployment #1247 completed"}'

Se HansaChat riceve di nuovo la stessa chiave di idempotenza per lo stesso webhook, restituisce 200 ok senza creare un messaggio duplicato.

Risposte

Le richieste riuscite restituiscono:

ok

Errori comuni:

Stato Corpo Significato
400 invalid_payload Il corpo JSON non ha potuto essere analizzato.
401 missing_signature La richiesta non ha un’intestazione X-Webhook-Signature.
401 invalid_signature La firma non è valida oppure il timestamp ha più di 5 minuti.
400 invalid_blocks La richiesta contiene più di 50 blocchi.
400 too_many_attachments La richiesta contiene più di 100 allegati.
400 no_text Il payload non contiene testo leggibile.
429 resource_exhausted Il webhook ha superato 10 richieste al minuto o 100 richieste all’ora.
404 no_active_hooks Il workspace, il webhook, il segreto o lo stato attivo non è valido.
410 channel_is_archived Il canale di destinazione è archiviato.
503 temporarily_unavailable HansaChat non può elaborare il messaggio in questo momento. Riprovi più tardi con la stessa Idempotency-Key.

Consigli di sicurezza

  • Tratti gli URL dei webhook come password.
  • Conservi gli URL nel gestore di segreti del suo strumento esterno.
  • Firmi ogni consegna con il segreto del webhook — le richieste non firmate vengono rifiutate.
  • Ruoti l’URL se è stato esposto o perso.
  • Disattivi i webhook inutilizzati.
  • Usi un webhook dedicato per ogni sistema esterno, così l’accesso può essere revocato in modo pulito.