Pular para o conteúdo principal
Use client.Events para receber eventos da instância em tempo real sem expor URL pública. Para callbacks HTTP, veja Webhooks.

Eventos comuns

EventoDescrição
MessageNova mensagem recebida ou evento de mensagem.
ReadReceiptAtualização de leitura/entrega.
PresencePresença do usuário.
ChatPresencePresença no chat.
HistorySyncSincronização de histórico.
ConnectedInstância conectada ao WhatsApp.
DisconnectedInstância desconectada.
GroupParticipantsAddParticipantes adicionados ao grupo.
GroupParticipantsRemoveParticipantes removidos do grupo.
AllTodos os eventos assinados.
Use as constantes exportadas: vzaps.EventMessage, vzaps.EventConnected, etc.

Assinar realtime

sub, err := client.Events.Subscribe(ctx, vzaps.EventSubscribeRequest{
	InstanceID:    "VZ...",
	InstanceToken: "instance-token",
	Events:        []vzaps.EventType{vzaps.EventMessage, vzaps.EventReadReceipt, vzaps.EventConnected, vzaps.EventDisconnected},
	Reconnect:     true,
	MaxRetries:    10,
	RetryDelay:    time.Second,
})
Retorno: EventSubscription — objeto com on(), close() e reconexao automatica quando configurada. Opções:
CampoTipoObrigatórioDescrição
InstanceIDstringSimInstância a observar.
InstanceTokenstringSimToken da instância.
Events[]EventTypeNãoLista de eventos. Se omitido, usa eventos assinados na instância.
ReconnectboolNãoReconectar automáticamente. Padrão: true.
MaxRetriesintNãoMáximo de tentativas de reconexão.
RetryDelaytime.DurationNãoAtraso entre tentativas.
LastEventIDstringNãoCursor de retomada.
Passe o mesmo context.Context da assinatura; cancelamento interrompe tentativas de reconexão.

Registrar handlers

sub.OnOpen(func() {
	fmt.Println("Realtime conectado")
})

sub.On(vzaps.EventMessage, func(event vzaps.Event) {
	fmt.Println(event.ID)
	fmt.Println(event.InstanceID)
	fmt.Printf("%#v\n", event.Data)
})

sub.On(vzaps.EventAll, func(event vzaps.Event) {
	fmt.Println("Evento recebido:", event.Type)
})

sub.OnError(func(err error) {
	fmt.Println("Erro realtime:", err)
})

Fechar assinatura

sub.Close()
Retorno: Promise<void> apos fechar o WebSocket. Em processos de longa duração:
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, os.Interrupt)
<-sigCh
sub.Close()

Envelope do evento

Todo evento recebido pelo SDK tem este formato:
{
  "id": "evt_01J...",
  "type": "Message",
  "instance_id": "VZ...",
  "created_at": "2026-06-23T22:57:17.000Z",
  "data": {
    "type": "Message",
    "media_url": "https://cdn.example.com/media/image.jpg"
  }
}
Campos:
CampoDescrição
idIdentificador do evento. Use para deduplicação.
typeTipo do evento.
instance_idInstância de origem.
created_atData de criação do evento.
dataPayload do evento.
data.media_urlURL de mídia quando o evento recebido contém mídia e a plataforma fornece o arquivo.
Em Go, acesse via event.ID, event.Type, event.InstanceID, event.CreatedAt e event.Data.

Entrega e ack

A entrega é at-least-once. Sua aplicação deve processar eventos de forma idempotente. Após o handler terminar, o SDK envia ack automáticamente. Recomendações:
  • armazene event.ID se sua automação executa efeitos externos;
  • ignore eventos já processados;
  • use LastEventID ao reconectar para reduzir lacunas;
  • mantenha handlers rápidos e mova trabalho longo para fila própria.

Realtime ou webhook?

CenárioRecomendação
Bot, dashboard ou app com consumo imediatoRealtime
Backend com URL pública e pipeline HTTPWebhook
Não quer expor URL públicaRealtime
Precisa reprocessar entregas via logsWebhook