Notificações por Webhook - Archyl Docs

Receba notificações HTTP em tempo real quando mudanças na arquitetura acontecem nos seus projetos

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

  1. Vá em Configurações da Organização e selecione a aba Webhooks
  2. Clique em Novo Webhook
  3. 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
  1. 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:

  1. Leia o corpo bruto da requisição (os bytes exatos, antes de qualquer parsing JSON)
  2. Leia o header X-Archyl-Signature e remova o prefixo sha256= para obter a assinatura em hex
  3. Compute um hash HMAC-SHA256 do corpo bruto usando seu token secreto como chave
  4. Codifique o resultado em hex e compare com a assinatura do passo 2 usando uma comparação em tempo constante
  5. 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:

  1. Vá em Configurações da Organização > Webhooks
  2. Clique no nome do webhook
  3. 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:

  1. Abra a página de detalhes do webhook
  2. Clique em Enviar Teste
  3. O Archyl envia um payload de teste para o seu endpoint com event: "webhook.test"
  4. 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:

  1. Edite o webhook
  2. Em Projetos, selecione um ou mais projetos
  3. 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