Todas as funções de envio ficam em client.Messages.
No SDK, o id da instância vira InstanceId e o header X-Instance-Token vira InstanceToken.
var instanceId = "VZ...";
var instanceToken = "instance-token";
var phone = "5511999999999";
Campos comuns
Quase todos os envios aceitam os campos abaixo:
| Campo | Tipo | Obrigatório | Descrição |
|---|
InstanceId | string | Sim | ID da instância VZaps. |
InstanceToken | string | Sim | Token da instância. |
Phone | string | Sim | Telefone destino em formato internacional, somente dígitos. |
id | string | Não | Identificador opcional da mensagem no pedido. |
delay | number | Não | Atraso de envio, quando suportado pela API. |
mentionedIds | string[] | Não | IDs citados no WhatsApp. |
replyToMessageId | string | Não | ID da mensagem do WhatsApp a ser respondida/citada. |
O SDK é tipado, mas os models herdam de VZapsModel e aceitam AdditionalData para campos públicos adicionais. Para payloads totalmente dinâmicos, use client.RequestAsync<TResponse>().
Texto
Função: client.Messages.SendTextAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Message | string | Sim |
await client.Messages.SendTextAsync<object>(new SendTextMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Message = "Olá, sua instância está conectada.",
});
Retorno: envelope { Code, Success, Data.MessageId } — mensagem aceita/enfileirada.
Imagem
Função: client.Messages.SendImageAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Image | string | Sim |
Caption | string | Não |
Image aceita URL pública https://... ou data URL base64 (data:image/<mime>;base64,<dados>).
await client.Messages.SendImageAsync<object>(new SendImageMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Image = "https://cdn.example.com/photo.jpg",
Caption = "Legenda opcional",
});
Retorno: envelope { Code, Success, Data.MessageId } — mensagem aceita/enfileirada.
Áudio
Função: client.Messages.SendAudioAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Audio | string | Sim |
Ptt | bool | Não |
Audio aceita URL pública ou data URL base64 (data:audio/<mime>;base64,...). Use Ptt = true quando quiser enviar como áudio de voz, se suportado pelo fluxo da conta.
await client.Messages.SendAudioAsync<object>(new SendAudioMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Audio = "https://cdn.example.com/audio.mp3",
Ptt = false,
});
Documento
Função: client.Messages.SendDocumentAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Document | string | Sim |
FileName | string | Sim |
Caption | string | Não |
await client.Messages.SendDocumentAsync<object>(new SendDocumentMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Document = "https://cdn.example.com/contract.pdf",
FileName = "contract.pdf",
Caption = "Segue o contrato",
});
Retorno: envelope { Code, Success, Data.MessageId } — mensagem aceita/enfileirada.
Vídeo
Função: client.Messages.SendVideoAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Video | string | Sim |
Caption | string | Não |
jpegThumbnail | string | Não |
await client.Messages.SendVideoAsync<object>(new SendVideoMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Video = "https://cdn.example.com/video.mp4",
Caption = "Vídeo de demonstração",
});
Sticker
Função: client.Messages.SendStickerAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Sticker | string | Sim |
pngThumbnail | string | Não |
await client.Messages.SendStickerAsync<object>(new SendStickerMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Sticker = "https://cdn.example.com/sticker.webp",
});
Retorno: envelope { Code, Success, Data.MessageId } — mensagem aceita/enfileirada.
GIF
Função: client.Messages.SendGifAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Gif | string | Sim |
Caption | string | Não |
await client.Messages.SendGifAsync<object>(new SendGifMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Gif = "https://media.giphy.com/media/example/giphy.gif",
Caption = "GIF animado",
});
Retorno: envelope { Code, Success, Data.MessageId } — mensagem aceita/enfileirada.
Localização
Função: client.Messages.SendLocationAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Latitude | double | Sim |
Longitude | double | Sim |
Name | string | Não |
Address | string | Não |
await client.Messages.SendLocationAsync<object>(new SendLocationMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Latitude = -23.55052,
Longitude = -46.633308,
Name = "São Paulo",
Address = "São Paulo, SP",
});
Retorno: envelope { Code, Success, Data.MessageId } — mensagem aceita/enfileirada.
Contato
Função: client.Messages.SendContactAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
ContactName | string | Sim |
ContactPhone | string | Sim |
await client.Messages.SendContactAsync<object>(new SendContactMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
ContactName = "Maria Silva",
ContactPhone = "5511888888888",
});
Retorno: envelope { Code, Success, Data.MessageId } — mensagem aceita/enfileirada.
Botões
Função: client.Messages.SendButtonsAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Message | string | Sim |
Buttons | IReadOnlyList<MessageButton> | Sim |
Footer | string | Não |
await client.Messages.SendButtonsAsync<object>(new SendButtonsMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Message = "Escolha uma opção",
Footer = "VZaps",
Buttons = new[]
{
new MessageButton { Id = "sales", Text = "Comercial" },
new MessageButton { Id = "support", Text = "Suporte" },
},
});
Retorno: envelope { Code, Success, Data.MessageId } — mensagem aceita/enfileirada.
Lista
Função: client.Messages.SendListAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Title | string | Sim |
Description | string | Sim |
ButtonText | string | Sim |
Sections | IReadOnlyList<MessageListSection> | Sim |
Footer | string | Não |
await client.Messages.SendListAsync<object>(new SendListMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Title = "Menu principal",
Description = "Escolha uma opção",
ButtonText = "Abrir menu",
Sections = new[]
{
new MessageListSection
{
Title = "Departamentos",
Rows = new[]
{
new MessageListRow { Id = "sales", Title = "Comercial", Description = "Falar com vendas" },
new MessageListRow { Id = "support", Title = "Suporte", Description = "Falar com suporte" },
},
},
},
});
Retorno: envelope { Code, Success, Data.MessageId } — mensagem aceita/enfileirada.
Função: client.Messages.SendLinkAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Message | string | Sim |
LinkUrl | string | Sim |
Title | string | Sim |
LinkDescription | string | Sim |
JpegThumbnail | string | Não |
await client.Messages.SendLinkAsync<object>(new SendLinkMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Message = "Confira este link",
LinkUrl = "https://vzaps.com",
Title = "VZaps",
LinkDescription = "API de WhatsApp para integrações",
});
Enquete
Função: client.Messages.SendPollAsync<TResponse>()
Payload:
| Campo | Tipo | Obrigatório |
|---|
Phone | string | Sim |
Name | string | Sim |
Options | IReadOnlyList<string> | Sim |
SelectableOptionsCount | int | Não |
HideParticipantNames | bool | Não |
EndTime | string | Não |
AllowAddOption | bool | Não |
await client.Messages.SendPollAsync<object>(new SendPollMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Name = "Qual canal você prefere?",
Options = new[] { "WhatsApp", "Email", "Telefone" },
SelectableOptionsCount = 1,
});
Retorno: envelope { Code, Success, Data.MessageId } — mensagem aceita/enfileirada.
Votar em enquete
Função: client.Messages.PollVoteAsync<TResponse>()
await client.Messages.PollVoteAsync<object>(new MessagePollVoteRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
MessageId = "3EB020510113BAA6561C",
SelectedOptions = new[] { "WhatsApp" },
});
Reagir e remover reação
Funções:
client.Messages.ReactAsync<TResponse>()
client.Messages.RemoveReactionAsync<TResponse>()
await client.Messages.ReactAsync<object>(new MessageReactRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
MessageId = "3EB020510113BAA6561C",
Reaction = "ok",
});
await client.Messages.RemoveReactionAsync<object>(new MessageReactRemoveRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
MessageId = "3EB020510113BAA6561C",
});
Presença e leitura
Funções:
client.Messages.PresenceAsync<TResponse>()
client.Messages.MarkReadAsync<TResponse>()
await client.Messages.PresenceAsync<object>(new MessagePresenceRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
State = "composing",
});
await client.Messages.MarkReadAsync<object>(new MessageMarkReadRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Id = new[] { "3EB020510113BAA6561C" },
Chat = "5511999999999@s.whatsapp.net",
});
Retorno: envelope { Code, Success, Data.Details }.
Editar e deletar mensagem
Funções:
client.Messages.EditAsync<TResponse>()
client.Messages.DeleteAsync<TResponse>()
await client.Messages.EditAsync<object>(new MessageEditRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
MessageId = "3EB020510113BAA6561C",
Message = "Texto editado",
});
await client.Messages.DeleteAsync<object>(new MessageDeleteRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
MessageId = "3EB020510113BAA6561C",
});
Retorno: envelope { Code, Success, Data.Details }.
Download de mídia
Funções:
DownloadImageAsync<TResponse>()
DownloadVideoAsync<TResponse>()
DownloadAudioAsync<TResponse>()
DownloadDocumentAsync<TResponse>()
var media = await client.Messages.DownloadImageAsync<object>(new MessageDownloadRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
});
Console.WriteLine(media);
Retorno: envelope { Code, Success, Data } com Data.Mimetype e Data.Data (base64 ou data URL).
Resposta padrão
Os métodos de envio retornam um envelope da API indicando que a mensagem foi aceita/enfileirada.
var result = await client.Messages.SendTextAsync<object>(new SendTextMessageRequest
{
InstanceId = "VZ...",
InstanceToken = "instance-token",
Phone = "5511999999999",
Message = "Olá",
});
Console.WriteLine(result);
Consulte a Referência da API para os schemas de resposta mais recentes.