Webhooks
Webhooks permitem que sistemas externos recebam notificações em tempo real sobre eventos no Axoria. Quando um evento acontece, o Axoria envia uma requisição HTTP POST para a URL configurada com um payload JSON assinado.
Acesse em Configurações → Webhooks.
Criando um Webhook
- Clique em + Novo Webhook.
- Preencha:
- URL - endpoint que receberá os eventos (deve ser HTTPS em produção)
- Segredo - string usada para assinar o payload (HMAC-SHA256). Guarde com segurança.
- Eventos - selecione quais eventos disparam este webhook
- Nome - identificação descritiva (opcional)
- Salve.
Eventos Disponíveis
| Evento | Quando é disparado |
|---|---|
issue.created |
Uma nova issue é criada |
issue.updated |
Campos de uma issue são alterados |
issue.deleted |
Uma issue é excluída |
status.changed |
O status de uma issue muda |
comment.added |
Um comentário é adicionado a uma issue |
sprint.started |
Uma sprint é iniciada |
sprint.completed |
Uma sprint é completada |
Formato do Payload
{
"event": "status.changed",
"payload": {
"issue": {
"id": "...",
"key": "SHOP-42",
"title": "Corrigir bug no checkout",
"type": "BUG",
"priority": "HIGH",
"status": "Em Revisão"
}
}
}
O payload é sempre um objeto com event (string) e payload (objeto com os dados do evento).
Verificando a Assinatura
Todo payload é acompanhado dos headers:
X-Axoria-Signature: sha256=<hash-base64>
X-Axoria-Event: status.changed
A assinatura é sha256= seguido da codificação Base64 do HMAC-SHA256 do corpo da requisição.
Para verificar a autenticidade:
import hmac, hashlib, base64
def verify(secret: str, payload: bytes, signature: str) -> bool:
mac = hmac.new(secret.encode(), payload, hashlib.sha256)
expected = "sha256=" + base64.b64encode(mac.digest()).decode()
return hmac.compare_digest(expected, signature)
const crypto = require('crypto');
function verify(secret, payload, signature) {
const hmac = crypto.createHmac('sha256', secret);
hmac.update(payload);
const expected = 'sha256=' + hmac.digest('base64');
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}
Nunca processe o payload sem verificar a assinatura.
Use a Navegação lateral para explorar toda a Documentação.