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

# Enviar mensagem de texto

> Envia uma mensagem de texto para um contato, grupo ou canal/newsletter.

## Recursos Específicos

- **Preview de links** com suporte a personalização automática ou customizada
- **Formatação básica** do texto
- **Substituição automática de placeholders** dinâmicos

## Envio para Newsletter

Para enviar texto para um canal, use o mesmo campo `number`, mas informe o JID completo do canal:
- Exemplo: `120363123456789012@newsletter`

```json
{
  "number": "120363123456789012@newsletter",
  "text": "Post publicado no canal"
}
```

## Responder enquete, lista ou botão

Use este mesmo endpoint para responder uma mensagem interativa que esteja
salva no histórico local da instância. Envie:

- `number`: chat onde a mensagem original foi recebida ou enviada;
- `replyid`: ID da mensagem interativa original;
- `text`: seleção iniciada por `>`.

O marcador `>` é obrigatório para gerar uma resposta interativa. Sem ele,
a API envia apenas uma mensagem de texto citando a original.

### Responder uma enquete

Use a posição da opção, começando em 1. Nesta documentação pública,
responda somente uma opção por requisição.

```json
{
  "number": "5511999999999",
  "replyid": "3EB0ID_DA_ENQUETE",
  "text": ">1"
}
```

### Responder uma lista

Prefira o `rowId` configurado ao criar a lista. Também são aceitos o texto
exato do item ou sua posição (`>1`).

```json
{
  "number": "5511999999999",
  "replyid": "3EB0ID_DA_LISTA",
  "text": ">plano_pro"
}
```

### Responder um botão

Prefira o ID do botão de resposta rápida. Também são aceitos o texto exato
exibido ou sua posição (`>1`). Isso vale para botões rápidos legados,
templates, native flow e carrossel. Botões de URL, ligação ou cópia executam
a própria ação e não são respondidos por este fluxo.

```json
{
  "number": "5511999999999",
  "replyid": "3EB0ID_DOS_BOTOES",
  "text": ">confirmar"
}
```

A API devolve erro quando a mensagem original não está disponível ou a
opção informada não existe.

## Campos Comuns

Este endpoint suporta todos os **campos opcionais comuns** documentados na tag **"Enviar Mensagem"**, incluindo:
`delay`, `readchat`, `readmessages`, `replyid`, `mentions`, `forward`, `track_source`, `track_id`, placeholders e envio para grupos.

## Preview de Links

### Preview Automático
```json
{
  "number": "5511999999999",
  "text": "Confira: https://exemplo.com",
  "linkPreview": true
}
```

### Preview Personalizado
```json
{
  "number": "5511999999999",
  "text": "Confira nosso site! https://exemplo.com",
  "linkPreview": true,
  "linkPreviewTitle": "Título Personalizado",
  "linkPreviewDescription": "Uma descrição personalizada do link",
  "linkPreviewImage": "https://exemplo.com/imagem.jpg",
  "linkPreviewLarge": true
}
```




## OpenAPI

````yaml /openapi-pt-BR.json post /send/text
openapi: 3.1.0
info:
  title: WppFy -  WhatsApp API
  version: 1.0.0
  description: >
    API para gerenciamento de instâncias do WhatsApp e comunicações.


    ## Recomendação Importante: WhatsApp Business

    **É ALTAMENTE RECOMENDADO usar contas do WhatsApp Business** em vez do
    WhatsApp normal para integração, o WhatsApp normal pode apresentar
    inconsistências, desconexões, limitações e instabilidades durante o uso com
    a nossa API.


    ## Autenticação

    - Endpoints regulares requerem um header 'token' com o token da instância


    ## Estados da Instância

    As instâncias podem estar nos seguintes estados:

    - `disconnected`: Desconectado do WhatsApp

    - `connecting`: Em processo de conexão

    - `connected`: Conectado e autenticado com sucesso
servers:
  - url: https://api.wppfy.com
security:
  - token: []
tags:
  - name: Instancia
    description: |
      Operações relacionadas ao ciclo de vida de uma instância, como conectar,
      desconectar e verificar o status.
  - name: Proxy
    description: >
      A WppFy opera com um proxy interno como padrão.

      Você pode manter esse padrão, configurar um proxy próprio via `proxy_url`
      ou usar seu celular android como proxy instalando o app em
      https://github.com/WppFy/silver_proxy_apk (APK direto:
      https://github.com/WppFy/silver_proxy_apk/raw/refs/heads/main/silver_proxy.apk).

      Se nada for enviado, seguimos no proxy interno. IPs são brasileiros; para
      clientes internacionais, considere um proxy da região do cliente.
  - name: Perfil
    description: |
      Operações relacionadas ao perfil da instância do WhatsApp, como alterar
      nome e imagem de perfil.
  - name: Business
    description: |
      ⚠️ **EXPERIMENTAL** - Endpoints ainda não testados completamente.

      Operações relacionadas ao perfil comercial do WhatsApp Business.
      Permite consultar e atualizar dados do perfil comercial como descrição,
      endereço, email, categorias e gerenciar o catálogo de produtos.

      **Requisitos:**
      - A conta atualmente conectada deve ser uma conta **WhatsApp Business**
      - Contas pessoais do WhatsApp não possuem perfil comercial

      **Nota:** Estes endpoints podem não funcionar como esperado.
      Reporte problemas encontrados.
  - name: Chamadas
    description: |
      Operações relacionadas a chamadas peloWhatsApp.
      Permite realizar e rejeitar chamadas programaticamente.
  - name: Enviar Mensagem
    description: >
      Endpoints para envio de mensagens do WhatsApp com diferentes tipos de
      conteúdo.


      ## Campos Opcionais Comuns


      Todos os endpoints de envio de mensagem suportam os seguintes campos
      opcionais:


      - **`delay`** *(integer)*: Atraso em milissegundos antes do envio
        - Durante o atraso aparecerá "Digitando..." ou "Gravando áudio..." dependendo do tipo
        - Exemplo: `5000` (5 segundos)

      - **`readchat`** *(boolean)*: Marcar chat como lido após envio
        - Remove o contador de mensagens não lidas do chat
        - Exemplo: `true`

      - **`readmessages`** *(boolean)*: Marcar últimas mensagens recebidas como
      lidas
        - Marca as últimas 10 mensagens **recebidas** (não enviadas por você) como lidas
        - Útil para confirmar leitura de mensagens pendentes antes de responder
        - Diferente do `readchat` que apenas remove contador de não lidas
        - Exemplo: `true`

      - **`replyid`** *(string)*: ID da mensagem para responder
        - Cria uma resposta vinculada à mensagem original
        - Suporte varia por tipo de mensagem
        - Exemplo: `"3A12345678901234567890123456789012"`

      - **`mentions`** *(string)*: Números para mencionar (apenas para envio em
      grupos)
        - Números específicos: `"5511999999999,5511888888888"`
        - Mencionar todos: `"all"`

      - **`forward`** *(boolean)*: Marca a mensagem como encaminhada no WhatsApp
        - Adiciona o indicador "Encaminhada" na mensagem
        - Exemplo: `true`

      - **`track_source`** *(string)*: Origem do rastreamento da mensagem
        - Identifica o sistema ou fonte que está enviando a mensagem
        - Útil para integrações (ex: "chatwoot", "crm", "chatbot")
        - Exemplo: `"chatwoot"`

      - **`track_id`** *(string)*: ID para rastreamento da mensagem
        - Identificador livre para acompanhar a mensagem em sistemas externos
        - Permite correlacionar mensagens entre diferentes plataformas
        - **Nota**: O sistema aceita valores duplicados - não há validação de unicidade
        - Use o mesmo ID em várias mensagens se fizer sentido para sua integração
        - Exemplo: `"msg_123456789"`

      ### Envio para Grupos

      - **`number`** *(string)*: Para enviar mensagem para grupo, use o ID do
      grupo que termina com `@g.us`
        - Exemplo: `"120363012345678901@g.us"`
        - **Como obter o ID do grupo:**
          - Use o `chatid` do webhook recebido quando alguém envia mensagem no grupo
          - Use o endpoint `GET /group/list` para listar todos os grupos e seus IDs

      ## Placeholders Disponíveis


      Todos os endpoints de envio de mensagem suportam placeholders dinâmicos
      para personalização automática:


      ### Campos de Nome

      - **`{{name}}`**: Nome consolidado do chat, usando a primeira opção
      disponível:
        1. Nome do lead (`lead_name`)
        2. Nome completo do lead (`lead_fullName`)
        3. Nome do contato no WhatsApp (`wa_contactName`)
        4. Nome do perfil do WhatsApp (`wa_name`)

      - **`{{first_name}}`**: Primeira palavra válida do nome consolidado
      (mínimo 2 caracteres)


      ### Campos do WhatsApp

      - **`{{wa_name}}`**: Nome do perfil do WhatsApp

      - **`{{wa_contactName}}`**: Nome do contato como salvo no WhatsApp


      ### Campos do Lead

      - **`{{lead_name}}`**: Nome do lead

      - **`{{lead_fullName}}`**: Nome completo do lead

      - **`{{lead_personalid}}`**: ID pessoal (CPF, CNPJ, etc)

      - **`{{lead_email}}`**: Email do lead

      - **`{{lead_status}}`**: Status atual do lead

      - **`{{lead_notes}}`**: Anotações do lead

      - **`{{lead_assignedAttendant_id}}`**: ID do atendente designado


      ### Campos Personalizados

      Campos adicionados via custom fields são acessíveis usando
      `{{lead_field01}}` à `{{lead_field20}}` ou usar `{{nomedocampo}}` definido
      em `/instance/updateFieldsMap`.


      ### Exemplo de Uso

      ```

      Olá {{name}}! Vi que você trabalha na {{company}}.

      Seu email {{lead_email}} está correto?

      ```


      **💡 Dica**: Use `/chat/find` para buscar dados do chat e ver os campos
      disponíveis antes de enviar mensagens com placeholders.
  - name: Mensagem Async
    description: >
      Controles operacionais da fila interna de envio assíncrono usada quando um
      endpoint de envio recebe `async=true`.


      Esta seção serve para:

      - consultar o estado atual da fila async

      - configurar o delay entre mensagens enviadas com `async=true`

      - limpar backlog pendente e cancelar mensagens ainda não concluídas


      Escopo:

      - cobre apenas a fila interna de mensagens diretas async

      - não altera mensagens já enviadas com sucesso
  - name: Ações na mensagem e Buscar
  - name: Chats
  - name: Contatos
  - name: Bloqueios
  - name: Etiquetas
  - name: Grupos e Comunidades
  - name: Newsletters e Canais
    description: >
      Operações para leitura e acompanhamento de canais do WhatsApp
      (newsletters).


      Casos de uso principais:

      - listar posts já publicados em um canal

      - editar posts recentes de um canal

      - deletar posts recentes de um canal

      - consultar views e reações dos posts

      - integrar canais sem necessidade de persistir as mensagens localmente


      Observações:

      - `/newsletter/messages` retorna o conteúdo dos posts

      - `/newsletter/messages/edit` edita o conteúdo de posts recentes

      - `/newsletter/messages/delete` apaga posts recentes

      - views (`viewsCount`) e reactions (`reactionCounts`) vêm em cada post de
      `/newsletter/messages`, não por evento de webhook

      - `/newsletter/updates` está obsoleta: o WhatsApp não responde e a API
      devolve 504

      - newsletters usam rotas próprias e não devem usar `/message/edit` ou
      `/message/delete`
  - name: Respostas Rápidas
    description: >
      Gerenciamento de respostas rápidas para agilizar o atendimento.


      **⚠️ Importante**: Este recurso tem serventia apenas se você utilizar um
      sistema frontend/interface

      personalizada para registrar e utilizar as respostas. A API apenas
      armazena as respostas, 

      mas não as aplica automaticamente.


      ### Como funciona:

      - **Criar**: Cadastre respostas pré-definidas com títulos e conteúdo

      - **Listar**: Recupere todas as respostas cadastradas para exibir na sua
      interface

      - **Usar**: Seu sistema frontend pode usar essas respostas para agilizar
      digitação


      ### Casos de uso:

      - Interfaces web personalizadas de atendimento

      - Apps mobile com sugestões de resposta

      - Sistemas CRM com templates de mensagem

      - Ferramentas de produtividade para atendentes


      **Não é um chatbot**: Para respostas automáticas, use os recursos de
      Chatbot.
  - name: CRM
    description: >
      Sistema completo de gestão de relacionamento com clientes integrado à API.


      **💾 Armazenamento interno**: Todos os dados dos leads ficam salvos
      diretamente na API,

      eliminando a necessidade de bancos de dados externos. Sua aplicação pode
      focar apenas

      na interface e lógica de negócio.


      ### Recursos disponíveis:

      - **📋 20+ campos personalizáveis**: Nome, telefone, email, empresa,
      observações, etc.

      - **🏷️ Sistema de etiquetas**: Organize e categorize seus contatos

      - **🔍 Busca avançada**: Filtre por qualquer campo ou etiqueta

      - **📊 Histórico completo**: Todas as interações ficam registradas
      automaticamente


      ### 🎯 Placeholders em mensagens:

      Use variáveis dinâmicas nas mensagens para personalização automática:


      ```

      Olá {{nome}}! Vi que você trabalha na {{empresa}}.

      Seu email {{email}} está correto?

      Observações: {{observacoes}}

      ```


      ### Fluxo típico:

      1. **Captura**: Leads chegam via WhatsApp ou formulários

      2. **Enriquecimento**: Adicione dados usando `/chat/editLead`

      3. **Segmentação**: Organize com etiquetas

      4. **Comunicação**: Envie mensagens personalizadas com placeholders

      5. **Acompanhamento**: Histórico fica salvo automaticamente


      **Ideal para**: Vendas, marketing, atendimento, qualificação de leads
  - name: Integração Chatwoot
    description: >
      **🚧 INTEGRAÇÃO BETA - Sistema de integração com Chatwoot para atendimento
      unificado**


      **⚠️ AVISO**: Esta integração está em fase BETA. Use por sua conta e
      risco. Recomendamos testes em ambiente não-produtivo antes do uso em
      produção.


      Esta categoria contém recursos para configurar e gerenciar a integração
      com o Chatwoot, uma plataforma de atendimento ao cliente open-source. A
      integração permite centralizar conversas do WhatsApp no Chatwoot.


      ### Recursos disponíveis:

      - 🔧 **Configuração Completa**: Configure URL, tokens e credenciais do
      Chatwoot

      - 📬 **Sincronização Bidirecional**: Mensagens novas entre WhatsApp e
      Chatwoot são sincronizadas automaticamente

      - 📱 **Gerenciamento de Contatos**: Sincronização automática de nomes e
      telefones

      - 🔄 **Atualização LID→PN**: Migração automática de Local ID para Phone
      Number

      - 🏷️ **Nomes Inteligentes**: Sistema de nomes com til (~) para
      atualização automática

      - 🚫 **Separação de Grupos**: Opção para ignorar grupos na sincronização

      - 👤 **Assinatura de Mensagens**: Identificação do agente nas mensagens
      enviadas

      - 🔗 **Webhook Automático**: URL gerada automaticamente para configurar no
      Chatwoot


      ### 🏷️ Sistema de Nomes Inteligentes:

      - **Nomes com til (~)**: Atualizados automaticamente quando contato
      modifica nome no WhatsApp

      - **Nomes específicos**: Para nome fixo, remover til (~) do nome no
      Chatwoot

      - **Exemplo**: "~João Silva" = automático, "João Silva" = fixo

      - **Migração LID→PN**: Sem duplicação de conversas durante a transição

      - **Respostas nativas**: Aparecem diretamente no Chatwoot sem marcações
      externas


      ### ⚠️ Limitações conhecidas:

      - **Sincronização de histórico**: Não implementada - apenas mensagens
      novas são sincronizadas


      ### Casos de uso:

      - Atendimento centralizado no Chatwoot

      - Equipes de suporte com múltiplos agentes

      - Integração com CRM via Chatwoot

      - Centralização de canais de comunicação

      - Gestão automática de contatos e nomes


      **Ideal para**: Empresas com equipes de atendimento, call centers, suporte
      técnico (em ambiente de testes)


      **Requer**: Instância do Chatwoot configurada, tokens de API e ambiente de
      testes


      **🚧 Lembre-se**: Integração em BETA - funcionalidades podem mudar sem
      aviso prévio
  - name: Server-Sent Events (SSE)
paths:
  /send/text:
    post:
      tags:
        - Enviar Mensagem
      summary: Enviar mensagem de texto
      description: >
        Envia uma mensagem de texto para um contato, grupo ou canal/newsletter.


        ## Recursos Específicos


        - **Preview de links** com suporte a personalização automática ou
        customizada

        - **Formatação básica** do texto

        - **Substituição automática de placeholders** dinâmicos


        ## Envio para Newsletter


        Para enviar texto para um canal, use o mesmo campo `number`, mas informe
        o JID completo do canal:

        - Exemplo: `120363123456789012@newsletter`


        ```json

        {
          "number": "120363123456789012@newsletter",
          "text": "Post publicado no canal"
        }

        ```


        ## Responder enquete, lista ou botão


        Use este mesmo endpoint para responder uma mensagem interativa que
        esteja

        salva no histórico local da instância. Envie:


        - `number`: chat onde a mensagem original foi recebida ou enviada;

        - `replyid`: ID da mensagem interativa original;

        - `text`: seleção iniciada por `>`.


        O marcador `>` é obrigatório para gerar uma resposta interativa. Sem
        ele,

        a API envia apenas uma mensagem de texto citando a original.


        ### Responder uma enquete


        Use a posição da opção, começando em 1. Nesta documentação pública,

        responda somente uma opção por requisição.


        ```json

        {
          "number": "5511999999999",
          "replyid": "3EB0ID_DA_ENQUETE",
          "text": ">1"
        }

        ```


        ### Responder uma lista


        Prefira o `rowId` configurado ao criar a lista. Também são aceitos o
        texto

        exato do item ou sua posição (`>1`).


        ```json

        {
          "number": "5511999999999",
          "replyid": "3EB0ID_DA_LISTA",
          "text": ">plano_pro"
        }

        ```


        ### Responder um botão


        Prefira o ID do botão de resposta rápida. Também são aceitos o texto
        exato

        exibido ou sua posição (`>1`). Isso vale para botões rápidos legados,

        templates, native flow e carrossel. Botões de URL, ligação ou cópia
        executam

        a própria ação e não são respondidos por este fluxo.


        ```json

        {
          "number": "5511999999999",
          "replyid": "3EB0ID_DOS_BOTOES",
          "text": ">confirmar"
        }

        ```


        A API devolve erro quando a mensagem original não está disponível ou a

        opção informada não existe.


        ## Campos Comuns


        Este endpoint suporta todos os **campos opcionais comuns** documentados
        na tag **"Enviar Mensagem"**, incluindo:

        `delay`, `readchat`, `readmessages`, `replyid`, `mentions`, `forward`,
        `track_source`, `track_id`, placeholders e envio para grupos.


        ## Preview de Links


        ### Preview Automático

        ```json

        {
          "number": "5511999999999",
          "text": "Confira: https://exemplo.com",
          "linkPreview": true
        }

        ```


        ### Preview Personalizado

        ```json

        {
          "number": "5511999999999",
          "text": "Confira nosso site! https://exemplo.com",
          "linkPreview": true,
          "linkPreviewTitle": "Título Personalizado",
          "linkPreviewDescription": "Uma descrição personalizada do link",
          "linkPreviewImage": "https://exemplo.com/imagem.jpg",
          "linkPreviewLarge": true
        }

        ```
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                number:
                  type: string
                  description: >-
                    ID do chat para o qual a mensagem será enviada. Pode ser um
                    número de telefone em formato internacional, um ID de grupo
                    (`@g.us`), um ID de usuário (com `@s.whatsapp.net` ou
                    `@lid`) ou um ID de canal/newsletter (`@newsletter`).
                  example: '5511999999999'
                text:
                  type: string
                  description: >-
                    Texto da mensagem. Para responder enquete, lista ou botão,
                    use uma seleção iniciada por `>` junto com `replyid`. Aceita
                    placeholders em mensagens de texto comuns.
                  example: Olá {{name}}! Como posso ajudar?
                linkPreview:
                  type: boolean
                  description: >
                    Ativa/desativa preview de links. Se true, procura
                    automaticamente um link no texto para gerar preview.


                    Comportamento:

                    - Se apenas linkPreview=true: gera preview automático do
                    primeiro link encontrado no texto

                    - Se fornecidos campos personalizados (title, description,
                    image): usa os valores fornecidos

                    - Se campos personalizados parciais: combina com dados
                    automáticos do link como fallback

                    - Título ou descrição só com espaço: o preview sai sem esse
                    campo, sem buscar no link
                  example: true
                linkPreviewTitle:
                  type: string
                  description: >-
                    Define um título personalizado para o preview do link. Vazio
                    usa o título do link; só com espaço (`" "`), o preview sai
                    sem título.
                  example: Título Personalizado
                linkPreviewDescription:
                  type: string
                  description: >-
                    Define uma descrição personalizada para o preview do link.
                    Vazia usa a descrição do link; só com espaço (`" "`), o
                    preview sai sem descrição.
                  example: Descrição personalizada do link
                linkPreviewImage:
                  type: string
                  description: URL ou Base64 da imagem para usar no preview do link
                  example: https://exemplo.com/imagem.jpg
                linkPreviewLarge:
                  type: boolean
                  description: >-
                    Se true, gera um preview grande com upload da imagem. Se
                    false, gera um preview pequeno sem upload
                  example: true
                replyid:
                  type: string
                  description: >-
                    ID da mensagem original. Com `text` iniciado por `>`, gera a
                    resposta nativa de enquete, lista ou botão quando o tipo
                    original for suportado.
                  example: 3EB0538DA65A59F6D8A251
                mentions:
                  type: string
                  description: Números para mencionar (separados por vírgula)
                  example: 5511999999999,5511888888888
                readchat:
                  type: boolean
                  description: Marca conversa como lida após envio
                  example: true
                readmessages:
                  type: boolean
                  description: Marca últimas mensagens recebidas como lidas
                  example: true
                delay:
                  type: integer
                  description: >-
                    Atraso em milissegundos antes do envio, durante o atraso
                    apacerá 'Digitando...'
                  example: 1000
                forward:
                  type: boolean
                  description: Marca a mensagem como encaminhada no WhatsApp
                  example: true
                track_source:
                  type: string
                  description: Origem do rastreamento da mensagem
                  example: chatwoot
                track_id:
                  type: string
                  description: ID para rastreamento da mensagem (aceita valores duplicados)
                  example: msg_123456789
                async:
                  type: boolean
                  description: >-
                    Se true, envia a mensagem de forma assíncrona via fila
                    interna. Útil para alto volume de mensagens.
                  example: false
              required:
                - number
                - text
            examples:
              basic:
                summary: Mensagem básica
                description: Exemplo mais simples possível
                value:
                  number: '5511999999999'
                  text: Olá! Como posso ajudar?
              withLinkPreview:
                summary: Com preview automático
                description: Preview automático de link no texto
                value:
                  number: '5511999999999'
                  text: 'Confira: https://exemplo.com'
                  linkPreview: true
              customLinkPreview:
                summary: Preview personalizado
                description: Preview com título, descrição e imagem customizados
                value:
                  number: '5511999999999'
                  text: Confira nosso site! https://exemplo.com
                  linkPreview: true
                  linkPreviewTitle: Título Personalizado
                  linkPreviewDescription: Uma descrição personalizada do link
                  linkPreviewImage: https://exemplo.com/imagem.jpg
                  linkPreviewLarge: true
              withPlaceholders:
                summary: Com placeholders
                description: Texto com placeholders nativos e um campo personalizado
                value:
                  number: '5511999999999'
                  text: >-
                    Olá {{first_name}}! Empresa: {{lead_field01}}. Seu email
                    {{lead_email}} está correto?
              newsletter:
                summary: Envio para newsletter
                description: >-
                  Publica uma mensagem de texto em um canal usando o JID
                  completo `@newsletter`.
                value:
                  number: 120363123456789012@newsletter
                  text: Post publicado no canal
              pollReply:
                summary: Responder enquete
                description: Seleciona a opção 1 da enquete identificada por replyid.
                value:
                  number: '5511999999999'
                  replyid: 3EB0ID_DA_ENQUETE
                  text: '>1'
              listReply:
                summary: Responder lista
                description: Seleciona pelo rowId configurado no item da lista.
                value:
                  number: '5511999999999'
                  replyid: 3EB0ID_DA_LISTA
                  text: '>plano_pro'
              buttonReply:
                summary: Responder botão
                description: Seleciona pelo ID configurado no botão de resposta rápida.
                value:
                  number: '5511999999999'
                  replyid: 3EB0ID_DOS_BOTOES
                  text: '>confirmar'
      responses:
        '200':
          description: Mensagem enviada com sucesso
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Message'
                  - type: object
                    properties:
                      response:
                        type: object
                        properties:
                          status:
                            type: string
                            example: success
                          message:
                            type: string
                            example: Message sent successfully
        '400':
          description: Requisição inválida
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Missing number or text
        '401':
          description: Não autorizado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Invalid token
        '429':
          description: Limite de requisições excedido
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Rate limit exceeded
        '500':
          description: Erro interno do servidor
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: >-
                      WhatsApp server error 463: WhatsApp reported that the
                      currently connected account is under a temporary
                      restriction for starting new conversations, usually
                      related to sending volume or quality.
                  error_source:
                    type: string
                    example: whatsapp_server
                  provider:
                    type: string
                    example: whatsapp
                  provider_code:
                    type: integer
                    example: 463
                  error_key:
                    type: string
                    example: WHATSAPP_REACHOUT_TIMELOCK
                  message:
                    type: string
                    example: >-
                      The WhatsApp server rejected this message. This was not an
                      internal API error.
                  message_ptbr:
                    type: string
                    example: >-
                      O servidor do WhatsApp recusou esta mensagem. Isso não foi
                      um erro interno da API.
                  provider_message:
                    type: string
                    example: >-
                      WhatsApp reported that the currently connected account is
                      under a temporary restriction for starting new
                      conversations, usually related to sending volume or
                      quality.
                  provider_message_ptbr:
                    type: string
                    example: >-
                      O WhatsApp informou que a conta atualmente conectada está
                      sob uma restrição temporária para iniciar novas conversas,
                      normalmente relacionada a volume ou qualidade de envios.
                  diagnostics_endpoint:
                    type: string
                    example: /instance/wa_messages_limits
                  details:
                    type: object
                    properties:
                      new_chat_message_capping:
                        type: object
                        additionalProperties: true
                      reachout_timelock:
                        type: object
                        additionalProperties: true
              examples:
                generic:
                  summary: Erro interno genérico
                  value:
                    error: Failed to send message
                whatsapp_463:
                  summary: Erro do WhatsApp ao iniciar novas conversas
                  value:
                    error: >-
                      WhatsApp server error 463: WhatsApp reported that the
                      currently connected account is under a temporary
                      restriction for starting new conversations, usually
                      related to sending volume or quality.
                    error_source: whatsapp_server
                    provider: whatsapp
                    provider_code: 463
                    error_key: WHATSAPP_REACHOUT_TIMELOCK
                    message: >-
                      The WhatsApp server rejected this message. This was not an
                      internal API error.
                    message_ptbr: >-
                      O servidor do WhatsApp recusou esta mensagem. Isso não foi
                      um erro interno da API.
                    provider_message: >-
                      WhatsApp reported that the currently connected account is
                      under a temporary restriction for starting new
                      conversations, usually related to sending volume or
                      quality.
                    provider_message_ptbr: >-
                      O WhatsApp informou que a conta atualmente conectada está
                      sob uma restrição temporária para iniciar novas conversas,
                      normalmente relacionada a volume ou qualidade de envios.
                    diagnostics_endpoint: /instance/wa_messages_limits
                    details:
                      new_chat_message_capping:
                        available: true
                        status: CAPPED
                        used_quota: 10
                        total_quota: 10
                      reachout_timelock:
                        available: true
                        active: true
                        until: '2026-04-07T12:00:00Z'
                        enforcement_type: BIZ_QUALITY
components:
  schemas:
    Message:
      type: object
      description: Representa uma mensagem trocada no sistema
      properties:
        id:
          type: string
          format: uuid
          description: >-
            ID único interno da mensagem (formato r + 7 caracteres hex
            aleatórios)
        messageid:
          type: string
          description: ID original da mensagem no provedor
        chatid:
          type: string
          description: ID da conversa relacionada
        sender:
          type: string
          description: ID do remetente da mensagem
        senderName:
          type: string
          description: Nome exibido do remetente
        isGroup:
          type: boolean
          description: Indica se é uma mensagem de grupo
          default: false
        fromMe:
          type: boolean
          description: Indica se a mensagem foi enviada pelo usuário
          default: false
        messageType:
          type: string
          description: Tipo de conteúdo da mensagem
        source:
          type: string
          description: Plataforma de origem da mensagem
        messageTimestamp:
          type: integer
          description: Timestamp original da mensagem em milissegundos
          default: 0
        status:
          type: string
          description: >
            Status do ciclo de vida da mensagem.

            Exemplos comuns: `Queued`, `Canceled`, `Failed`, `Sent`,
            `Delivered`, `Read`.

            Em mensagem de grupo, segue o participante mais adiantado:
            `Delivered` quando pelo menos um recebeu, `Read` quando pelo menos
            um leu e `Played` quando pelo menos um ouviu.
        text:
          type: string
          description: Texto original da mensagem
          default: ''
        quoted:
          type: string
          description: ID da mensagem citada/respondida
          default: ''
        edited:
          type: string
          description: Histórico de edições da mensagem
          default: ''
        reaction:
          type: string
          description: ID da mensagem reagida
          default: ''
        vote:
          type: string
          description: Dados de votação de enquete e listas
          default: ''
        convertOptions:
          type: string
          description: Conversão de opções da mensagem, lista, enquete e botões
          default: ''
        buttonOrListid:
          type: string
          description: ID do botão ou item de lista selecionado
          default: ''
        owner:
          type: string
          description: Dono da mensagem
          default: ''
        error:
          type: string
          description: Mensagem de erro caso o envio tenha falhado
          default: ''
        content:
          description: Conteúdo bruto da mensagem (JSON serializado ou texto)
          oneOf:
            - type: object
              additionalProperties: true
            - type: string
              description: Texto bruto quando não for JSON
        wasSentByApi:
          type: boolean
          description: Indica se a mensagem foi enviada via API
        pinned:
          type: boolean
          description: >-
            Mensagem fixada na conversa (fixar e desafixar chegam também em
            `messages_update`, tipos `Pinned` e `Unpinned`)
        sendFunction:
          type: string
          description: Função usada para enviar a mensagem (quando enviada via API)
        sendPayload:
          description: >-
            Payload usado no envio quando disponível. Dados de mídia em base64
            são omitidos.
          oneOf:
            - type: object
              additionalProperties: true
            - type: string
              description: Texto bruto quando não for JSON
        fileURL:
          type: string
          description: URL ou referência de arquivo da mensagem
        callPeer:
          type: object
          description: >-
            Contato conhecido associado a uma ligação, quando disponível em
            `messageType: call`.
          properties:
            jid:
              type: string
            name:
              type: string
            imagePreviewUrl:
              type: string
        send_folder_id:
          type: string
          description: Pasta associada ao envio (quando aplicável)
        track_source:
          type: string
          description: Origem de rastreamento
        track_id:
          type: string
          description: ID de rastreamento (pode repetir)
        ai_metadata:
          type: object
          description: >-
            Registro de uma rodada da IA. O completo (pedido ao modelo, resposta
            e `outcome`) fica uma vez, na última mensagem do contato que a
            rodada respondeu, também quando nada saiu (erro, resposta
            descartada). Cada mensagem enviada pela IA leva só `agent_id` e
            `turn` (o `id` dessa mensagem do contato).
          properties:
            agent_id:
              type: string
              description: ID do agente de IA responsável
            turn:
              type: string
              description: >-
                Na mensagem enviada pela IA: o `id` da mensagem do contato onde
                está o registro completo da rodada.
            flow_id:
              type: string
              description: >-
                Mensagem enviada por um fluxo: o `id` do fluxo. A mensagem
                enviada pela IA traz o `agent_id`.
            request:
              type: object
              description: Dados da requisição à API de IA
              properties:
                messages:
                  type: array
                  description: Histórico de mensagens enviadas para a API
                tools:
                  type: array
                  description: Ferramentas disponíveis para o agente
                options:
                  type: object
                  description: Opções de configuração da API
                  properties:
                    model:
                      type: string
                    temperature:
                      type: number
                    maxTokens:
                      type: integer
                    topP:
                      type: number
                    frequencyPenalty:
                      type: number
                    presencePenalty:
                      type: number
            response:
              type: object
              description: Resposta da API de IA
              properties:
                choices:
                  type: array
                  description: Resultados retornados pela API
                toolResults:
                  type: array
                  description: Resultados da execução de ferramentas
                error:
                  type: string
                  description: Mensagem de erro, se houver
            outcome:
              type: object
              description: O que a rodada fez de fato (só no registro completo).
              properties:
                status:
                  type: string
                  enum:
                    - sent
                    - cancelled
                    - error
                    - empty
                  description: >-
                    `sent`: enviou algo; `cancelled`: descartada (a conversa
                    pausou, um fluxo começou ou bateu o limite de respostas por
                    hora); `error`: o provedor falhou; `empty`: nada a enviar.
                texts:
                  type: integer
                  description: Mensagens de texto enviadas.
                audio:
                  type: boolean
                  description: Respondeu em áudio.
                menus:
                  type: integer
                  description: Menus enviados.
                files:
                  type: integer
                  description: Arquivos (mensagens cadastradas) enviados.
                handoff:
                  type: string
                  description: '`chamar_humano`: o resumo para quem atender.'
                lead:
                  type: array
                  items:
                    type: string
                  description: >-
                    `atualizar_lead`: o que foi gravado no CRM (`lead_email =
                    ana@exemplo.com; column = Agendado`).
                detail:
                  type: string
                  description: Por que foi descartada, ou o erro.
        sender_pn:
          description: JID PN resolvido do remetente (quando disponível)
          oneOf:
            - type: string
            - type: 'null'
        sender_lid:
          description: LID original do remetente (quando disponível)
          oneOf:
            - type: string
            - type: 'null'
        sender_image_preview_url:
          type: string
          format: uri
          description: >-
            URL temporária de preview do remetente, quando conhecida. A
            hidratação desta versão preenche mensagens recebidas em grupos; o
            campo pode ser omitido. Não provoca consulta de foto ao WhatsApp na
            listagem.
  securitySchemes:
    token:
      name: token
      type: apiKey
      in: header

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.