> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vzaps.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Mensagens

> Todas as funções de envio do SDK .NET, payloads aceitos e exemplos completos

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`.

```csharp theme={null}
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.         |

<Note>
  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>()`.
</Note>

## Texto

Função: `client.Messages.SendTextAsync<TResponse>()`

Payload:

| Campo     | Tipo     | Obrigatório |
| --------- | -------- | ----------- |
| `Phone`   | `string` | Sim         |
| `Message` | `string` | Sim         |

```csharp theme={null}
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>`).

```csharp theme={null}
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.

```csharp theme={null}
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         |

```csharp theme={null}
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         |

```csharp theme={null}
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         |

```csharp theme={null}
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         |

```csharp theme={null}
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         |

```csharp theme={null}
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         |

```csharp theme={null}
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         |

```csharp theme={null}
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         |

```csharp theme={null}
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.

## Link com preview

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         |

```csharp theme={null}
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         |

```csharp theme={null}
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>()`

```csharp theme={null}
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>()`

```csharp theme={null}
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>()`

```csharp theme={null}
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>()`

```csharp theme={null}
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>()`

```csharp theme={null}
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.

```csharp theme={null}
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](/pt-BR/api-reference/introduction) para os schemas de resposta mais recentes.
