Pular para o conteúdo principal
Use $vzaps->events() para receber eventos da instância em tempo real, sem expor URL pública. Para callbacks HTTP, veja Webhooks.
Em PHP, realtime deve rodar em CLI, worker, daemon, Laravel Command, Symfony Console ou consumidor de fila. Não mantenha um WebSocket aberto dentro do ciclo de vida normal de uma request HTTP.

Eventos comuns

EventoDescrição
MessageNova mensagem recebida ou evento de mensagem.
ReadReceiptAtualização de leitura/entrega.
PresencePresença do usuário.
ChatPresencePresença em chat.
HistorySyncSincronização de histórico.
ConnectedInstância conectada ao WhatsApp.
DisconnectedInstância desconectada.
GroupParticipantsAddParticipantes adicionados em grupo.
GroupParticipantsRemoveParticipantes removidos de grupo.
AllTodos os eventos assinados.

Instalar transporte WebSocket

composer require textalk/websocket
Também é possível passar webSocketFactory no VZapsClient para testes ou transporte próprio.

Assinar realtime

use VZaps\Sdk\Models\Realtime\EventSubscribeRequest;
use VZaps\Sdk\Models\Realtime\VZapsEventType;

$subscription = $vzaps->events()->subscribe(new EventSubscribeRequest(
    instanceId: 'VZ...',
    instanceToken: 'instance-token',
    events: [
        VZapsEventType::Message,
        VZapsEventType::ReadReceipt,
        VZapsEventType::Connected,
        VZapsEventType::Disconnected,
    ],
    reconnect: true,
    maxRetries: 10,
    retryDelayMs: 1000,
));
Retorno: EventSubscription — objeto com on(), close() e reconexao automatica quando configurada. Opções:
CampoTipoObrigatórioDescrição
instanceIdstringSimInstância que será acompanhada.
instanceTokenstringSimToken da instância.
eventsVZapsEventType[] ou string[]NãoLista de eventos. Se omitido, usa eventos assinados na instância.
reconnectbooleanNãoReconectar automaticamente. Padrão: true.
maxRetriesintNãoMáximo de tentativas.
retryDelayMsintNãoDelay entre tentativas.
lastEventIdstringNãoCursor para retomada.

Registrar handlers

$subscription->on(VZapsEventType::Message, function ($event): void {
    echo $event->id . PHP_EOL;
    echo $event->instanceId . PHP_EOL;
    print_r($event->data);
});

$subscription->on(VZapsEventType::All, function ($event): void {
    echo 'Evento recebido: ' . $event->type . PHP_EOL;
});

$subscription->onError(function ($error): void {
    error_log('Erro realtime: ' . $error->getMessage());
});

Fechar assinatura

$subscription->close();
Retorno: Promise<void> apos fechar o WebSocket. Em processos CLI:
if (function_exists('pcntl_signal')) {
    pcntl_signal(SIGINT, function () use ($subscription): void {
        $subscription->close();
        exit(0);
    });
}

$subscription->awaitClose();

Envelope do evento

Cada 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 origem no payload original.
created_atData de criação do evento no payload original.
dataPayload do evento.
data.media_urlURL de mídia quando o evento recebido contém mídia e a plataforma disponibiliza o arquivo.
No objeto PHP VZapsEvent, os atalhos principais ficam como $event->id, $event->type, $event->instanceId, $event->createdAt, $event->data e $event->raw.

Entrega e ack

A entrega é at-least-once. Seu app deve tratar eventos de forma idempotente. Depois que o handler termina, o SDK envia ack automaticamente. Recomendações:
  • salve event.id se sua automação executa efeitos externos;
  • ignore eventos já processados;
  • use lastEventId ao reconectar se quiser reduzir lacunas;
  • mantenha handlers rápidos e mova trabalhos longos para sua própria fila.

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
Quer reprocessar entregas via logsWebhook