Eventos
Definir Webhook
Cria ou atualiza um webhook (até 3 habilitados por instância) com filtro de eventos, mídia em base64 e header Authorization próprio
POST
Definir Webhook
Auth:
Envelope:
TokenAccount ou TokenInstance • Rate-limit: Global (100/min) • Idempotente: sim (upsert por label)
Descrição
Cria ou atualiza a linha(instance, label) em webhook_configs. Cada instância aceita até 3 webhooks habilitados simultâneos, identificados por um label livre. Webhooks com enabled=false ficam preservados no banco mas não contam para o limite e não recebem entregas.
Casos de uso:
- Criar novo webhook: envie um
labelainda não usado. - Atualizar existente: envie o mesmo
label, todos os campos novos sobrescrevem os antigos. - Soft-disable: envie o mesmo
labelcom{"enabled": false}(limpaurl,authorization,events,mediaBase64, mas preserva a linha). - Migração paralela: rode o webhook antigo enquanto valida o novo num
labeldiferente; quando confirmar, desabilita o antigo.
Exemplos
Mínimo
Habilita o webhookdefault apontando para https://meuapp.com/webhook. Sem events, recebe os 6 tipos; sem authorization, não envia header de autenticação.
Com label, filtro e Authorization
Cria um webhook nomeadoanalytics-pipeline que recebe apenas message.exchange e message.status, envia o header Authorization: Bearer svc-token-xyz em cada entrega e desliga o backup em base64.
byEvents = true (roteamento por URL)
LigabyEvents: true para que cada delivery seja enviada com o nome do evento como sufixo da URL (ex.: https://meuapp.com/wh/message.exchange), permitindo rotear no servidor por endpoint sem precisar inspecionar o payload.
Soft-disable preservando o label
Desliga o webhookanalytics-pipeline enviando apenas enabled: false. A linha permanece no banco mas url, authorization, events e mediaBase64 são zerados, e a entrada deixa de contar para o limite de 3 webhooks ativos.
Mídia em base64 (backup raw)
Configura um webhook dedicado a backup que recebe somentemessage.exchange com mediaBase64: true, fazendo cada mensagem com mídia incluir o conteúdo binário codificado em base64 dentro do payload.
Resposta de sucesso
A resposta devolve o objetowebhook com a configuração efetivamente persistida (label, enabled, url, authorization, byEvents, events, mediaBase64), espelha o body do request após o upsert. Quando enabled=false, os campos url, authorization, events e mediaBase64 voltam zerados. O dispatcher passa a usar a nova config imediatamente (o cache interno de 30s é invalidado no save).
200 OK
Parâmetros de rota
Nome da instância (ex.:
$Instance_Name).Headers
TokenAccount ou TokenInstance.application/jsonRequest body
Identificador local. Máx. 50 chars; aceita
[a-zA-Z0-9_-]. Vazio ou omitido vira "default". Permite múltiplos webhooks por instância.Liga/desliga o webhook. Quando
false, os campos url, authorization, byEvents, events e mediaBase64 são zerados antes de salvar.URL de destino. Obrigatória quando
enabled=true. Passa pelo SSRF guard (ver abaixo), bloqueia localhost, IPs privados, link-local, multicast.Conteúdo literal do header
Authorization enviado em cada delivery (ex.: Bearer secret-key-123). Encriptado at-rest com AES-256-GCM quando ENCRYPTION_KEY está configurada.Se
true, a URL recebe sufixo /<event-name> em cada entrega, útil para roteamento por endpoint sem inspecionar o payload (https://app/wh/message.exchange).Filtro. Array vazio = recebe todos os 6 tipos. Cada entrada precisa estar em
{message.exchange, message.status, call.update, group.flow, instance.state, label.update}.Quando
true, eventos message.exchange com mídia incluem media.base64 (aumenta payload, pode passar de 100KB).SSRF guard
Aurl é validada na configuração e antes de cada delivery. Bloqueia destinos que apontem para a infraestrutura interna:
| Faixa | Exemplo |
|---|---|
| Loopback | localhost, 127.0.0.1, ::1 |
| IPv4 privado | 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 |
| Link-local IPv4 | 169.254.0.0/16 |
| Link-local IPv6 | fe80::/10 |
| Multicast / broadcast | 224.0.0.0/4, 255.255.255.255 |
Notas
authorizationvazio vs.null: envienullou omita para não enviar header. String vazia""resultaria emAuthorization:vazio, que alguns proxies rejeitam.enabled=falsezera os campos: re-habilitar o mesmolabeldepois exige re-enviar aurl(e os outros campos que você quiser preservar).- Não há
DELETE: para “remover” um webhook, façaPOSTcom{"enabled": false}mantendo olabel. Operadores podem inspecionar/limpar a linha diretamente no banco quando necessário. - Encriptação opcional: se
ENCRYPTION_KEYnão está configurada, oauthorizationé armazenado em texto puro. Em produção, sempre configure a chave. - Cache invalidado: a config nova fica visível para o dispatcher imediatamente (TTL interno de 30s é invalidado no save).
Erros
| HTTP | error.message |
|---|---|
| 400 | Invalid request body |
| 400 | URL is required when enabled is true |
| 400 | URL must not target localhost or private network |
| 400 | invalid event type: <valor> |
| 400 | label too long (max 50 chars) |
| 400 | label may only contain letters, digits, underscore or dash |
| 401 | Invalid token |
| 404 | Instance not found |
| 409 | webhook limit reached (max 3 enabled per instance) |
| 429 | Rate limit exceeded. Try again later. |
| 500 | Failed to get instance |
O check do limite de 3 só é aplicado ao criar uma linha nova com
enabled=true. Editar uma linha já existente (mesmo label) nunca aciona o limite.Próximo
Listar webhooks
GET /api/events/getWebhook/:instance, todos ou por ?label=.Catálogo de eventos
O que cada
event carrega no data.