Dolazni webhookovi omogućuju vanjskim alatima objavljivanje automatskih poruka u HansaChat kanal. Upotrijebite ih za ažuriranja implementacija, upozorenja nadzora, obavijesti o karticama, prijave obrazaca i druge događaje koji trebaju biti vidljivi u timskom chatu.
Samo administratori radnog prostora mogu stvarati i upravljati dolaznim webhookovima.

Stvaranje webhooka
- Otvorite Postavke iz donje lijeve bočne trake.
- Odaberite Webhookovi.
- Odaberite Stvori webhook.
- Unesite jasan naziv webhooka, primjerice
CI Deployments. - Odaberite kanal u koji se poruke trebaju objavljivati.
- Po želji unesite URL ikone.
- Odaberite Stvori webhook.


Kopiranje URL-a webhooka
Nakon stvaranja HansaChat prikazuje URL webhooka samo jednom. Kopirajte ga i pohranite na sigurno mjesto u vanjskom alatu koji će slati događaje.

Ako zatvorite ovaj zaslon bez spremanja URL-a, rotirajte URL da biste generirali novu tajnu. Prethodni URL prestaje raditi odmah nakon rotacije.
Upravljanje webhookovima
Sa stranice Webhookovi administratori mogu:
- Urediti naziv webhooka, kanal, URL ikone ili aktivno stanje.
- Onemogućiti webhook da biste odbijali nove poruke bez brisanja.
- Rotirati URL da biste poništili staru tajnu i generirali novi URL.
- Izbrisati webhook. Postojeće poruke u chatu ne uklanjaju se.
Tehnička referenca
Pošaljite POST zahtjev na URL webhooka:
https://{workspace-domain}/api/webhooks/{publicID}/{secret}
URL identificira webhook. Svaku isporuku treba dodatno potpisati tajnom webhooka: pošaljite zaglavlje X-Webhook-Signature s vremenskom oznakom i HMAC-SHA256 potpisom izračunatim nad tijelom zahtjeva. Nepotpisane ili istekle isporuke odbijaju se s 401. Čuvajte cijeli URL kao tajnu.
Potpišite svoje isporuke
Svaki zahtjev treba zaglavlje X-Webhook-Signature u ovom formatu:
t=<unix timestamp>,v1=<hex signature>
Potpis je HMAC-SHA256 sažetak (digest) nad <vremenska oznaka>.<tijelo> — unix vremenska oznaka, točka i sirovo tijelo zahtjeva — s tajnom webhooka iz URL-a kao ključem. Isporuke s vremenskom oznakom starijom od 5 minuta odbijaju se, stoga potpišite svaku isporuku neposredno prije slanja.
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,
});
Kada HansaChat vrati ok, poruka se pojavljuje u odabranom kanalu.

Payload kompatibilan sa Slackom
Krajnja točka prihvaća JSON payloadove kompatibilne sa Slackom s poljima text, blocks i 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."
}
}
]
}
Barem jedno od polja text, blocks ili attachments mora sadržavati čitljiv tekst.
Podržana polja
| Polje | Obavezno | Napomene |
|---|---|---|
text |
Ne | Sadržaj poruke kao običan tekst. |
blocks |
Ne | Blokovi u stilu Slack Block Kita. Do 50 blokova. Podržane vrste blokova: section, header, context, image. |
attachments |
Ne | Prilozi u stilu Slacka. Do 100 priloga. |
Maksimalna veličina payloada je 1 MB.
Ograničenja učestalosti
Prijem dolaznih webhookova ograničen je po učestalosti za svaki URL webhooka.
Svaki webhook može prihvatiti do 10 autenticiranih zahtjeva u minuti i do 100 autenticiranih zahtjeva na sat. Kada se bilo koje od tih ograničenja dosegne, HansaChat vraća 429 resource_exhausted.
Kontaktirajte nas ako želite povećati ograničenje učestalosti.
Ograničenja payloada provode se odvojeno: maksimalna veličina tijela je 1 MB, blocks prihvaća do 50 stavki, attachments do 100 stavki, a payload mora sadržavati čitljiv tekst.
Idempotencija
Dodajte zaglavlje Idempotency-Key kada vaš sustav može ponovno poslati isti događaj:
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"}'
Ako HansaChat ponovno primi isti ključ idempotencije za isti webhook, vraća 200 ok bez stvaranja duplicirane poruke.
Odgovori
Uspješni zahtjevi vraćaju:
ok
Uobičajene pogreške:
| Status | Tijelo | Značenje |
|---|---|---|
| 400 | invalid_payload |
JSON tijelo nije bilo moguće analizirati. |
| 401 | missing_signature |
Zahtjev nema zaglavlje X-Webhook-Signature. |
| 401 | invalid_signature |
Potpis nije valjan ili je vremenska oznaka starija od 5 minuta. |
| 400 | invalid_blocks |
Zahtjev sadrži više od 50 blokova. |
| 400 | too_many_attachments |
Zahtjev sadrži više od 100 priloga. |
| 400 | no_text |
Payload nema čitljivog teksta. |
| 429 | resource_exhausted |
Webhook je premašio 10 zahtjeva u minuti ili 100 zahtjeva na sat. |
| 404 | no_active_hooks |
Radni prostor, webhook, tajna ili aktivno stanje nisu valjani. |
| 410 | channel_is_archived |
Ciljni kanal je arhiviran. |
| 503 | temporarily_unavailable |
HansaChat trenutačno ne može obraditi poruku. Pokušajte kasnije s istim Idempotency-Key. |
Sigurnosni savjeti
- Postupajte s URL-ovima webhookova kao s lozinkama.
- Pohranite URL-ove u upravitelju tajni svog vanjskog alata.
- Potpišite svaku isporuku tajnom webhooka — nepotpisani zahtjevi odbijaju se.
- Rotirajte URL ako je bio izložen ili izgubljen.
- Onemogućite nekorištene webhookove.
- Upotrijebite namjenski webhook za svaki vanjski sustav kako bi se pristup mogao uredno opozvati.