Documentação API WhatsApp

Guia completo de integração com WhatsApp

Gerenciamento de Instâncias WhatsApp

Sobre o Gerenciamento de Instâncias

Sistema de gerenciamento multi-instância do WhatsApp que permite:

  • Criar e gerenciar múltiplas conexões do WhatsApp
  • Monitorar status em tempo real de cada instância
  • Conectar via QR Code de forma segura
  • Iniciar/pausar sessões conforme necessidade
  • Gerenciar recursos de forma independente

Fluxo de Uso Recomendado

  1. Criar uma nova instância
  2. Obter o QR Code para conexão
  3. Escanear o QR Code com o WhatsApp
  4. Verificar o status da conexão
  5. Iniciar o uso das funcionalidades

Webhooks Disponíveis

Quando configurados, os seguintes eventos são notificados via webhook:

  • Status Change: Mudanças no status da instância
    {
      "event": "status_change",
      "instancia_id": 100,
      "instancia_nome": "Minha Instância",
      "status": {
        "anterior": "connected",
        "atual": "disconnected"
      },
      "timestamp": "2025-01-15T12:34:30-03:00"
    }
  • Mensagem Enviada/Recebida: Notificação de mensagens
    {
      "id": 123,
      "mensagem_id": "ABC123",
      "instancia_id": 100,
      "mensagem": "Conteúdo da mensagem",
      "origem": "5511999999999",
      "destino": "5511888888888",
      "enviado": true,
      "erro": null,
      "tipo_envio": "MENSAGEM_ENVIADA", // ou "MENSAGEM_RECEBIDA"
      "grupo": false,
      "lido": false,
      "created_at": "2025-01-15T12:34:30-03:00"
    }

Criar Nova Instância

1. Criar Nova Instância

POST /api/v1/whatsapp/instancia/criar

Cria uma nova instância do WhatsApp para uso

Parâmetros

Parâmetro Tipo Obrigatório Descrição
nome string Sim Nome para identificar a instância (máx. 255 caracteres)
webhook_url string Não URL para receber webhooks (ativa automaticamente as notificações)

Exemplo de Requisição

curl -X POST "https://apifacil.dev/api/v1/whatsapp/instancia/criar" \
     -H "Authorization: seu_token" \
     -H "Content-Type: application/json" \
     -d '{
       "nome": "Minha Instância"
     }'

Exemplo de Resposta (Sucesso)

{
    "error": false,
    "message": "Instância criada com sucesso",
    "data": {
        "instancia_id": "123",
        "nome": "Minha Instância",
        "status": "inactive",
        "token": "abc123def456"
    }
}

Observações

  • Limite de instâncias varia conforme o plano
  • O token gerado é único e necessário para operações futuras
  • A instância inicia com status "inactive"

Códigos de Resposta

Código Descrição
200 Instância criada com sucesso
403 Limite de instâncias atingido
422 Erro de validação nos dados

Listar Instâncias

2. Listar Instâncias

GET /api/v1/whatsapp/instancia/listar

Retorna todas as instâncias do usuário

Exemplo de Requisição

curl -X GET "https://apifacil.dev/api/v1/whatsapp/instancia/listar" \
     -H "Authorization: seu_token"

Exemplo de Resposta

{
    "error": false,
    "data": [
        {
            "id": "123",
            "nome": "Minha Instância",
            "public_token": "abc123def456",
            "status": "active",
            "whatsapp_status": "connected",
            "created_at": "2024-01-01T10:00:00Z"
        },
        {
            "id": "124",
            "nome": "Instância 2",
            "public_token": "xyz789",
            "status": "inactive",
            "whatsapp_status": "disconnected",
            "created_at": "2024-01-02T15:30:00Z"
        }
    ]
}

Status Possíveis

Status Descrição
active Instância ativa e pronta para uso
inactive Instância criada mas não iniciada
connected WhatsApp conectado e operacional
disconnected WhatsApp desconectado

Detalhes da Resposta

Campo Tipo Descrição
id string Identificador único da instância
nome string Nome da instância
public_token string Token público para operações
status string Status atual da instância
whatsapp_status string Status da conexão WhatsApp

Status da Instância

3. Verificar Status da Instância

GET /api/v1/whatsapp/instancia/{id}/status

Retorna o status detalhado de uma instância específica

Parâmetros de URL

Parâmetro Tipo Descrição
id string ID da instância

Exemplo de Requisição

curl -X GET "https://apifacil.dev/api/v1/whatsapp/instancia/123/status" \
     -H "Authorization: seu_token"

Exemplo de Resposta

{
    "error": false,
    "data": {
        "status_banco": "connected",
        "tem_qrcode": false
    }
}

Estados Possíveis

Estado Descrição Próximas Ações
connected WhatsApp conectado Pronto para uso
disconnected Desconectado Reconectar ou gerar novo QR

Obter QR Code

4. Obter QR Code

GET /api/v1/whatsapp/instancia/{id}/qrcode

Obtém o QR Code para conexão do WhatsApp

O QR Code é válido por 20 segundos. Após esse período, será necessário gerar um novo.

Exemplo de Requisição

curl -X GET "https://apifacil.dev/api/v1/whatsapp/instancia/123/qrcode" \
     -H "Authorization: seu_token"

Exemplo de Resposta

{
    "error": false,
    "data": {
        "qrcode": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgA...",
        "sessao_ativa": false
    }
}

⚠️ Importantes Considerações

  • QR Code expira em 20 segundos
  • Máximo de 3 tentativas por minuto
  • Recomenda-se implementar retry com intervalo
  • Verificar status após scan bem-sucedido

Iniciar Sessão

5. Gerenciamento de Sessão

Iniciar Sessão

POST /api/v1/whatsapp/instancia/{id}/iniciar

Inicia uma instância específica do WhatsApp

Exemplo de Requisição

curl -X POST "https://apifacil.dev/api/v1/whatsapp/instancia/123/iniciar" \
     -H "Authorization: seu_token"

Exemplo de Resposta

{
    "error": false,
    "message": "Sessão iniciada com sucesso"
}

Pausar Sessão

Pausar Sessão

POST /api/v1/whatsapp/instancia/{id}/pausar

Pausa temporariamente uma instância do WhatsApp

Exemplo de Requisição

curl -X POST "https://apifacil.dev/api/v1/whatsapp/instancia/123/pausar" \
     -H "Authorization: seu_token"

Exemplo de Resposta

{
    "error": false,
    "message": "Sessão pausada com sucesso"
}

Desconectar Sessão

Desconectar Sessão

POST /api/v1/whatsapp/instancia/{id}/desconectar

Desconecta completamente uma instância do WhatsApp e limpa os dados da sessão

Esta operação é mais agressiva que pausar. Ela remove todos os dados da sessão e requer um novo QR Code para reconexão.

Exemplo de Requisição

curl -X POST "https://apifacil.dev/api/v1/whatsapp/instancia/123/desconectar" \
     -H "Authorization: seu_token"

Exemplo de Resposta

{
    "error": false,
    "message": "Instância desconectada com sucesso"
}

Diferenças entre Pausar e Desconectar

Ação Pausar Desconectar
Dados da Sessão Mantidos Removidos
Reconexão Rápida Requer novo QR Code
Notificações Preservadas Removidas

Deletar Instância

6. Deletar Instância

DELETE /api/v1/whatsapp/instancia/{id}

Remove permanentemente uma instância do WhatsApp

Exemplo de Requisição

curl -X DELETE "https://apifacil.dev/api/v1/whatsapp/instancia/123" \
     -H "Authorization: seu_token"

Exemplo de Resposta

{
    "error": false,
    "message": "Instância deletada com sucesso"
}

⚠️ Atenção

  • Ação irreversível
  • Remove todos os dados associados

Verificar Número do WhatsApp

Verificar Número

POST /api/v1/whatsapp/instancia/verificar-numero

Verifica se um número está registrado no WhatsApp

Este endpoint permite verificar se um número de telefone está registrado no WhatsApp antes de tentar enviar mensagens. Se não for informada uma instância, será utilizada a primeira instância do usuário.

Parâmetros

Parâmetro Tipo Obrigatório Descrição
telefone string Sim Número a ser verificado (formato: DDI + DDD + número)
instancia string Não ID da instância a ser utilizada. Se não informado, usa a primeira instância

Exemplo de Requisição

curl -X POST "https://apifacil.dev/api/v1/whatsapp/instancia/verificar-numero" \
     -H "Authorization: seu_token" \
     -H "Content-Type: application/json" \
     -d '{
       "telefone": "5511999999999",
       "instancia": "123"
     }'

Exemplo de Resposta

{
    "error": false,
    "data": {
        "exists": true,
        "number": "5511999999999"
    },
    "message": "Verificação realizada com sucesso"
}

Notificações WhatsApp

Listar Notificações

GET /api/v1/whatsapp/notificacoes

Lista todas as notificações do WhatsApp

Parâmetros de Query

Parâmetro Tipo Obrigatório Descrição
data_inicial string Não Data inicial para filtro (Y-m-d)
data_final string Não Data final para filtro (Y-m-d)
instancia_id integer Não ID da instância para filtrar
tipo_envio string Não Tipo de envio (ex: MENSAGEM_ENVIADA, MENSAGEM_RECEBIDA)
per_page integer Não Quantidade de registros por página (padrão: 15)

Exemplo de Requisição

curl -X GET "https://apifacil.dev/api/v1/whatsapp/notificacoes?data_inicial=2024-01-01&data_final=2024-01-31" \
     -H "Authorization: seu_token"

Exemplo de Resposta

{
    "error": false,
    "data": {
        "current_page": 1,
        "data": [
            {
                "id": 123,
                "mensagem_id": "ABC123",
                "instancia_id": 100,
                "mensagem": "Conteúdo da mensagem",
                "origem": "5511999999999",
                "destino": "5511888888888",
                "enviado": true,
                "erro": null,
                "tipo_envio": "MENSAGEM_ENVIADA",
                "grupo": false,
                "lido": false,
                "created_at": "2024-01-15T12:34:30Z",
                "updated_at": "2024-01-15T12:34:30Z"
            }
        ],
        "first_page_url": "http://api.exemplo.com/api/v1/whatsapp/notificacoes?page=1",
        "from": 1,
        "last_page": 1,
        "last_page_url": "http://api.exemplo.com/api/v1/whatsapp/notificacoes?page=1",
        "next_page_url": null,
        "path": "http://api.exemplo.com/api/v1/whatsapp/notificacoes",
        "per_page": 15,
        "prev_page_url": null,
        "to": 1,
        "total": 1
    }
}

Consultar Notificação

GET /api/v1/whatsapp/notificacoes/{id}

Retorna os detalhes de uma notificação específica

Exemplo de Requisição

curl -X GET "https://apifacil.dev/api/v1/whatsapp/notificacoes/123" \
     -H "Authorization: seu_token"

Exemplo de Resposta

{
    "error": false,
    "data": {
        "id": 123,
        "mensagem_id": "ABC123",
        "instancia_id": 100,
        "mensagem": "Conteúdo da mensagem",
        "origem": "5511999999999",
        "destino": "5511888888888",
        "enviado": true,
        "erro": null,
        "tipo_envio": "MENSAGEM_ENVIADA",
        "grupo": false,
        "lido": false,
        "created_at": "2024-01-15T12:34:30Z",
        "updated_at": "2024-01-15T12:34:30Z"
    }
}

Tipos de Envio Disponíveis

Tipo Descrição
MENSAGEM_ENVIADA Mensagem enviada com sucesso
MENSAGEM_RECEBIDA Mensagem recebida de um contato
ERRO_PROCESSAMENTO Erro durante o processamento da mensagem
MENSAGEM_GRUPO_RECEBIDO Mensagem recebida em um grupo
AUDIO_RECEBIDO Áudio recebido
IMAGEM_RECEBIDA Imagem recebida
VIDEO_RECEBIDO Vídeo recebido
DOCUMENTO_RECEBIDO Documento recebido

⚠️ Atenção: Configuração Necessária

Para utilizar a API de WhatsApp, é necessário:

  • Cadastrar uma instância de WhatsApp no painel
  • Configurar e conectar seu celular através do QR Code
  • Aguardar a sincronização completa
Importante:

O envio de mensagens só funcionará após a configuração completa de uma instância e a sincronização bem-sucedida com seu WhatsApp.

Enviar Mensagem WhatsApp

POST /api/v1/whatsapp/enviar-mensagem

Envia uma mensagem de texto via WhatsApp

Parâmetros

Parâmetro Tipo Descrição
telefone string Número do WhatsApp com DDD
mensagem string Texto da mensagem
instancia string ID da instância do WhatsApp (opcional)

Importante: Formato do Telefone

O número de telefone deve incluir o código do país. Exemplos:

  • Brasil: 5511999999999
  • EUA: 13025550123
  • Portugal: 351912345678

Códigos de País Suportados

Américas
  • Brasil (55) - 11 dígitos
  • EUA/Canadá (1) - 10 dígitos
  • México (52) - 10 dígitos
  • Argentina (54) - 10 dígitos
  • Chile (56) - 9 dígitos
Europa
  • Reino Unido (44) - 10 dígitos
  • Espanha (34) - 9 dígitos
  • Portugal (351) - 9 dígitos
  • França (33) - 9 dígitos
  • Alemanha (49) - 11 dígitos
  • Itália (39) - 10 dígitos
Ásia/Pacífico
  • Japão (81) - 10 dígitos
  • China (86) - 11 dígitos
  • Índia (91) - 10 dígitos
  • Austrália (61) - 9 dígitos

Exemplo de requisição

{
  "telefone": "5511999999999",  // Inclui código do país (55) + DDD (11) + número
  "mensagem": "Olá! Esta é uma mensagem de teste.",
  "instancia": "12345"
}

Exemplo cURL

curl -X POST "https://apifacil.dev/api/v1/whatsapp/enviar-mensagem" \
     -H "Authorization: seu_token_aqui" \
     -H "Content-Type: application/json" \
     -d '{
       "telefone": "5511999999999",
       "mensagem": "Olá! Esta é uma mensagem de teste.",
       "instancia": "12345"
     }'

Exemplo de resposta

{
  "error": false,
  "data": {
    "queue": "mensagem_em_fila",
    "message": "Mensagem em fila para envio"
  }
}

Atenção!

O link fornecido no campo "url" deve estar presente no texto da mensagem para que o preview funcione corretamente.

Enviar Mensagem com Preview

POST /api/v1/whatsapp/enviar-preview

Envie mensagens com preview personalizado de links

Envie mensagens de texto com preview personalizado de links para seus contatos no WhatsApp.

Endpoint

POST /api/v1/whatsapp/enviar-preview
Parâmetro Tipo Descrição Obrigatório
telefone string Número do WhatsApp (com DDD) Sim
mensagem string Texto da mensagem Sim
url string URL para gerar o preview Sim
titulo string Título personalizado para o preview Não
descricao string Descrição personalizada para o preview Não
imagem_url string URL da imagem para o preview Não
instancia string ID da instância do WhatsApp Não
tipo_imagem string Tamanho do preview da imagem (small, medium ou large) Não

Exemplo de Requisição

{
    "telefone": "5511999999999",
    "mensagem": "Confira este link interessante! https://exemplo.com",
    "url": "https://exemplo.com",
    "titulo": "Título Personalizado",
    "descricao": "Descrição personalizada do link",
    "imagem_url": "https://exemplo.com/imagem.jpg",
    "tipo_imagem": "medium"
}

Exemplo de Requisição cURL

curl -X POST https://apifacil.com/api/v1/whatsapp/enviar-preview \
-H 'Content-Type: application/json' \
-H 'Authorization: sua_chave_de_api' \
-d '{
    "telefone": "5511999999999",
    "mensagem": "Confira este link interessante! https://exemplo.com",
    "url": "https://exemplo.com",
    "titulo": "Título Personalizado",
    "descricao": "Descrição personalizada do link",
    "imagem_url": "https://exemplo.com/imagem.jpg",
    "tipo_imagem": "medium"
}'

Exemplo de Resposta

{
    "error": false,
    "data": {
        "queue": true,
        "message": "Mensagem em fila para envio"
    }
}

Dica: Se não forem fornecidos título, descrição ou imagem, o sistema tentará extraí-los automaticamente da URL fornecida.

Enviar Imagem WhatsApp

POST /api/v1/whatsapp/enviar-foto

Envia uma imagem via WhatsApp

Parâmetros

Parâmetro Tipo Descrição
telefone string Número do WhatsApp com DDD
link string URL da imagem
nome string Nome da imagem
instancia string ID da instância do WhatsApp (opcional)

Exemplo de requisição

{
  "telefone": "5551999999999",
  "link": "https://example.com/imagem.jpg",
  "nome": "imagem.jpg",
  "instancia": "12345"
}

Exemplo cURL

curl -X POST "https://apifacil.dev/api/v1/whatsapp/enviar-foto" \
 -H "Authorization: seu_token_aqui" \
 -H "Content-Type: application/json" \
 -d '{
   "telefone": "5551999999999",
   "link": "https://example.com/imagem.jpg",
   "nome": "imagem.jpg",
   "instancia": "12345"
 }'

Enviar Foto em Base64

POST /api/v1/whatsapp/enviar-foto-64

Envie imagens codificadas em Base64 para seus contatos no WhatsApp

Este endpoint permite enviar fotos em formato Base64 diretamente para seus contatos no WhatsApp, sem a necessidade de hospedar a imagem em um servidor externo.

Endpoint

POST /api/v1/whatsapp/enviar-foto-64
Parâmetro Tipo Descrição Obrigatório
telefone string Número do WhatsApp (com DDD) Sim
foto_base64 string Imagem em formato Base64 Sim
nome string Nome ou legenda da foto Sim
instancia string ID da instância do WhatsApp Não

Exemplo de Requisição

{
    "telefone": "5511999999999",
    "foto_base64": "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG...",
    "nome": "Imagem de produto",
    "instancia": "abcd1234"
}

Exemplo de Requisição cURL

curl -X POST https://apifacil.com/api/v1/whatsapp/enviar-foto-64 \
-H 'Content-Type: application/json' \
-H 'Authorization: sua_chave_de_api' \
-d '{
    "telefone": "5511999999999",
    "foto_base64": "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG...",
    "nome": "Imagem de produto",
    "instancia": "abcd1234"
}'

Exemplo de Resposta

{
    "error": false,
    "data": {
        "queue": true,
        "message": "Foto em fila para envio"
    }
}

Dica: A imagem deve estar codificada em Base64 sem o prefixo "data:image/jpeg;base64,". Os formatos mais compatíveis com WhatsApp são JPG e PNG.

Enviar Arquivo WhatsApp

POST /api/v1/whatsapp/enviar-arquivo

Envia um arquivo via WhatsApp

Parâmetros

Parâmetro Tipo Descrição
telefone string Número do WhatsApp com DDD
link string URL do arquivo
nome string Nome do arquivo
mensagem string Texto opcional para o arquivo
instancia string ID da instância do WhatsApp (opcional)

Exemplo de requisição

{
  "telefone": "5551999999999",
  "link": "https://example.com/documento.pdf",
  "nome": "documento.pdf",
  "mensagem": "Confira o documento.",
  "instancia": "12345"
}

Exemplo cURL

curl -X POST "https://apifacil.dev/api/v1/whatsapp/enviar-arquivo" \
 -H "Authorization: seu_token_aqui" \
 -H "Content-Type: application/json" \
 -d '{
   "telefone": "5551999999999",
   "link": "https://example.com/documento.pdf",
   "nome": "documento.pdf",
   "mensagem": "Confira o documento.",
   "instancia": "12345"
 }'

Enviar Arquivo Base64

Endpoint para enviar arquivos codificados em base64 através do WhatsApp. Este método é útil quando você já tem o arquivo em formato base64 e não quer fazer upload para um servidor externo.

POST /v1/whatsapp/enviar-arquivo-64

Parâmetros

Parâmetro Tipo Descrição
arquivo_base64 string Arquivo codificado em base64 (sem o prefixo data:...)
tipo_arquivo string Extensão do arquivo (pdf, doc, xlsx, etc)
nome string Nome do arquivo que aparecerá no WhatsApp
telefone string Número do telefone no formato DDDNúmero
mensagem string Mensagem opcional que acompanha o arquivo
instancia string ID da instância (opcional)

Exemplo de Requisição

{
    "arquivo_base64": "JVBERi0xLjcKCjEgMCBvYmogICUgZW50...",
    "tipo_arquivo": "pdf",
    "nome": "documento.pdf",
    "telefone": "11999999999",
    "mensagem": "Segue o documento solicitado",
    "instancia": "123"
}

Exemplo cURL

curl --location 'https://apifacil.dev/api/v1/whatsapp/enviar-arquivo-64' \
--header 'Authorization: seu_token_aqui' \
--header 'Content-Type: application/json' \
--data '{
    "arquivo_base64": "JVBERi0xLjcKCjEgMCBvYmogICUgZW50...",
    "tipo_arquivo": "pdf",
    "nome": "documento.pdf",
    "telefone": "11999999999",
    "mensagem": "Segue o documento solicitado",
    "instancia": "123"
}'

Resposta de Sucesso

{
    "error": false,
    "data": {
        "queue": "msg_123456",
        "message": "Arquivo em fila para envio"
    }
}

Tipos de Arquivo Suportados

  • PDF (pdf)
  • Word (doc, docx)
  • Excel (xls, xlsx)
  • Imagens (png, jpg, jpeg, gif)
  • CSV (csv)
  • Texto (txt)

O tipo do arquivo informado deve corresponder ao conteúdo real do arquivo base64. A API valida o MIME type do arquivo para garantir a segurança.

Enviar Áudio WhatsApp

POST /api/v1/whatsapp/enviar-audio

Envia uma mensagem de voz via WhatsApp

Parâmetros

Parâmetro Tipo Descrição
telefone string Número do WhatsApp com DDD
audio_url string URL do arquivo de áudio (MP3/MP4)
instancia string ID da instância do WhatsApp (opcional)

Dicas para Áudio

  • Formatos suportados: MP3, MP4, OGG, M4A, WEBM
  • Tamanho máximo: 16MB
  • Duração máxima recomendada: 2 minutos
  • URL deve ser pública e acessível
  • Para áudios gravados no WhatsApp, o formato OGG é recomendado

Exemplo de requisição

{
"telefone": "5511999999999",
"audio_url": "https://example.com/audio.mp3",
"instancia": "12345"
}

Exemplo cURL

curl -X POST "https://apifacil.dev/api/v1/whatsapp/enviar-audio" \
 -H "Authorization: seu_token_aqui" \
 -H "Content-Type: application/json" \
 -d '{
   "telefone": "5511999999999",
   "audio_url": "https://example.com/audio.mp3",
   "instancia": "12345"
 }'

Enviar Áudio em Base64

POST /api/v1/whatsapp/enviar-audio-64

Envie arquivos de áudio codificados em Base64 para seus contatos no WhatsApp

Este endpoint permite enviar áudios em formato Base64 diretamente para seus contatos no WhatsApp, sem a necessidade de hospedar o arquivo em um servidor externo.

Endpoint

POST /api/v1/whatsapp/enviar-audio-64
Parâmetro Tipo Descrição Obrigatório
telefone string Número do WhatsApp (com DDD) Sim
audio_base64 string Arquivo de áudio em formato Base64 Sim
instancia string ID da instância do WhatsApp Não

Exemplo de Requisição

{
    "telefone": "5511999999999",
    "audio_base64": "UklGRiSAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YTAAAAA...",
    "instancia": "abcd1234"
}

Exemplo de Requisição cURL

curl -X POST https://apifacil.com/api/v1/whatsapp/enviar-audio-64 \
-H 'Content-Type: application/json' \
-H 'Authorization: sua_chave_de_api' \
-d '{
    "telefone": "5511999999999",
    "audio_base64": "UklGRiSAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YTAAAAA...",
    "instancia": "abcd1234"
}'

Exemplo de Resposta

{
    "error": false,
    "data": {
        "queue": true,
        "message": "Áudio em fila para envio"
    }
}

Dica: O áudio deve estar codificado em Base64. Para áudios enviados via WhatsApp, recomenda-se o formato OGG, que tem melhor compatibilidade.

Enviar Lista de Opções

Envie uma mensagem com lista de opções interativa para um número do WhatsApp.

Endpoint

POST /api/v1/whatsapp/enviar-lista

Parâmetros da Requisição

Parâmetro Tipo Descrição Obrigatório
telefone string Número do WhatsApp com código do país Sim
text string Texto principal da mensagem Não
footer string Texto do rodapé da mensagem Não
buttonText string Texto do botão que abre a lista Não
sections array Array de seções com opções Sim
instancia string ID da instância do WhatsApp Não

Exemplo de Requisição

{
    "telefone": "5511999999999",
    "text": "Escolha uma opção do menu",
    "footer": "Selecione abaixo",
    "buttonText": "Ver Menu",
    "sections": [
        {
            "title": "Menu Principal",
            "rows": [
                {
                    "title": "Opção 1",
                    "description": "Descrição da opção 1"
                },
                {
                    "title": "Opção 2",
                    "description": "Descrição da opção 2"
                }
            ]
        },
        {
            "title": "Outras Opções",
            "rows": [
                {
                    "title": "Opção 3",
                    "description": "Descrição da opção 3"
                }
            ]
        }
    ],
    "instancia": "123"
}

Exemplo cURL

curl -X POST \
    'https://apifacil.dev/api/v1/whatsapp/enviar-lista' \
    -H 'Authorization: seu_token' \
    -H 'Content-Type: application/json' \
    -d '{
    "telefone": "5511999999999",
    "text": "Escolha uma opção do menu",
    "footer": "Selecione abaixo",
    "buttonText": "Ver Menu",
    "sections": [
        {
            "title": "Menu Principal",
            "rows": [
                {
                    "title": "Opção 1",
                    "description": "Descrição da opção 1"
                },
                {
                    "title": "Opção 2",
                    "description": "Descrição da opção 2"
                }
            ]
        },
        {
            "title": "Outras Opções",
            "rows": [
                {
                    "title": "Opção 3",
                    "description": "Descrição da opção 3"
                }
            ]
        }
    ],
    "instancia": "123"
}'

Resposta de Sucesso

{
    "error": false,
    "data": {
        "queue": "true",
        "message": "Lista em fila para envio"
    }
}

Observações

  • A lista pode conter múltiplas seções com diferentes opções
  • Cada opção (row) deve ter um título e pode ter uma descrição opcional
  • O texto do botão (buttonText) tem limite de 20 caracteres
  • O número de seções e opções é limitado pela API do WhatsApp

Listar Grupos do WhatsApp

GET /whatsapp/grupos

Lista todos os grupos que a instância participa

Parâmetros

Parâmetro Tipo Descrição
instancia string ID da instância do WhatsApp (opcional)

Exemplo de requisição cURL

curl -X GET "https://apifacil.dev/api/v1/whatsapp/grupos?instancia=12345" \
 -H "Authorization: seu_token_aqui"

Exemplo de resposta

{
"error": false,
"data": [
    {
        "id": "123456789-group@g.us",
        "name": "Nome do Grupo",
        "participants": 50,
        "isAdmin": true
    }
]
}

Enviar Mensagem para Grupo do WhatsApp

POST /whatsapp/grupo/enviar-mensagem

Envia uma mensagem para um grupo específico

Parâmetros

Parâmetro Tipo Descrição
grupo_id string ID do grupo (obtido via listagem)
mensagem string Texto da mensagem
instancia string ID da instância do WhatsApp (opcional)

Exemplo de requisição

{
"grupo_id": "123456789-group@g.us",
"mensagem": "Olá grupo!",
"instancia": "12345"
}

Exemplo cURL

curl -X POST "https://apifacil.dev/api/v1/whatsapp/grupo/enviar-mensagem" \
 -H "Authorization: seu_token_aqui" \
 -H "Content-Type: application/json" \
 -d '{
   "grupo_id": "123456789-group@g.us",
   "mensagem": "Olá grupo!",
   "instancia": "12345"
 }'

Enviar Arquivo para Grupo do WhatsApp

POST /whatsapp/grupo/enviar-arquivo

Envia um arquivo para um grupo específico

Parâmetros

Parâmetro Tipo Descrição
grupo_id string ID do grupo (obtido via listagem)
link string URL do arquivo
nome string Nome do arquivo
mensagem string Texto opcional para o arquivo
instancia string ID da instância do WhatsApp (opcional)

Exemplo de requisição

{
"grupo_id": "123456789-group@g.us",
"link": "https://example.com/documento.pdf",
"nome": "documento.pdf",
"mensagem": "Confira o documento.",
"instancia": "12345"
}

Exemplo cURL

curl -X POST "https://apifacil.dev/api/v1/whatsapp/grupo/enviar-arquivo" \
 -H "Authorization: seu_token_aqui" \
 -H "Content-Type: application/json" \
 -d '{
   "grupo_id": "123456789-group@g.us",
   "link": "https://example.com/documento.pdf",
   "nome": "documento.pdf",
   "mensagem": "Confira o documento.",
   "instancia": "12345"
 }'

Enviar Mensagem com Preview para Grupo do WhatsApp

POST /whatsapp/grupo/enviar-preview

Envia uma mensagem com preview de link para um grupo específico

Parâmetros

Parâmetro Tipo Descrição
grupo_id string ID do grupo (obtido via listagem)
mensagem string Texto da mensagem
url string URL que será exibida no preview
titulo string Título do preview (opcional)
descricao string Descrição do preview (opcional)
imagem_url string URL da imagem do preview (opcional)
tipo_imagem string Tamanho da imagem (small, medium, large) - padrão: medium
instancia string ID da instância do WhatsApp (opcional)

Exemplo de requisição

{
"grupo_id": "123456789-group@g.us",
"mensagem": "Confira este link interessante!",
"url": "https://exemplo.com",
"titulo": "Título do Link",
"descricao": "Descrição do conteúdo",
"imagem_url": "https://exemplo.com/imagem.jpg",
"tipo_imagem": "medium",
"instancia": "12345"
}

Exemplo cURL

curl -X POST "https://apifacil.dev/api/v1/whatsapp/grupo/enviar-preview" \
 -H "Authorization: seu_token_aqui" \
 -H "Content-Type: application/json" \
 -d '{
   "grupo_id": "123456789-group@g.us",
   "mensagem": "Confira este link interessante!",
   "url": "https://exemplo.com",
   "titulo": "Título do Link",
   "descricao": "Descrição do conteúdo",
   "imagem_url": "https://exemplo.com/imagem.jpg",
   "tipo_imagem": "medium",
   "instancia": "12345"
 }'

Bot Templates

Sistema de automação de conversas no WhatsApp com suporte a fluxos complexos, timeout de conversas e bloqueio de interações.

Estrutura do Template

{
    "name": string,         // Nome do fluxo
    "instancia_id": number, // ID da instância WhatsApp
    "type": string,         // Tipo do template: "default" ou "ia"
    "assistant_prompt": string,  // Prompt para templates do tipo "ia"
    "template": {
        "questions": [
            {
                "id": number,
                "text": string,     // Texto da pergunta
                "timeout": number,   // Tempo limite em segundos (padrão: 300)
                "expirationMessage": string, // Mensagem quando timeout expirar
                "responses": [
                    {
                        "matches": string[],   // Palavras que ativam esta resposta
                                             // Use "*" para aceitar qualquer resposta
                        "action": {
                            "type": "text" | "api" | "nextQuestion" | "executeTemplate",
                            
                            // Configurações de bloqueio (opcional)
                            "blockChat": boolean,    // Bloqueia novas interações
                            "blockTimeout": number,  // Duração do bloqueio em segundos
                            "unblockKeywords": string[], // Palavras para desbloquear
                            "unblockMessage": string,    // Mensagem ao desbloquear

                            // Para type: "text"
                            "message": string,       // Mensagem a enviar
                            "storeAs": string,      // Nome para salvar resposta
                            
                            // Para type: "nextQuestion"
                            "nextQuestionId": number, // ID da próxima pergunta
                            
                            // Para type: "api"
                            "url": string,          // URL da API
                            "method": string,       // Método HTTP
                            "headers": object,      // Headers adicionais
                            "body": object,         // Corpo da requisição
                            "responsePath": string, // Caminho para mensagem na resposta
                            "nextMessage": string,  // Mensagem após chamada API
                            
                            // Para type: "executeTemplate"
                            "templateId": number    // ID do template a executar
                        }
                    }
                ]
            }
        ]
    },
    "triggers": string[],  // Palavras que iniciam o fluxo
    "active": boolean     // Status do template
}

Exemplo de Fluxo Completo

Abaixo está um exemplo de um menu interativo completo com múltiplos níveis e funcionalidades:

Menu Principal:

{
    "name": "Menu Completo",
    "instancia_id": 1,
    "template": {
        "expirationMessage": "Sua sessão expirou por inatividade. Por favor, inicie a conversa novamente.",
        "questions": [
            {
                "id": 0,
                "text": "👋 Olá! Como posso ajudar?\n\n1 - FAQ/Dúvidas Frequentes\n2 - Falar com Suporte\n3 - Horários de Funcionamento\n4 - Nossos Endereços\n5 - Fazer um Pedido",
                "timeout": 300,
                "responses": [
                    {
                        "matches": ["1", "faq", "duvidas", "dúvidas"],
                        "action": {
                            "type": "nextQuestion",
                            "nextQuestionId": 1
                        }
                    },
                    {
                        "matches": ["3", "horario", "horário", "funcionamento"],
                        "action": {
                            "type": "text",
                            "message": "📅 Nossos horários:\n\n▫️ Segunda a Sexta: 09h às 18h\n▫️ Sábado: 09h às 13h\n▫️ Domingo e Feriados: Fechado"
                        }
                    }
                ]
            }
        ]
    },
    "triggers": ["oi", "olá", "ola", "menu", "início", "inicio"]
}

Exemplo de Bloqueio de Chat:

{
    "matches": ["3", "atendente", "humano"],
    "action": {
        "type": "text",
        "message": "👩‍💼 Transferindo para um atendente...",
        "blockChat": true,
        "blockTimeout": 3600,
        "unblockKeywords": ["cancelar", "sair"],
        "unblockMessage": "Atendimento cancelado. Digite 'menu' para voltar."
    }
}

Exemplo de Integração API:

{
    "matches": ["*"],
    "action": {
        "type": "api",
        "url": "https://api.exemplo.com/pedidos",
        "method": "POST",
        "storeAs": "endereco",
        "body": {
            "produto": "{produto}",
            "endereco": "{current}",
            "telefone": "{phone}"
        },
        "nextMessage": "✅ Pedido realizado com sucesso!\nNúmero do pedido: #{numero_pedido}"
    }
}

Variáveis do Sistema

Use estas variáveis em mensagens e chamadas API:

Variável Descrição
{current} Resposta atual do usuário
{phone} Número do usuário (sem @s.whatsapp.net)
{storedVariables.NOME} Variáveis salvas com storeAs

Metadata em Chamadas API

Dados automáticos incluídos em chamadas API:

{
    "whatsapp": {
        "numero": string,      // Número do usuário
        "nome_contato": string // Nome do contato
    },
    "conversa": {
        "timestamp": string,   // Data/hora atual
        "instancia_id": string // ID da instância
    },
    "metadata": {
        "plataforma": "WhatsApp",
        "versao_bot": "1.0",
        "origem": "bot_whatsapp"
    }
}

Listar Templates

GET /v1/bot/templates

Headers:

Header Valor Obrigatório
Authorization {seu-token} Sim

Curl exemplo:

curl -X GET "https://api.apifacil.com/v1/bot/templates" \
    -H "Authorization: {seu-token}"

Resposta:

{
    "error": false,
    "data": [
        {
            "id": 1,
            "instancia_id": 1,
            "name": "Atendimento",
            "template": {
                "questions": [
                    {
                        "id": 0,
                        "text": "Como posso ajudar?",
                        "responses": [...]
                    }
                ]
            },
            "triggers": ["atendimento", "suporte"],
            "active": true,
            "created_at": "2024-01-01T00:00:00.000000Z",
            "updated_at": "2024-01-01T00:00:00.000000Z"
        }
    ]
}

Criar Template

POST /v1/bot/template

Headers:

Header Valor Obrigatório
Authorization {seu-token} Sim
Content-Type application/json Sim

Parâmetros:

Parâmetro Tipo Descrição Obrigatório
name string Nome do template (max: 255) Sim
type string Tipo do template ("default" ou "ia") Sim
template object Configuração do template (obrigatório se type="default") Condicional
assistant_prompt string Prompt para IA (obrigatório se type="ia") Condicional
triggers array Palavras-chave que ativam o template Sim
instancia_id integer ID da instância do WhatsApp Sim

Estrutura do template:

{
    "questions": [
        {
            "id": number,         // ID único da questão
            "text": string,       // Texto da pergunta
            "timeout": number,    // Tempo limite em segundos (opcional)
            "responses": [
                {
                    "matches": string[],   // Palavras/números que ativam esta resposta
                    "action": {
                        "type": string,    // "text", "api", "nextQuestion" ou "executeTemplate"
                        "message": string,  // Para type "text"
                        "url": string,     // Para type "api"
                        "method": string,  // Para type "api"
                        "nextId": number,  // Para type "nextQuestion"
                        "templateId": number // Para type "executeTemplate"
                    }
                }
            ]
        }
    ]
}

Estrutura detalhada do template:

{
    "name": string,         // Nome do fluxo do bot (ex: "Menu Completo")
    "instancia_id": number, // ID da instância do WhatsApp
    "template": {
        "questions": [      // Array de perguntas/etapas do fluxo
            {
                "id": number,       // Identificador único da pergunta
                "text": string,     // Texto que será enviado ao usuário
                "timeout": number,  // (Opcional) Tempo limite em segundos
                "responses": [      // Array de possíveis respostas
                    {
                        "matches": string[],   // Array de palavras/frases que ativam esta resposta
                                             // Use "*" para aceitar qualquer resposta
                        "action": {           // Ação a ser executada quando houver match
                            "type": string,   // Tipo da ação:
                                            // - "text": Envia uma mensagem
                                            // - "nextQuestion": Vai para próxima pergunta
                                            // - "api": Faz uma chamada API
                                            // - "executeTemplate": Executa outro template

                            // Campos específicos por tipo de ação:
                            "message": string,      // Para type "text": mensagem a ser enviada
                            "nextQuestionId": number, // Para type "nextQuestion": ID da próxima pergunta
                            "blockChat": boolean,   // (Opcional) Bloqueia novas interações
                            "blockTimeout": number, // (Opcional) Tempo do bloqueio em segundos
                            "blockMessage": string, // (Opcional) Mensagem durante bloqueio
                            "expireMessage": string, // (Opcional) Mensagem ao expirar bloqueio
                            "storeAs": string,      // (Opcional) Salva resposta com este nome
                            "url": string,         // Para type "api": URL da API
                            "method": string,      // Para type "api": Método HTTP
                            "headers": object,     // Para type "api": Headers da requisição
                            "body": object,        // Para type "api": Corpo da requisição
                            "nextMessage": string  // Para type "api": Mensagem após chamada
                        }
                    }
                ]
            }
        ]
    },
    "triggers": string[],   // Palavras-chave que iniciam o fluxo
    "active": boolean      // Status de ativação do template
}

Variáveis disponíveis:

Variável Descrição
{current} Resposta atual do usuário
{phone} Número do telefone do usuário
{variavel_salva} Qualquer variável salva com storeAs

Curl exemplo (Template Default):

curl -X POST "https://api.apifacil.com/v1/bot/template" \
    -H "Authorization: {seu-token}" \
    -H "Content-Type: application/json" \
    -d '{
        "name": "Atendimento",
        "type": "default",
        "instancia_id": 1,
        "template": {
            "questions": [
                {
                    "id": 0,
                    "text": "Como posso ajudar?\n1 - Suporte\n2 - Vendas",
                    "timeout": 300,
                    "responses": [
                        {
                            "matches": ["1", "suporte"],
                            "action": {
                                "type": "text",
                                "message": "Você será atendido em breve"
                            }
                        }
                    ]
                }
            ]
        },
        "triggers": ["atendimento", "suporte", "ajuda"]
    }'

Curl exemplo (Template ia):

curl -X POST "https://api.apifacil.com/v1/bot/template" \
    -H "Authorization: {seu-token}" \
    -H "Content-Type: application/json" \
    -d '{
        "name": "Atendimento IA",
        "type": "IA",
        "instancia_id": 1,
        "assistant_prompt": "Você é um assistente de atendimento que deve responder de forma cordial e profissional...",
        "triggers": ["atendimento", "suporte"]
    }'

Curl exemplo:

curl -X POST "https://api.apifacil.com/v1/bot/template" \
    -H "Authorization: {seu-token}" \
    -H "Content-Type: application/json" \
    -d '{
        "name": "Atendimento",
        "instancia_id": 1,
        "template": {
            "questions": [
                {
                    "id": 0,
                    "text": "Como posso ajudar?\n1 - Suporte\n2 - Vendas",
                    "timeout": 300,
                    "responses": [
                        {
                            "matches": ["1", "suporte"],
                            "action": {
                                "type": "text",
                                "message": "Você será atendido em breve"
                            }
                        },
                        {
                            "matches": ["2", "vendas"],
                            "action": {
                                "type": "nextQuestion",
                                "nextId": 1
                            }
                        }
                    ]
                },
                {
                    "id": 1,
                    "text": "Qual produto você tem interesse?",
                    "responses": [
                        {
                            "matches": ["*"],
                            "action": {
                                "type": "api",
                                "url": "https://sua-api.com/vendas",
                                "method": "POST"
                            }
                        }
                    ]
                }
            ]
        },
        "triggers": ["atendimento", "suporte", "ajuda"]
    }'

Resposta:

{
    "error": false,
    "data": {
        "id": 1,
        "name": "Atendimento",
        "instancia_id": 1,
        "template": {...},
        "triggers": ["atendimento", "suporte", "ajuda"],
        "active": true,
        "created_at": "2024-01-01T00:00:00.000000Z",
        "updated_at": "2024-01-01T00:00:00.000000Z"
    }
}

Atualizar Template

PUT /v1/bot/template/{id}

Headers:

Header Valor Obrigatório
Authorization {seu-token} Sim
Content-Type application/json Sim

Parâmetros:

Parâmetro Tipo Descrição Obrigatório
name string Nome do template Não
template object Configuração do template Não
triggers array Palavras-chave Não
active boolean Status do template Não

Curl exemplo:

curl -X PUT "https://api.apifacil.com/v1/bot/template/1" \
    -H "Authorization: {seu-token}" \
    -H "Content-Type: application/json" \
    -d '{
        "name": "Atendimento Atualizado",
        "active": true,
        "triggers": ["atendimento", "suporte"]
    }'

Executar Template

POST /v1/bot/template/{id}/execute

Headers:

Header Valor Obrigatório
Authorization {seu-token} Sim
Content-Type application/json Sim

Parâmetros:

Parâmetro Tipo Descrição Obrigatório
phone string Número com DDI e DDD (ex: 5511999999999) Sim
instancia_id integer ID da instância do WhatsApp Sim

Curl exemplo:

curl -X POST "https://api.apifacil.com/v1/bot/template/1/execute" \
    -H "Authorization: {seu-token}" \
    -H "Content-Type: application/json" \
    -d '{
        "phone": "5511999999999",
        "instancia_id": 1
    }'

Deletar Template

DELETE /v1/bot/template/{id}

Headers:

Header Valor Obrigatório
Authorization {seu-token} Sim

Curl exemplo:

curl -X DELETE "https://api.apifacil.com/v1/bot/template/1" \
    -H "Authorization: {seu-token}"