WhatsApp (Web) - Em construção
Visão Geral
Este documento descreve as funcionalidades disponíveis para as integrações WhatsApp Web no sistema Omnichannel, incluindo exemplos de chamadas nos métodos disponíveis na lib.
1. Contatos
1.1 Criação de Contatos
- Atualmente, existem dois tipos de contatos: individuais e grupos. Ao cadastrar, o parâmetro
typedeve ser definido como 'individual' ou 'group', respectivamente. Visto que a implementação atual suporta apenas o WhatsApp, o parâmetrochannelTypedeve ser obrigatoriamente 'whatsapp'.
Exemplo:
import { ContactApi, CreateContactDto } from '@cirrus/omnichannel_api'
constructor(private readonly contactApi: ContactApi) {}
/**
* @param {string} clientIdentifier - Identificador único da conta.
* @param {string} channelId - Identificador do canal.
* @param {string} contactIdentifier - Contato do usuário (número de telefone, token (Telegram, etc).
* @param {string} name - Ordem em que os itens serão buscados (crescente ou decrescente).
* @param {string} type - Tipo do contato.
* @param {string} channelType - Tipo do canal.
* @param {string} customName - Nome customizado para o contato.
* @param {string} photo - Url da foto de perfil do contato no S3.
* @param {string[]} tagIds - Caso queira vincular tags ao um contato.
* @param {string} platform - Caso queira que o contato possua uma plataforma exclusiva.
* @param {boolean} isIgnored - Se 'true' o OMC não interceptará mensagens desse contato.
*/
const payload: CreateContactDto = {
clientIdentifier: '9a92ea44-244c-4cda-86be-6a9e32ba8f34',
channelId: '689a05215b711247e8f54022',
contactIdentifier: '5521999999999',
name: 'João Silva',
type: 'individual',
channelType: 'whatsapp',
customName: 'João (Mercearia)',
}
await this.contactApi.create(payload)
1.2 Edição de Contatos
- Edita um contato previamente cadastrado.
Exemplo:
import { ContactApi, UpdateContactDto } from '@cirrus/omnichannel_api'
constructor(private readonly contactApi: ContactApi) {}
/**
* @param {string} clientIdentifier - Identificador único da conta.
* @param {string} contactId - Identificador do contato.
* @param {string} customName - Nome customizado para o contato.
* @param {string} platform - Caso queira que o contato possua uma plataforma exclusiva.
* @param {string[]} tagIds - Caso queira vincular tags ao um contato.
* @param {string} contactIdentifier - Contato do usuário (número de telefone, token (Telegram, etc).
* @param {boolean} isIgnored - Se 'true' o OMC não interceptará mensagens desse contato.
*/
const payload: UpdateContactDto = {
clientIdentifier: '9a92ea44-244c-4cda-86be-6a9e32ba8f34',
contactId: '68e54649a3744412be5cc107',
customName: 'Nome Modificado',
platform: 'karoochatnew',
}
await this.contactApi.update(payload)
1.3 Listar Contato por Id
- Busca um contato de uma conta (
clientIdentifier) pelo seu identificador (contactId).
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Exemplo:
Listagem de contatos
import { ContactApiContactApi, GetContactDto } from '@cirrus/omnichannel_api'
constructor(private readonly contactApi: ContactApi) {}
/**
* @param {string} clientIdentifier - Identificador único da conta.
* @param {string} contactId - Identificador único do contato.
*/
const payload: GetContactDto = {
clientIdentifier: '9a92ea44-244c-4cda-86be-6a9e32ba8f34',
contactId: '68e54649a3744412be5cc107',
}
await this.contactApi.getById(payload)
1.4 Listar Contatos com Paginação
- Busca uma lista paginada de contatos com filtros opcionais.
Exemplo:
import { ContactApi, GetContactsDto } from '@cirrus/omnichannel_api'
constructor(private readonly contactApi: ContactApi) {}
/**
* @param {string} clientIdentifier - Identificador único da conta.
* @param {number} page - PáNúmero da página em(padrão: que a busca se iniciará1).
* @param {number} limit - Limite de itens por página.gina (padrão: 30).
* @param {'asc' | 'desc'}string} order - Ordem emde que os itens serãclassificação buscados (crescente'asc' ou decrescente)'desc').
* @param {'individual' | 'group'}string} type - Tipo dedo contato.contato ('individual' ou 'group').
* @param {'whatsapp' | 'facebook' | 'instagram' | 'telegram'}string} channelType - Tipo dedo canal.
* @param {string} name - NomeFiltro por nome do contato a ser buscado.contato.
* @param {string} contactIdentifier - ContatoFiltro quepor identificaidentificador umdo usuário (Número de telefone, token (Telegram), etc).contato.
* @param {string[]} tagIds - TagsFiltro vinculadaspor aoIDs contato.de tags associadas.
*/
exportconst interfacepayload: GetContactsDto = {
clientIdentifier: string;'9a92ea44-244c-4cda-86be-6a9e32ba8f34',
page: number;1,
limit: number;10,
order?: 'asc' |order: 'desc';,
type?:type: 'individual',
| 'group';
channelType?:channelType: 'whatsapp',
|name: 'facebook'João'
|}
const response = await this.contactApi.get(payload)
1.5 Remover Plataforma do Contato
- Remove a associação de plataforma de um contato específico.
Exemplo:
import { ContactApi, DeleteContactPlatformDto } from 'instagram' | 'telegram';
name?: string;
contactIdentifier?: string;
tagIds?: string[];
}@cirrus/omnichannel_api'
constructor(private readonly contactApi: ContactApi) {}
/**
* @param {string} clientIdentifier - Identificador único da conta.
* @param {string} contactId - Identificador único do contato.
*/
const payload: GetContactsDtoDeleteContactPlatformDto = {
clientIdentifier: '9a92ea44-244c-4cda-86be-6a9e32ba8f34',
contactId: '68e54649a3744412be5cc107'
}
await this.contactApi.get(deletePlatform(payload)Endpoint: POST /api/accounts/{clientIdentifier}/contacts
Exemplo de Payload:
{
"contactIdentifier": "5521988887777",
"name": "João Silva",
"channelId": "64cbbd9596429dbccd7841e2",
"channelType": "whatsapp",
"type": "individual",
"platform": "whatsappweb"
}
Resposta:
{
"_id": "64cbbd9596429dbccd7841e4",
"contactIdentifier": "5521988887777",
"name": "João Silva",
"channelId": "64cbbd9596429dbccd7841e2",
"channelType": "whatsapp",
"type": "individual",
"platform": "whatsappweb",
"createdAt": "2023-08-03T10:30:00.000Z"
}
1.26 ImportaçãoListar deTags Gruposdo Contato
Quando ocorre:
Webhook WhatsApp Web: POST /api/webhook/whatsappweb/{platformConfigId}/{channelId}
Exemplo de Payload (Grupo):Exemplo:
{
"type": "GROUP_MESSAGE",
"from": "5521988887777",
"fromUserName": "João Silva",
"to": "5521977776666-group",
"body":import { "content":ContactApi, "Olá pessoal!",
"type": "text"GetTagsByContactIdDto }, "groupInfo":from '@cirrus/omnichannel_api'
constructor(private readonly contactApi: ContactApi) {}
/**
* @param {string} clientIdentifier - Identificador único da conta.
* @param {string} contactId - Identificador único do contato.
*/
const payload: GetTagsByContactIdDto = {
"id":clientIdentifier: "5521977776666-group"'9a92ea44-244c-4cda-86be-6a9e32ba8f34',
"name":contactId: "Grupo'68e54649a3744412be5cc107'
de}
Vendas"const tags = await this.contactApi.getTagsByContacId(payload)
1.7 Adicionar Tags ao Contato
- Adiciona uma ou mais tags a um contato existente.
Exemplo:
import { ContactApi, AddContactTagDto } from '@cirrus/omnichannel_api'
constructor(private readonly contactApi: ContactApi) {}
/**
* @param {string} clientIdentifier - Identificador único da conta.
* @param {string} contactId - Identificador único do contato.
* @param {string[]} tagIds - Array com os IDs das tags a serem adicionadas.
*/
const payload: AddContactTagDto = {
clientIdentifier: '9a92ea44-244c-4cda-86be-6a9e32ba8f34',
"participants":contactId: '68e54649a3744412be5cc107',
tagIds: ["5521988887777"'tag1', "5521955554444"'tag2', 'tag3']
}
}const updatedContact = await this.contactApi.addTags(payload)
1.8 Remover Tags do Contato
- Remove uma ou mais tags de um contato existente.
Exemplo:
import { ContactApi, RemoveContactTagDto } from '@cirrus/omnichannel_api'
constructor(private readonly contactApi: ContactApi) {}
/**
* @param {string} clientIdentifier - Identificador único da conta.
* @param {string} contactId - Identificador único do contato.
* @param {string[]} tagIds - Array com os IDs das tags a serem removidas.
*/
const payload: RemoveContactTagDto = {
clientIdentifier: '9a92ea44-244c-4cda-86be-6a9e32ba8f34',
contactId: '68e54649a3744412be5cc107',
tagIds: ['tag1', 'tag2']
}
const updatedContact = await this.contactApi.removeTags(payload)
2. Mensagens Individuais
2.1 EnvioIniciar Conversa
- Inicia uma nova conversa com um contato. O campo companyId é obrigatório apenas quando o provedor é WhatsApp Web.
Exemplo:
import { MessageApi, StartConversationDto, MessageServiceEnum } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} platformConfigId - Identificador da configuração da plataforma.
* @param {string} channelId - Identificador do canal.
* @param {string} clientProviderId - Identificador do cliente no provedor (número de telefone, etc).
* @param {string} userName - Nome do usuário.
* @param {string} companyName - Nome da empresa (obrigatório apenas para WhatsApp Web).
* @param {string} platform - Plataforma específica.
* @param {boolean} sessionWithPriority - Se a sessão deve ter prioridade.
*/
const payload: StartConversationDto = {
platformConfigId: '64ef5c84f9deb1326965919f',
channelId: '64ef5c84f9deb1326965919e',
clientProviderId: '5521988887777',
userName: 'João Silva',
companyName: 'Empresa XYZ'
}
const response = await this.messageApi.startConversation(payload, MessageServiceEnum.d360)
2.2 Enviar Mensagem de Texto
- Envia uma mensagem de texto em uma conversa existente.
Endpoint: POST /api/message/send
WhatsApp Web:Exemplo:
import { "sessionId":MessageApi, "64cbbd9596429dbccd7841e5"SendMessageDto } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} agentName - Nome do agente que está enviando a mensagem.
* @param {string} sessionId - Identificador da sessão.
* @param {string} text - Texto da mensagem.
* @param {object} quotedMessage - Mensagem citada (opcional).
*/
const payload: SendMessageDto = {
agentName: 'Atendente João',
"text":sessionId: "'64ef5c85f9deb132696591a0',
text: 'Olá! Como posso ajudá-lo?"lo hoje?'
}
const response = await this.messageApi.sendMessage(payload)
2.3 Enviar Mensagem de Mídia
- Envia uma mensagem contendo mídia (imagem, vídeo, documento, etc).
Exemplo:
import { MessageApi, SendMessageDto } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} agentName - Nome do agente que está enviando a mensagem.
* @param {string} sessionId - Identificador da sessão.
* @param {string} mediaUri - URL da mídia a ser enviada.
*/
const payload: SendMessageDto = {
agentName: 'Atendente João',
"agentName":sessionId: "Atendente'64ef5c85f9deb132696591a0',
Maria"mediaUri: 'https://exemplo.com/imagem.jpg'
}
const response = await this.messageApi.sendMessage(payload)
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"text": "Olá! Como posso ajudá-lo?",
"agentName": "Atendente Maria"
}
Resposta:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"messageId": "wamid.HBgNNTUyMTk4ODg4Nzc3NxUCABIYFjNBMDJCMEE2RkY4QzRBOUNCNzAyRjAA"
}
2.2 Envio de Mensagem de Áudio
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/audio.mp3",
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/audio.ogg",
"agentName": "Atendente Maria"
}
2.3 Envio de Mensagem de Imagem
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/imagem.jpg",
"text": "Confira esta imagem!",
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/imagem.png",
"text": "Confira esta imagem!",
"agentName": "Atendente Maria"
}
2.4 Envio de Mensagem de Vídeo
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/video.mp4",
"text": "Vídeo explicativo",
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/video.mp4",
"text": "Vídeo explicativo",
"agentName": "Atendente Maria"
}
2.5 Envio de Mensagem de Documento
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/documento.pdf",
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/documento.pdf",
"agentName": "Atendente Maria"
}
2.6 Envio de Mensagem com Sticker
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/sticker.webp",
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/sticker.webp",
"agentName": "Atendente Maria"
}
2.7 Envio de Mensagem de Contatos
Endpoint: POST /api/message/send
D360 (Suporte nativo):
{
"sessionId": "64cbbd9596429dbccd7841e5",
"interactive": {
"type": "contacts",
"contacts": [
{
"name": {
"first_name": "João",
"last_name": "Silva",
"formatted_name": "João Silva"
},
"phones": [
{
"phone": "5521988887777",
"type": "WORK",
"wa_id": "5521988887777"
}
]
}
]
},
"agentName": "Atendente Maria"
}
WhatsApp Web (Texto formatado):
{
"sessionId": "64cbbd9596429dbccd7841e5",
"text": "Contato:\n👤 João Silva\n📱 (21) 98888-7777",
"agentName": "Atendente Maria"
}
3. Mensagens de Grupo
3.1 Envio de Mensagem de Texto em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"text": "Olá pessoal do grupo!",
"isGroupMesssage": true
}
3.2 Envio de Mensagem de Áudio em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"mediaUri": "https://s3.amazonaws.com/bucket/audio.mp3",
"isGroupMesssage": true
}
3.3 Envio de Mensagem de Imagem em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"mediaUri": "https://s3.amazonaws.com/bucket/imagem.jpg",
"text": "Imagem para o grupo",
"isGroupMesssage": true
}
3.4 Envio de Mensagem de Vídeo em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"mediaUri": "https://s3.amazonaws.com/bucket/video.mp4",
"text": "Vídeo para o grupo",
"isGroupMesssage": true
}
3.5 Envio de Mensagem de Documento em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"mediaUri": "https://s3.amazonaws.com/bucket/documento.pdf",
"isGroupMesssage": true
}
3.6 Envio de Mensagem com Sticker em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"mediaUri": "https://s3.amazonaws.com/bucket/sticker.webp",
"isGroupMesssage": true
}
3.7 Envio de Mensagem de Contatos em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"text": "Contato do suporte:\n👤 Maria Atendente\n📱 (21) 99999-8888",
"isGroupMesssage": true
}
4. Recursos Adicionais de Mensagem
4.1 Indicador de "Digitando"
WhatsApp Web:
Funcionalidade automática do WhatsApp WebNão requer chamada específica da API
D360:
Não suportado nativamentePode ser simulado com delay entre mensagens
4.2 Marcar Mensagem como Lida
Funcionalidade automática:
WhatsApp Web: Marca automaticamente como lida quando a mensagem é processadaD360: Status de leitura é enviado via webhook
Webhook de Status (D360):
{
"statuses": [
{
"id": "wamid.HBgNNTUyMTk4ODg4Nzc3NxUCABIYFjNBMDJCMEE2RkY4QzRBOUNCNzAyRjAA",
"status": "read",
"timestamp": "1659518400",
"recipient_id": "5521988887777"
}
]
}
4.3 Responder Mensagem (Quote)
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"text": "Respondendo à sua pergunta...",
"quotedMessage": {
"id": "message_id_original",
"message": "Qual o horário de funcionamento?"
},
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"text": "Respondendo à sua pergunta...",
"quotedMessage": {
"id": "wamid.HBgNNTUyMTk4ODg4Nzc3NxUCABIYFjNBMDJCMEE2RkY4QzRBOUNCNzAyRjAA"
},
"agentName": "Atendente Maria"
}
4.4 Mensagens Interativas (D360)
Botões:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"interactive": {
"type": "button",
"body": {
"text": "Escolha uma opção:"
},
"action": {
"buttons": [
{
"type": "reply",
"reply": {
"id": "opcao_1",
"title": "Opção 1"
}
},
{
"type": "reply",
"reply": {
"id": "opcao_2",
"title": "Opção 2"
}
}
]
}
},
"agentName": "Atendente Maria"
}
Lista:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"interactive": {
"type": "list",
"body": {
"text": "Selecione um departamento:"
},
"action": {
"button": "Ver opções",
"sections": [
{
"title": "Departamentos",
"rows": [
{
"id": "vendas",
"title": "Vendas",
"description": "Equipe de vendas"
},
{
"id": "suporte",
"title": "Suporte",
"description": "Suporte técnico"
}
]
}
]
}
},
"agentName": "Atendente Maria"
}
4.5 Templates (D360)
Iniciar Conversa com Template:
Endpoint: POST /api/message/start/d360
{
"to": "5521988887777",
"userName": "João Silva",
"companyName": "Alterdata",
"template": "contato_cliente",
"templateVariables": ["João Silva", "Alterdata"]
}
4.6 Deletar Mensagem
Endpoint: DELETE /api/message/{messageId}?senderId={senderId}&channelSlug={channelSlug}
WhatsApp Web:
DELETE /api/message/message_id_123?senderId=5521977776666&channelSlug=whatsappweb
D360:
DELETE /api/message/wamid.HBgNNTUyMTk4ODg4Nzc3NxUCABIYFjNBMDJCMEE2RkY4QzRBOUNCNzAyRjAA?senderId=5521977776666&channelSlug=d360
5. Webhooks de Recebimento
5.1 Webhook WhatsApp Web
URL: POST /api/webhook/whatsappweb/{platformConfigId}/{channelId}
Exemplo de Mensagem Recebida:
{
"type": "MESSAGE",
"from": "5521988887777",
"fromUserName": "João Silva",
"to": "web5521977776666",
"body": {
"content": "Olá, preciso de ajuda",
"type": "text"
},
"timestamp": 1659518400
}
5.2 Webhook D360
URL: POST /api/webhook/360dialog/{platformConfigId}/{channelId}
Exemplo de Mensagem Recebida:
{
"messages": [
{
"id": "wamid.HBgNNTUyMTk4ODg4Nzc3NxUCABIYFjNBMDJCMEE2RkY4QzRBOUNCNzAyRjAA",
"from": "5521988887777",
"type": "text",
"timestamp": "1659518400",
"text": {
"body": "Olá, preciso de ajuda"
}
}
],
"contacts": [
{
"profile": {
"name": "João Silva"
},
"wa_id": "5521988887777"
}
]
}
6. Gestão de Sessões
6.1 Obter Sessão
Endpoint: GET /api/session/{sessionId}
Resposta:
{
"_id": "64cbbd9596429dbccd7841e5",
"client": {
"name": "João Silva",
"providerId": "5521988887777"
},
"type": "whatsappweb",
"status": "active",
"createdAt": "2023-08-03T10:30:00.000Z"
}
6.2 Transferir Sessão
Endpoint: POST /api/session/transfer/{sessionId}
{
"params": {
"platformSlug": "crm",
"agentId": "agent_123"
},
"transferMessage": "Transferindo para o especialista..."
}
6.3 Finalizar Sessão
Endpoint: DELETE /api/session/finish/{sessionId}
Resposta:
{
"message": "Session finished successfully",
"sessionId": "64cbbd9596429dbccd7841e5"
}
7. Diferenças entre WhatsApp Web e D360
8. Códigos de Erro Comuns
8.1 WhatsApp Web
404: Número não encontrado no WhatsApp Web400: Conexão com WhatsApp Web fechada400: Número inválido
8.2 D360
401: Token de API inválido400: Formato de mensagem inválido429: Limite de taxa excedido500: Erro interno do D360
9. Configuração de Webhooks
9.1 WhatsApp Web
GET /{clientNumber}/setWebhook?url={webhookUrl}
9.2 D360
POST /configs/webhook
{
"url": "https://seu-dominio.com/api/webhook/360dialog/{platformConfigId}/{channelId}"
}
10. Monitoramento e Logs
10.1 Status de Conexão
WhatsApp Web:
GET /{clientNumber}/status
Resposta:
{
"status": "open",
"qr": null,
"battery": 85,
"plugged": true
}
10.2 Validação de Número
WhatsApp Web:
GET /{providerId}/validate/{contact}
Resposta:
{
"input": "5521988887777",
"isValid": true,
"jid": "5521988887777@c.us",
"lid": "5521988887777@lid",
"phone": "5521988887777"
}
Esta documentação cobre todas as funcionalidades principais das integrações WhatsApp Web e D360 disponíveis no sistema Omnichannel. Para implementações específicas ou dúvidas técnicas, consulte o código-fonte ou entre em contato com a equipe de desenvolvimento.