Todas as funções de envio ficam em client.Messages.
Defina InstanceID e InstanceToken em cada struct de request. Eles vão nos headers, não no corpo JSON.
base := vzaps.MessageSendBaseRequest{
InstanceScopedRequest: vzaps.InstanceScopedRequest{
InstanceID: "VZ...",
InstanceToken: "instance-token",
},
Phone: "5511999999999",
}
Campos comuns
Quase todos os envios aceitam os campos abaixo:
| Campo (JSON wire) | Campo Go | Obrigatório | Descrição |
|---|
| — | InstanceID | Sim | ID da instância VZaps (header). |
| — | InstanceToken | Sim | Token da instância (header). |
phone | Phone | Sim | Telefone destino em formato internacional, somente dígitos. |
id | — | Não | Identificador opcional da mensagem no pedido. |
delay | — | Não | Atraso de envio, quando suportado pela API. |
mentioned_ids | — | Não | IDs citados no WhatsApp. |
reply_to_message_id | — | Não | ID da mensagem do WhatsApp a ser respondida/citada. |
Structs exportadas cobrem os campos principais do contrato público. Para opções avançadas como id, delay ou reply_to_message_id, use client.Messages.Send() ou client.Request() com um map no body.
Texto
Função: client.Messages.SendText()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
message | Message | Sim |
_, err := client.Messages.SendText(ctx, vzaps.MessageSendTextRequest{
MessageSendBaseRequest: vzaps.MessageSendBaseRequest{
InstanceScopedRequest: vzaps.InstanceScopedRequest{
InstanceID: "VZ...",
InstanceToken: "instance-token",
},
Phone: "5511999999999",
},
Message: "Olá, sua instância está conectada.",
})
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.
Imagem
Função: client.Messages.SendImage()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
image | Image | Sim |
caption | Caption | Não |
image aceita URL pública https://... ou data URL base64 (data:image/<mime>;base64,<data>).
_, err := client.Messages.SendImage(ctx, vzaps.MessageSendImageRequest{
MessageSendBaseRequest: base,
Image: "https://cdn.example.com/photo.jpg",
Caption: "Legenda opcional",
})
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.
Áudio
Função: client.Messages.SendAudio()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
audio | Audio | Sim |
ptt | PTT | Não |
audio aceita URL pública ou data URL base64 (data:audio/<mime>;base64,...). Use PTT: true para enviar nota de voz, se suportado pelo fluxo da conta.
_, err := client.Messages.SendAudio(ctx, vzaps.MessageSendAudioRequest{
MessageSendBaseRequest: base,
Audio: "https://cdn.example.com/audio.mp3",
PTT: false,
})
Documento
Função: client.Messages.SendDocument()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
document | Document | Sim |
file_name | FileName | Sim |
caption | Caption | Não |
_, err := client.Messages.SendDocument(ctx, vzaps.MessageSendDocumentRequest{
MessageSendBaseRequest: base,
Document: "https://cdn.example.com/contract.pdf",
FileName: "contract.pdf",
Caption: "Aqui está o contrato",
})
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.
Vídeo
Função: client.Messages.SendVideo()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
video | Video | Sim |
caption | Caption | Não |
jpeg_thumbnail | — | Não |
_, err := client.Messages.SendVideo(ctx, vzaps.MessageSendVideoRequest{
MessageSendBaseRequest: base,
Video: "https://cdn.example.com/video.mp4",
Caption: "Vídeo demo",
})
Sticker
Função: client.Messages.SendSticker()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
sticker | Sticker | Sim |
png_thumbnail | — | Não |
_, err := client.Messages.SendSticker(ctx, vzaps.MessageSendStickerRequest{
MessageSendBaseRequest: base,
Sticker: "https://cdn.example.com/sticker.webp",
})
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.
GIF
Função: client.Messages.SendGif()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
gif | GIF | Sim |
caption | Caption | Não |
_, err := client.Messages.SendGif(ctx, vzaps.MessageSendGifRequest{
MessageSendBaseRequest: base,
GIF: "https://media.giphy.com/media/example/giphy.gif",
Caption: "GIF animado",
})
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.
Localização
Função: client.Messages.SendLocation()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
latitude | Latitude | Sim |
longitude | Longitude | Sim |
name | Name | Não |
address | Address | Não |
_, err := client.Messages.SendLocation(ctx, vzaps.MessageSendLocationRequest{
MessageSendBaseRequest: base,
Latitude: -23.55052,
Longitude: -46.633308,
Name: "São Paulo",
Address: "São Paulo, SP",
})
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.
Contato
Função: client.Messages.SendContact()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
contact_name | ContactName | Sim |
contact_phone | ContactPhone | Sim |
_, err := client.Messages.SendContact(ctx, vzaps.MessageSendContactRequest{
MessageSendBaseRequest: base,
ContactName: "Maria Silva",
ContactPhone: "5511888888888",
})
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.
Botões
Função: client.Messages.SendButtons()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
message | Message | Sim |
buttons | Buttons | Sim |
footer | Footer | Não |
_, err := client.Messages.SendButtons(ctx, vzaps.MessageSendButtonsRequest{
MessageSendBaseRequest: base,
Message: "Escolha uma opção",
Footer: "VZaps",
Buttons: []vzaps.MessageButton{
{ID: "sales", Text: "Vendas"},
{ID: "support", Text: "Suporte"},
},
})
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.
Lista
Função: client.Messages.SendList()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
title | Title | Sim |
description | Description | Sim |
button_text | ButtonText | Sim |
sections | Sections | Sim |
footer | Footer | Não |
_, err := client.Messages.SendList(ctx, vzaps.MessageSendListRequest{
MessageSendBaseRequest: base,
Title: "Menu principal",
Description: "Escolha uma opção",
ButtonText: "Abrir menu",
Sections: []vzaps.MessageListSection{
{
Title: "Departamentos",
Rows: []vzaps.MessageListRow{
{ID: "sales", Title: "Vendas", Description: "Falar com vendas"},
{ID: "support", Title: "Suporte", Description: "Falar com suporte"},
},
},
},
})
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.
Link preview
Função: client.Messages.SendLink()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
message | Message | Sim |
link_url | LinkURL | Sim |
title | Title | Sim |
link_description | LinkDescription | Sim |
jpeg_thumbnail | JPEGThumbnail | Não |
_, err := client.Messages.SendLink(ctx, vzaps.MessageSendLinkRequest{
MessageSendBaseRequest: base,
Message: "Confira este link",
LinkURL: "https://vzaps.com",
Title: "VZaps",
LinkDescription: "API WhatsApp para integrações",
})
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.
Enquete
Função: client.Messages.SendPoll()
Payload:
| Campo (JSON) | Campo Go | Obrigatório |
|---|
phone | Phone | Sim |
name | Name | Sim |
options | Options | Sim |
selectable_options_count | SelectableOptionsCount | Não |
hide_participant_names | HideParticipantNames | Não |
end_time | EndTime | Não |
allow_add_option | AllowAddOption | Não |
_, err := client.Messages.SendPoll(ctx, vzaps.MessageSendPollRequest{
MessageSendBaseRequest: base,
Name: "Qual canal você prefere?",
Options: []string{"WhatsApp", "Email", "Telefone"},
SelectableOptionsCount: 1,
})
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.
Votar em enquete
Função: client.Messages.PollVote()
_, err := client.Messages.PollVote(ctx, vzaps.MessagePollVoteRequest{
MessageSendBaseRequest: base,
MessageID: "3EB020510113BAA6561C",
SelectedOptions: []string{"WhatsApp"},
})
Reagir e remover reação
Funções:
client.Messages.React()
client.Messages.RemoveReaction()
_, err = client.Messages.React(ctx, vzaps.MessageReactRequest{
MessageSendBaseRequest: base,
MessageID: "3EB020510113BAA6561C",
Reaction: "👍",
})
_, err = client.Messages.RemoveReaction(ctx, vzaps.MessageReactRemoveRequest{
MessageSendBaseRequest: base,
MessageID: "3EB020510113BAA6561C",
})
Presença e confirmação de leitura
Funções:
client.Messages.Presence()
client.Messages.MarkRead()
_, err = client.Messages.Presence(ctx, vzaps.MessagePresenceRequest{
MessageSendBaseRequest: base,
State: "composing",
})
_, err = client.Messages.MarkRead(ctx, vzaps.MessageMarkReadRequest{
InstanceScopedRequest: vzaps.InstanceScopedRequest{
InstanceID: "VZ...",
InstanceToken: "instance-token",
},
ID: []string{"3EB020510113BAA6561C"},
Chat: "5511999999999@s.whatsapp.net",
})
Editar e excluir mensagem
Funções:
client.Messages.Edit()
client.Messages.Delete()
_, err = client.Messages.Edit(ctx, vzaps.MessageEditRequest{
InstanceScopedRequest: vzaps.InstanceScopedRequest{
InstanceID: "VZ...",
InstanceToken: "instance-token",
},
MessageID: "3EB020510113BAA6561C",
Message: "Texto editado",
})
_, err = client.Messages.Delete(ctx, vzaps.MessageDeleteRequest{
InstanceScopedRequest: vzaps.InstanceScopedRequest{
InstanceID: "VZ...",
InstanceToken: "instance-token",
},
MessageID: "3EB020510113BAA6561C",
})
Baixar mídia
Funções:
DownloadImage()
DownloadVideo()
DownloadAudio()
DownloadDocument()
media, err := client.Messages.DownloadImage(ctx, vzaps.MessageDownloadRequest{
InstanceScopedRequest: vzaps.InstanceScopedRequest{
InstanceID: "VZ...",
InstanceToken: "instance-token",
},
})
fmt.Printf("%#v\n", media)
Retorno: envelope { code, success, data } com data.mimetype e data.data (base64 ou data URL).
Resposta padrão
Métodos de envio retornam um envelope da API indicando que a mensagem foi aceita/enfileirada.
result, err := client.Messages.SendText(ctx, vzaps.MessageSendTextRequest{
MessageSendBaseRequest: base,
Message: "Olá",
})
fmt.Printf("%#v\n", result)
Veja a referência da API para os schemas de resposta mais recentes.