Notificações por Webhook
Webhooks permitem que você receba notificações HTTP POST em tempo real sempre que algo mudar no seu workspace do Archyl. Crie um webhook, aponte para a sua URL, escolha os eventos que importam para você, e o Archyl notificará o seu endpoint toda vez que esses eventos forem disparados.
Visão Geral
Quando um evento ocorre — um sistema é criado, um release é implantado, uma ADR é atualizada — o Archyl envia uma requisição HTTP POST para todos os webhooks inscritos naquele evento. Seu endpoint recebe um payload JSON descrevendo o que aconteceu, quem fez e a qual projeto pertence.
Casos de uso comuns:
- Notificações no Slack ou Teams quando mudanças na arquitetura são feitas
- Gatilhos de CI/CD quando um novo release é criado
- Log de auditoria em um sistema externo
- Dashboards personalizados que reagem a eventos de arquitetura
- Pipelines de automação que executam quando descobertas são concluídas
Eventos Suportados
Elementos de Arquitetura
| Categoria | Eventos |
|---|---|
| Sistemas | system.created, system.updated, system.deleted |
| Containers | container.created, container.updated, container.deleted |
| Componentes | component.created, component.updated, component.deleted |
| Código | code.created, code.updated, code.deleted |
| Relacionamentos | relationship.created, relationship.updated, relationship.deleted |
| Overlays | overlay.created, overlay.updated, overlay.deleted |
Gerenciamento de Projetos
| Categoria | Eventos |
|---|---|
| Projetos | project.created, project.updated, project.deleted |
| Releases | release.created, release.updated, release.deployed |
| Requests | request.created, request.merged, request.closed |
Documentação
| Categoria | Eventos |
|---|---|
| ADRs | adr.created, adr.updated, adr.deleted |
| Documentação | documentation.created, documentation.updated, documentation.deleted |
| Fluxos | flow.created, flow.updated, flow.deleted |
| Contratos de API | api_contract.created, api_contract.updated |
Colaboração e Análise
| Categoria | Eventos |
|---|---|
| Comentários | comment.created |
| Whiteboards | whiteboard.created |
| Canais de Eventos | event_channel.created |
| Descoberta | discovery.completed |
| Insights | insight.generated |
Criando um Webhook
- Vá em Configurações da Organização e selecione a aba Webhooks
- Clique em Novo Webhook
- Preencha a configuração:
| Campo | Obrigatório | Descrição |
|---|---|---|
| Nome | Sim | Um rótulo descritivo (ex.: "Slack — Mudanças de Arquitetura") |
| URL | Sim | O endpoint HTTPS que receberá as requisições POST |
| Token Secreto | Não | Um segredo compartilhado usado para assinar payloads para verificação |
| Eventos | Sim | Selecione quais eventos disparam este webhook |
| Projetos | Não | Opcionalmente restrinja a projetos específicos |
- Clique em Criar
O webhook começa a receber eventos imediatamente.
Formato do Payload
Cada entrega de webhook envia um payload JSON com esta estrutura:
{
"event": "system.created",
"timestamp": "2026-03-10T14:30:00Z",
"data": {
"entityType": "system",
"entityName": "Payment Service",
"action": "created",
"userName": "vincent",
"projectId": "a1b2c3d4-...",
"projectName": "My Project"
}
}
| Campo | Descrição |
|---|---|
event |
A string do tipo de evento (ex.: container.updated, release.deployed) |
timestamp |
Timestamp ISO 8601 de quando o evento ocorreu |
data.entityType |
O tipo de entidade que mudou |
data.entityName |
O nome da entidade afetada |
data.action |
A ação que foi realizada |
data.userName |
O usuário que disparou o evento |
data.projectId |
UUID do projeto onde o evento ocorreu |
data.projectName |
Nome legível do projeto |
O header Content-Type é sempre application/json.
Segurança
Headers da Requisição
Cada entrega de webhook inclui estes headers:
| Header | Exemplo | Descrição |
|---|---|---|
Content-Type |
application/json |
Sempre JSON |
User-Agent |
Archyl-Webhook/1.0 |
Identifica a requisição como vinda do Archyl |
X-Archyl-Event |
system.created |
O tipo de evento que disparou esta entrega |
X-Archyl-Signature |
sha256=a1b2c3... |
Assinatura HMAC-SHA256 (somente se um token secreto estiver definido) |
Verificação de Assinatura HMAC-SHA256
Se você definir um token secreto ao criar o webhook, o Archyl assina cada payload usando HMAC-SHA256. A assinatura é enviada no header X-Archyl-Signature com o formato:
sha256=<digest HMAC-SHA256 codificado em hex>
Para verificar uma entrega:
- Leia o corpo bruto da requisição (os bytes exatos, antes de qualquer parsing JSON)
- Leia o header
X-Archyl-Signaturee remova o prefixosha256=para obter a assinatura em hex - Compute um hash HMAC-SHA256 do corpo bruto usando seu token secreto como chave
- Codifique o resultado em hex e compare com a assinatura do passo 2 usando uma comparação em tempo constante
- Rejeite a requisição se não forem iguais
Exemplo em Go:
func verifyArchylWebhook(r *http.Request, secret string) ([]byte, error) {
body, err := io.ReadAll(r.Body)
if err != nil {
return nil, err
}
header := r.Header.Get("X-Archyl-Signature")
if !strings.HasPrefix(header, "sha256=") {
return nil, fmt.Errorf("missing or invalid signature header")
}
signature := strings.TrimPrefix(header, "sha256=")
mac := hmac.New(sha256.New, []byte(secret))
mac.Write(body)
expected := hex.EncodeToString(mac.Sum(nil))
if !hmac.Equal([]byte(expected), []byte(signature)) {
return nil, fmt.Errorf("signature mismatch")
}
return body, nil
}
Exemplo em Node.js:
const crypto = require("crypto");
function verifyArchylWebhook(req, secret) {
const header = req.headers["x-archyl-signature"] || "";
if (!header.startsWith("sha256=")) {
throw new Error("Missing or invalid signature header");
}
const signature = header.slice("sha256=".length);
const body = req.rawBody; // use raw body, not parsed JSON
const expected = crypto
.createHmac("sha256", secret)
.update(body)
.digest("hex");
if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
throw new Error("Signature mismatch");
}
return JSON.parse(body);
}
Exemplo em Python:
import hmac
import hashlib
def verify_archyl_webhook(body: bytes, header: str, secret: str) -> dict:
if not header.startswith("sha256="):
raise ValueError("Missing or invalid signature header")
signature = header.removeprefix("sha256=")
expected = hmac.new(
secret.encode(), body, hashlib.sha256
).hexdigest()
if not hmac.compare_digest(expected, signature):
raise ValueError("Signature mismatch")
return json.loads(body)
Sempre use comparação em tempo constante (hmac.Equal, crypto.timingSafeEqual, hmac.compare_digest) para prevenir ataques de timing. Sempre verifique contra o corpo bruto da requisição -- fazer parsing e re-serializar o JSON pode alterar a representação em bytes e quebrar a assinatura.
Histórico de Entregas
Cada webhook mantém um log das entregas recentes. Para visualizar:
- Vá em Configurações da Organização > Webhooks
- Clique no nome do webhook
- Abra a aba Entregas
Cada registro de entrega mostra:
| Campo | Descrição |
|---|---|
| Evento | O tipo de evento que disparou a entrega |
| Código de Status | O código de resposta HTTP do seu endpoint |
| Timestamp | Quando a entrega foi enviada |
| Duração | Quanto tempo a requisição levou |
| Payload da Requisição | O corpo JSON completo que foi enviado |
| Corpo da Resposta | A resposta retornada pelo seu endpoint |
As entregas são retidas por 7 dias. Após esse período, são automaticamente removidas.
Um badge verde indica uma entrega bem-sucedida (resposta 2xx). Vermelho indica uma falha (não-2xx ou timeout).
Testes
Antes de confiar em um webhook em produção, verifique se ele funciona:
- Abra a página de detalhes do webhook
- Clique em Enviar Teste
- O Archyl envia um payload de teste para o seu endpoint com
event: "webhook.test" - Verifique a aba Entregas para confirmar o recebimento e inspecionar a resposta
A entrega de teste usa o mesmo mecanismo de assinatura dos eventos reais, então você pode validar sua lógica de verificação de assinatura ao mesmo tempo.
Política de Retentativa
Quando uma entrega falha (resposta não-2xx ou timeout de rede), o Archyl tenta novamente automaticamente:
| Tentativa | Atraso |
|---|---|
| 1a retentativa | 1 minuto |
| 2a retentativa | 5 minutos |
| 3a retentativa | 30 minutos |
Após 3 retentativas falhadas, a entrega é marcada como falha. Você pode re-disparar manualmente qualquer entrega falhada na aba Entregas clicando em Tentar Novamente.
Se um webhook falhar consistentemente por 24 horas, o Archyl o desabilita e envia uma notificação para os administradores da organização. Reative-o nas configurações do webhook assim que o problema for resolvido.
Filtragem por Projetos
Por padrão, um webhook recebe eventos de todos os projetos da organização. Para restringir o escopo:
- Edite o webhook
- Em Projetos, selecione um ou mais projetos
- Salve
Apenas eventos originados dos projetos selecionados dispararão entregas. Isso é útil quando diferentes equipes gerenciam diferentes projetos e precisam apenas de notificações sobre o próprio trabalho.
Você pode atualizar o filtro de projetos a qualquer momento sem precisar recriar o webhook.
Boas Práticas
Responda Rapidamente
Seu endpoint deve retornar uma resposta 2xx em até 10 segundos. Se você precisar fazer processamento pesado, aceite o webhook imediatamente e processe o trabalho de forma assíncrona em um job em segundo plano.
Verifique as Assinaturas
Sempre defina um token secreto e verifique o header X-Archyl-Signature. Isso garante que os payloads realmente vêm do Archyl e não foram adulterados.
Use HTTPS
Sempre use um endpoint HTTPS. O Archyl não entregará webhooks para URLs HTTP simples.
Filtre por Projeto
Se sua organização tem muitos projetos, restrinja os webhooks aos projetos que importam para você. Isso reduz o ruído e evita processamento desnecessário do seu lado.
Trate Duplicatas
Em casos raros (retentativas de rede, failover de infraestrutura), seu endpoint pode receber o mesmo evento mais de uma vez. Use os campos timestamp e event para detectar e deduplicar.
Monitore a Saúde das Entregas
Verifique a aba Entregas periodicamente. Um padrão de falhas pode indicar problemas no endpoint, regras de firewall ou credenciais expiradas do seu lado.
Próximos Passos
- Integrações do Marketplace — Conecte serviços externos e exiba dados em tempo real nos seus dashboards
- Gerenciamento de Releases — Acompanhe implantações em toda a sua arquitetura
- Insights de Arquitetura — Detecte problemas arquiteturais automaticamente