Download OpenAPI specification:
Documentação pública da Mais Chat API.
API REST para uso restrito a clientes da Mais Chat.
Todas as chamadas exigem o header authorization no formato:
authorization: Bearer {{tenantToken}}
Content-Type: application/json
O tenantToken é exclusivo do cliente e deve ser solicitado ao Suporte Mais Chat.
Sem esse header a API responderá 401 Unauthorized.
Todas as rotas da API possuem rate limit para garantir a estabilidade do serviço.
Para detalhes sobre limites específicos ou aumento de capacidade, entre em contato com o Suporte Mais Chat.
Além da API REST, a Mais Chat envia eventos HTTP para endpoints configurados pelos clientes. Webhooks são contratos de eventos recebidos pelo servidor do cliente; eles não representam rotas REST da API Mais Chat.
Cada entrega é um POST com Content-Type: application/json, headers padrão e corpo no envelope:
{
"event": "newProtocol",
"entry": {},
"timestamp": 1719320400000
}
Headers enviados:
X-Webhook-Event: nome do evento, igual ao campo event.X-Webhook-Delivery: UUID da tentativa de entrega.X-Webhook-Id: identificador do evento de origem, quando disponível, para idempotência.X-Webhook-Signature: assinatura HMAC-SHA256 quando o webhook possui secret.Quando há secret, o corpo bruto é assinado no formato sha256=HMAC_SHA256(secret, corpo_bruto).
A validação deve usar o corpo bruto recebido, antes do parse JSON.
O endpoint do cliente deve responder 2xx para confirmar o recebimento. Respostas 4xx indicam rejeição definitiva.
Respostas 5xx ou timeout são reprocessadas. Cada tentativa usa um novo X-Webhook-Delivery; o mesmo evento mantém
o mesmo X-Webhook-Id, quando disponível.
Retorna a lista de mensagens enviadas pela API através de um canal específico (appId) ou número de origem associado.
A rota suporta paginação e permite consultar o histórico de mensagens enviadas, incluindo metadados sobre o envio, status de entrega (ack), payload da requisição e resposta do provedor (ex: WhatsApp Cloud API).
Cada item retornado representa uma mensagem enviada pelo sistema, com dados completos sobre:
Limite de requisições (rate limit):
| mobile required | string Identificador do canal (appId) ou número do remetente configurado no broker. |
| limit | integer Default: 10 |
| offset | integer Default: 0 Example: offset=200 Número de registros a serem ignorados antes de iniciar a listagem. |
{- "status": true,
- "data": [
- {
- "_id": "abc1234567890fakeid",
- "type": "wppCloudAPI",
- "from": "55999998888",
- "to": "5541999887766",
- "message": "Olá João, seu pedido #12345 foi confirmado!",
- "ack": "2",
- "ackLog": [
- {
- "ack": "1",
- "createdAt": "2025-09-23T10:00:00.000Z"
}, - {
- "ack": "2",
- "createdAt": "2025-09-23T10:01:10.000Z"
}
], - "components": [
- {
- "type": "BODY",
- "text": "Olá João, seu pedido #12345 foi confirmado!"
}, - {
- "type": "FOOTER",
- "text": "Obrigado por comprar conosco!"
}, - {
- "type": "BUTTONS",
- "buttons": [
- {
- "type": "text",
- "text": "Ver detalhes",
- "sub_type": "url",
- "index": "0",
- "buttonText": "Acompanhar pedido",
}
]
}
], - "payload": {
- "request": {
- "type": "apiTemplate",
- "broker": "wppCloudAPI",
- "appId": "111111111111111",
- "source": "55999998888",
- "destination": "5541999887766",
- "template": {
- "name": "pedido_confirmado",
- "language": "pt_BR",
- "components": [
- {
- "type": "body",
- "parameters": [
- {
- "type": "text",
- "text": "12345"
}
]
}
]
}
}, - "response": {
- "messaging_product": "whatsapp",
- "contacts": [
- {
- "input": "5541999887766",
- "wa_id": "5541999887766"
}
], - "messages": [
- {
- "id": "wamid.fakeMessageId123",
- "message_status": "accepted"
}
]
}
}, - "tenant": {
- "_id": "fakeTenantId123",
- "name": "Loja Exemplo",
- "id": "fakeTenantId123"
}, - "createdAt": "2025-09-23T10:00:00.000Z",
- "updatedAt": "2025-09-23T10:01:10.000Z"
}
]
}Retorna a lista de mensagens enviadas pela API através do número de destino.
Limite de requisições (rate limit):
| destination required | string |
| limit | integer Default: 10 |
| offset | integer Default: 0 Example: offset=200 Número de registros a serem ignorados antes de iniciar a listagem. |
{- "status": true,
- "data": { }
}Retorna a lista de templates cadastrados na Meta.
appId via query para filtrar os templates do aplicativo específico (requisito da Meta).{{1}}, {{2}} etc).Limite de requisições (rate limit):
| broker required | string Value: "wppCloudAPI" |
| appId required | string Example: appId=123456789012345 Identificador do aplicativo na Meta Cloud API. Obrigatório quando |
{- "status": true,
- "data": [
- {
- "name": "saudacao",
- "parameter_format": "POSITIONAL",
- "components": [
- {
- "type": "BODY",
- "text": "Olá {{1}}, me chamo {{2}} da Mais Chat.",
- "example": {
- "body_text": [
- [
- "João",
- "Maria"
]
]
}
}
], - "language": "pt_BR",
- "status": "APPROVED",
- "category": "MARKETING",
- "id": "1511471309205472"
}
]
}Envia uma mensagem de template (mensagem pré-aprovada pela Meta/WhatsApp)
pelo broker Meta Cloud API. Templates são usados para iniciar ou retomar
conversas fora da janela de 24h e para comunicações padronizadas (notificações,
alertas, confirmações etc.). A propriedade template deve seguir
obrigatoriamente o formato e as regras da documentação oficial da Meta:
https://developers.facebook.com/docs/whatsapp/cloud-api/guides/send-message-templates.
Apenas templates previamente aprovados e ativos podem ser utilizados.
Limite de requisições (rate limit):
| broker required | string Value: "wppCloudAPI" |
| type required | string Value: "apiTemplate" Tipo de operação; para Meta Cloud use sempre |
| broker required | string Value: "wppCloudAPI" Broker de envio; atualmente suportado: |
| appId required | string Phone Number ID do seu canal (número do WhatsApp Business na Meta). |
| source required | string Número do remetente (seu canal) em formato E.164 (ex.: 5511999991234). |
| destination required | string Número do destinatário em formato E.164 (ex.: 5511912341234). |
| token required | string Token do Graph API (Meta Cloud) com permissões para envio. |
required | object Dados do template conforme a documentação oficial da Meta: https://developers.facebook.com/docs/whatsapp/cloud-api/guides/send-message-templates. Deve referenciar um template aprovado e ativo na sua conta WhatsApp Business. Campos mínimos: - |
{- "type": "apiTemplate",
- "broker": "wppCloudAPI",
- "appId": "317774448096214",
- "source": "5511999991234",
- "destination": "5511912341234",
- "token": "EAA...",
- "template": {
- "name": "flow_meta_2",
- "language": "pt_BR",
- "components": [
- {
- "type": "header",
}, - {
- "type": "body",
- "parameters": [
- {
- "type": "text",
- "text": "João"
}
]
}, - {
- "type": "button",
- "sub_type": "flow",
- "index": "0",
- "parameters": [
- {
- "type": "action",
- "action": {
- "flow_token": "{\"flowId\": 3293039314163350}"
}
}
]
}
]
}
}{- "status": true,
- "data": {
- "messaging_product": "whatsapp",
- "contacts": [
- {
- "input": "5511912341234",
- "wa_id": "5511912341234"
}
], - "messages": [
- {
- "id": "wamid.HBgMNTU0ODg4MTU2NTg2FQIAERgSQjQ3MzM1QUZGRDlDMkQxNTkyAA==",
- "message_status": "accepted"
}
], - "msgId": "66be3b896671d540a47be362"
}
}Retorna a lista de brokers configurados na plataforma, incluindo dados técnicos e de identificação necessários para integração com os canais de mensagens.
Limite de requisições (rate limit):
{- "status": true,
- "data": [
- {
- "version": null,
- "_id": "65eb2a5529408895f2afc3da",
- "broker": "wppCloudAPI",
- "name": "Exemplo - Cloud",
- "app": "Exemplo Tecnologia",
- "appId": "234057352740299",
- "wabaId": "267173379104556",
- "number": "5511912341234",
- "token": "EAA..."
}
]
}Retorna uma lista de contatos cadastrados na plataforma.
A listagem pode ser paginada com limit e offset, e filtrada pelo período de criação/atualização
utilizando startTime e endTime.
Observações:
limit possui limite máximo de 1000 registros por requisição.count (quantidade retornada) e countTotal (quantidade total de registros no banco).Limite de requisições (rate limit):
| limit | integer <= 1000 Default: 100 Número máximo de contatos a serem retornados por requisição (máx. 1000). |
| offset | integer Default: 0 Example: offset=200 Número de registros a serem ignorados antes de iniciar a listagem. |
| startTime | string <date> Example: startTime=2023-03-01 Data inicial de cadastro do contato. |
| endTime | string <date> Example: endTime=2024-03-31 Data final de cadastro do contato. |
{- "status": true,
- "data": [
- {
- "linked": [ ],
- "externalCode": null,
- "countryCode": "55",
- "tags": [
- {
- "_id": "5f91c4a9fccea6157cf2f",
- "tag": "NOVO"
}, - {
- "_id": "5f1e829f48cb380741e5cecd",
- "tag": "LEAD"
}
], - "_id": "68d215cd92eeb37882463a09",
- "name": "Pedro Augusto",
- "celular": "11912341234",
- "notes": [
- {
- "_id": "68d215cd79eeb3278d461a01",
- "type": "text",
- "date": "2025-09-23T03:36:45.124Z",
- "text": "<div><b>Contato cadastrado automaticamente</b></div><p>Este contato foi cadastrado automaticamente pelo canal WhatsApp Business.</p>"
}
], - "createdAt": "2025-09-23T03:36:45.138Z",
- "updatedAt": "2025-09-23T03:36:45.625Z",
- "address": [ ],
- "id": "68d2895cd79eeb37222425a03"
}
], - "count": 100,
- "countTotal": 29034
}Cria um novo contato na plataforma.
Detalhes:
name e type.email deve ser válido quando informado.tags devem conter IDs válidos de tags previamente cadastradas.Limite de requisições (rate limit):
Observações adicionais:
409.StandardResponse, com o objeto criado em data.| name required | string |
| type required | string PF/PJ (case-insensitive) |
| cpf | string |
| celular | string |
| telefoneFixo | string |
string <email> | |
| departamento | string |
| funcao | string |
Array of objects | |
| tags | Array of strings |
{- "name": "Fulana 5 de Tal",
- "type": "pf",
- "cpf": "813.844.599-87",
- "celular": "48 98888-9999",
- "telefoneFixo": "+34 654232147",
- "departamento": "Dep Teste",
- "funcao": "Função teste",
- "notes": [
- {
- "type": "text",
- "text": "Cadastro automático via formulário"
}, - {
- "type": "text",
- "text": "Modelo de interesse xxxx"
}
], - "tags": [
- "5e42ab48a61cfa56d01c508e",
- "60c0cd228e0e1d4a5d68d26a"
]
}{- "status": true,
- "data": { }
}Atualiza parcial de um contato existente. Todos os campos são opcionais.
Se o campo name for enviado, ele não pode ser vazio.
Se o campo tags for enviado, deve conter um array com IDs válidos de tags. E tais tags serão adicionadas ao contato (não substituem as existentes).
Limite de requisições (rate limit):
| id required | string |
| name | string non-empty |
| type | string PF/PJ (case-insensitive) |
| cpf | string |
| celular | string |
| telefoneFixo | string |
string <email> | |
| departamento | string |
| funcao | string |
Array of objects | |
| tags | Array of strings |
{- "name": "Fulana de Tal (atualizado)",
- "notes": [
- {
- "type": "text",
- "text": "Ajuste de cadastro pelo time comercial"
}
], - "tags": [
- "60c0cd228e0e1d4a5d68d26a"
]
}{- "status": true,
- "data": { }
}Remove tags de um contato existente.
Limite de requisições (rate limit):
| id required | string |
| tags required | Array of strings |
{- "tags": [
- "60c0cd228e0e1d4a5d68d26a"
]
}{- "status": true,
- "data": { }
}Retorna dados do contado onde a busca é pelo número de celular.
Limite de requisições (rate limit):
| cellphone required | string |
{- "status": true,
- "data": { }
}Retorna lista de protocolos.
Limite de requisições (rate limit):
| limit | integer Default: 10 |
| offset | integer Default: 0 Example: offset=200 Número de registros a serem ignorados antes de iniciar a listagem. |
| state | string Enum: "open" "closed" Filtrar por estado do protocolo |
| startTime | string <date> Example: startTime=2023-03-01 Data inicial de cadastro do contato. |
| endTime | string <date> Example: endTime=2024-03-31 Data final de cadastro do contato. |
{- "status": true,
- "data": { }
}Retorna os dados de um protocolo e a lista de mensagens relacionadas. Use este endpoint para inspecionar o histórico de atendimento (bot e humano), filas, tags e motivos de encerramento.
Limite de requisições (rate limit):
Observações:
messages é retornado em ordem cronológica crescente (mais antigo → mais recente).| protocolNumber required | string Example: 17585415876230366 Número do protocolo (string numérica gerada pelo sistema). |
{- "status": true,
- "data": {
- "_id": "6ab13713fab6bcd272025a00",
- "channel": "web",
- "channelNumber": null,
- "chatId": null,
- "protocol_number": "17585415876230366",
- "attendant": {
- "_id": "6ab198a96054aa45422ba100",
- "name": "Ana Souza"
}, - "contact": {
- "_id": "6aa214678ff52271edc7ce01",
- "name": "João Pereira",
- "address": null
}, - "human": true,
- "receptive": true,
- "tags": [
- {
- "_id": "659feb1f49c7f81ec701de01",
- "tag": "SUPORTE - APP WEB"
}
], - "queue": {
- "_id": "60d0f2a53c9b6c57b6d37301",
- "name": "SAC",
- "description": "Fila de atendimento geral"
}, - "state_protocol": "closed",
- "countMessages": 10,
- "messages": [
- {
- "id": "6ab13713fab6bc4eb0025a01",
- "ack": null,
- "ackLog": [ ],
- "hasQuotedMsg": false,
- "human": false,
- "template": false,
- "wppId": null,
- "direction": "incoming",
- "message_type": "text",
- "createdAt": "2025-09-22T11:46:27.639Z",
- "message": "Olá, bom dia!"
}, - {
- "id": "6ab13713fab6bc2dd6025a02",
- "ack": "2",
- "ackLog": [ ],
- "hasQuotedMsg": false,
- "human": false,
- "template": false,
- "wppId": null,
- "direction": "outgoing",
- "message_type": "text",
- "createdAt": "2025-09-22T11:46:27.703Z",
- "message": "Para agilizar, descreva o assunto e aguarde um atendente, por favor."
}, - {
- "id": "6ab13713fab6bcb968025a03",
- "ack": "0",
- "ackLog": [ ],
- "hasQuotedMsg": false,
- "human": false,
- "template": false,
- "wppId": null,
- "direction": "outgoing",
- "message_type": "note",
- "createdAt": "2025-09-22T11:46:27.741Z",
- "message": "Direcionado pelo bot para a fila: SAC."
}, - {
- "id": "6ab1371d5ce68b0e5dc37004",
- "ack": null,
- "ackLog": [ ],
- "hasQuotedMsg": false,
- "human": true,
- "template": false,
- "wppId": null,
- "direction": "incoming",
- "message_type": "text",
- "createdAt": "2025-09-22T11:46:37.694Z",
- "message": "Preciso de ajuda para criar um novo template."
}, - {
- "id": "6ab13787d2a9b395fe6b9f05",
- "ack": "0",
- "ackLog": [ ],
- "hasQuotedMsg": false,
- "human": true,
- "template": false,
- "wppId": null,
- "direction": "outgoing",
- "message_type": "note",
- "createdAt": "2025-09-22T11:48:23.125Z",
- "message": "Protocolo assumido pela agente Ana Souza."
}, - {
- "id": "6ab137eb0fc4693df670ef06",
- "ack": "1",
- "ackLog": [ ],
- "hasQuotedMsg": false,
- "human": true,
- "template": false,
- "wppId": null,
- "direction": "outgoing",
- "message_type": "text",
- "createdAt": "2025-09-22T11:50:03.755Z",
- "message": "Bom dia! Vou verificar para você."
}, - {
- "id": "6ab137ee6f0f41e2285c9507",
- "ack": "1",
- "ackLog": [ ],
- "hasQuotedMsg": false,
- "human": true,
- "template": false,
- "wppId": null,
- "direction": "outgoing",
- "message_type": "text",
- "createdAt": "2025-09-22T11:50:06.899Z",
- "message": "Um instante, por gentileza."
}, - {
- "id": "6ab1388bf9d6cc5a4a4acf08",
- "ack": null,
- "ackLog": [ ],
- "hasQuotedMsg": false,
- "human": true,
- "template": false,
- "wppId": null,
- "direction": "incoming",
- "message_type": "text",
- "createdAt": "2025-09-22T11:52:43.130Z",
- "message": "Enviei os detalhes por e-mail."
}, - {
- "id": "6ab13b7c17e7d5411fd5b009",
- "ack": "1",
- "ackLog": [ ],
- "hasQuotedMsg": false,
- "human": true,
- "template": false,
- "wppId": null,
- "direction": "outgoing",
- "message_type": "text",
- "createdAt": "2025-09-22T12:05:16.628Z",
- "message": "Template criado e ativo. Qualquer ajuste, me avise."
}, - {
- "id": "6ab18ac38291321c7490400a",
- "ack": "0",
- "ackLog": [ ],
- "hasQuotedMsg": false,
- "human": true,
- "template": false,
- "wppId": null,
- "direction": "outgoing",
- "message_type": "note",
- "createdAt": "2025-09-22T17:43:31.311Z",
- "message": "Protocolo encerrado pela agente Ana Souza."
}
], - "reason": {
- "protocolReason": {
- "reasonParent": null,
- "reasonNote": "",
- "_id": "6ab18ac3be4c840257583caa",
- "reasonName": "Resolvido"
}, - "reason": "660d2ef2eca7d763c325abdb",
- "motive": null
}, - "createdAt": "2025-09-22T11:46:27.628Z",
- "humanDate": "2025-09-22T11:46:27.698Z",
- "queueDate": "2025-09-22T11:46:27.698Z",
- "attendanceDate": "2025-09-22T11:48:19.962Z",
- "closeDate": "2025-09-22T17:43:31.270Z"
}
}Retorna protocolos abertos onde o número alvo é o número de WhatsApp usado na conversa.
Limite de requisições (rate limit):
| phoneNumber required | string |
{- "status": true,
- "data": { }
}Retorna a lista de boards do tenant autenticado.
Limite de requisições (rate limit):
| limit | integer Default: 10 |
| offset | integer Default: 0 Example: offset=200 Número de registros a serem ignorados antes de iniciar a listagem. |
| closed | boolean Filtrar boards abertos/fechados. |
| state | string Filtrar por estado do board. |
| name | string Filtrar por nome com busca parcial. |
{- "status": true,
- "data": [
- {
- "_id": "67c8b1f0f31a2b0012345801",
- "name": "Operacao Comercial",
- "description": "Board para acompanhar o funil comercial",
- "closed": false,
- "state": "ABERTO",
- "prefs": {
- "permissionLevel": "private"
}, - "tenant": "67c89ffaf31a2b0012345600",
- "createdAt": "2026-03-10T13:00:00.000Z",
- "updatedAt": "2026-03-10T13:00:00.000Z"
}
], - "count": 1,
- "countTotal": 1
}Cria um novo board para o tenant autenticado.
Limite de requisições (rate limit):
| name required | string [ 3 .. 120 ] characters |
| description | string <= 500 characters |
| closed | boolean |
| state | string |
object | |
| members | Array of strings |
Array of objects | |
| tags | Array of strings |
| createdUser | string |
| updatedUser | string |
{- "name": "Operacao Comercial",
- "description": "Board para acompanhar o funil comercial",
- "state": "ABERTO",
- "prefs": {
- "permissionLevel": "private"
}, - "members": [
- "67c8a5d4f31a2b0012345678"
], - "memberships": [
- {
- "idMember": "67c8a5d4f31a2b0012345678",
- "memberType": "admin"
}
], - "tags": [
- "67c8a7b4f31a2b0012345699"
], - "createdUser": "67c8a5d4f31a2b0012345678"
}{- "status": true,
- "data": { }
}Atualiza parcialmente um board existente.
Limite de requisições (rate limit):
| id required | string |
| name | string [ 3 .. 120 ] characters |
| description | string <= 500 characters |
| closed | boolean |
| state | string |
object | |
| members | Array of strings |
Array of objects | |
| tags | Array of strings |
| updatedUser | string |
| closedUser | string |
| closedAt | string <date-time> |
{- "name": "Operacao Comercial BR",
- "description": "Board atualizado para o time Brasil",
- "updatedUser": "67c8a5d4f31a2b0012345678",
- "tags": [
- "67c8a7b4f31a2b0012345699",
- "67c8a7b4f31a2b0012345700"
]
}{- "status": true,
- "data": { }
}Retorna as taskLists do tenant autenticado, sempre filtradas por board.
Limite de requisições (rate limit):
| limit | integer Default: 10 |
| offset | integer Default: 0 Example: offset=200 Número de registros a serem ignorados antes de iniciar a listagem. |
| board required | string ID do board dono das taskLists. |
| closed | boolean Filtrar taskLists abertas/fechadas. |
| name | string Filtrar por nome com busca parcial. |
{- "status": true,
- "data": [
- {
- "_id": "67c8b2b8f31a2b0012345802",
- "name": "Novos Leads",
- "position": 0,
- "closed": false,
- "board": {
- "_id": "67c8b1f0f31a2b0012345801",
- "name": "Operacao Comercial"
}, - "tenant": "67c89ffaf31a2b0012345600",
- "createdAt": "2026-03-10T13:10:00.000Z",
- "updatedAt": "2026-03-10T13:10:00.000Z"
}
], - "count": 1,
- "countTotal": 1
}Cria uma nova taskList vinculada a um board.
Se position não for enviada, a API usa a maior posição atual do board e soma +1.
Limite de requisições (rate limit):
| name required | string [ 2 .. 120 ] characters |
| board required | string |
| position | integer >= 0 |
| closed | boolean |
| createdUser | string |
| updatedUser | string |
{- "name": "Novos Leads",
- "board": "67c8b1f0f31a2b0012345801",
- "createdUser": "67c8a5d4f31a2b0012345678"
}{- "status": true,
- "data": { }
}Atualiza parcialmente uma taskList existente.
Limite de requisições (rate limit):
| id required | string |
| name | string [ 2 .. 120 ] characters |
| board | string |
| position | integer >= 0 |
| closed | boolean |
| updatedUser | string |
{- "name": "Leads Qualificados",
- "board": "67c8b1f0f31a2b0012345801",
- "position": 1,
- "updatedUser": "67c8a5d4f31a2b0012345678"
}{- "status": true,
- "data": { }
}Retorna as tasks do tenant autenticado, sempre filtradas por list.
Limite de requisições (rate limit):
| limit | integer Default: 10 |
| offset | integer Default: 0 Example: offset=200 Número de registros a serem ignorados antes de iniciar a listagem. |
| list required | string ID da taskList dona das tasks. |
| protocol | string |
| contact | string |
| state | string |
| status | string |
| closed | boolean |
| title | string Filtrar por título com busca parcial. |
{- "status": true,
- "data": [
- {
- "_id": "67c8b4f4f31a2b0012345805",
- "title": "Entrar em contato com cliente premium",
- "description": "Priorizar contato via WhatsApp no inicio da tarde",
- "position": 0,
- "priority": "Alta",
- "status": "open",
- "state": "ABERTO",
- "closed": false,
- "deadline": "2026-03-20T21:00:00.000Z",
- "board": {
- "_id": "67c8b1f0f31a2b0012345801",
- "name": "Operacao Comercial"
}, - "list": {
- "_id": "67c8b2b8f31a2b0012345802",
- "name": "Novos Leads"
}, - "createdAt": "2026-03-10T13:20:00.000Z",
- "updatedAt": "2026-03-10T13:20:00.000Z"
}
], - "count": 1,
- "countTotal": 1
}Cria uma nova task vinculada a uma taskList e ao board correspondente.
Se position não for enviada, a API usa a maior posição atual da taskList e soma +1.
Validações adicionais:
deadline, quando enviada, deve conter uma data válida.deadline aceita YYYY-MM-DD ou date-time em ISO 8601.deadline: null remove o valor atual.Limite de requisições (rate limit):
| title required | string [ 3 .. 160 ] characters |
| description | string <= 2000 characters |
| board required | string |
| list required | string |
| position | integer >= 0 |
| state | string |
| status | string |
| closed | boolean |
| priority | string Enum: "Baixa" "Média" "Alta" "Crítica" |
string or string or null (TaskDeadlineField) | |
| protocol | string or null |
| contact | string or null |
| companies | Array of strings |
| tags | Array of strings |
| responsible | string or null |
| participants | Array of strings |
Array of objects (TaskNote) | |
| closeBoard | boolean |
| createdUser | string |
| updatedUser | string |
{- "title": "Entrar em contato com cliente premium",
- "description": "Priorizar contato via WhatsApp no inicio da tarde",
- "board": "67c8b1f0f31a2b0012345801",
- "list": "67c8b2b8f31a2b0012345802",
- "priority": "Alta",
- "status": "open",
- "state": "ABERTO",
- "contact": "67c8b3def31a2b0012345803",
- "protocol": "67c8b45af31a2b0012345804",
- "responsible": "67c8a5d4f31a2b0012345678",
- "participants": [
- "67c8a5d4f31a2b0012345678"
], - "tags": [
- "67c8a7b4f31a2b0012345699"
], - "notes": [
- {
- "note": "Cliente aguardando proposta comercial",
- "createdUser": "67c8a5d4f31a2b0012345678"
}
], - "deadline": "2026-03-20",
- "createdUser": "67c8a5d4f31a2b0012345678"
}{- "status": true,
- "data": { }
}Atualiza parcialmente uma task existente.
Validações adicionais:
deadline, quando enviada, deve conter uma data válida.deadline aceita YYYY-MM-DD, date-time ISO 8601, null ou string vazia para limpeza.Limite de requisições (rate limit):
| id required | string |
| title | string [ 3 .. 160 ] characters |
| description | string <= 2000 characters |
| board | string |
| list | string |
| position | integer >= 0 |
| state | string |
| status | string |
| closed | boolean |
| priority | string Enum: "Baixa" "Média" "Alta" "Crítica" |
string or string or string or null Aceita | |
| protocol | string or null |
| contact | string or null |
| companies | Array of strings |
| tags | Array of strings |
| responsible | string or null |
| participants | Array of strings |
Array of objects (TaskNote) | |
| closeBoard | boolean |
| updatedUser | string |
| closedUser | string |
| closedAt | string <date-time> |
{- "title": "Retornar cliente premium",
- "description": "Contato reagendado para o fim da tarde",
- "board": "67c8b1f0f31a2b0012345801",
- "list": "67c8b2b8f31a2b0012345802",
- "position": 2,
- "priority": "Crítica",
- "deadline": "2026-03-20T18:00:00.000Z",
- "updatedUser": "67c8a61ef31a2b0012345680"
}{- "status": true,
- "data": { }
}Retorna lista de usuários cadastrados.
Limite de requisições (rate limit):
| limit | integer <= 1000 Default: 10 Máximo 1000 (default 10). Ordenação por nome asc. |
| offset | integer Default: 0 Registros a pular |
| ativo | boolean Filtrar por status (true/false) |
{- "status": true,
- "data": { }
}Esta rota retorna métricas de uso da API em nível de tenant, rota ou identidade. É possível filtrar por período (dia/mês), intervalo de datas, rotas, status HTTP, método de requisição e tipo de identidade.
Limite de requisições (rate limit):
| period required | string Enum: "day" "month" Example: period=month |
| start required | string <date> Example: start=2025-09-01 Data inicial (AAAA-MM-DD) |
| end required | string <date> Example: end=2025-09-30 Data final (AAAA-MM-DD) |
| routeContains | string Example: routeContains=/msg/template |
| statusClass | string Enum: "2xx" "4xx" "5xx" Example: statusClass=2xx |
| identityType | string Example: identityType=tenant |
| identityValue | string Example: identityValue=5deab0f9b7a6ac4236b5a179 |
| method | string Enum: "GET" "POST" "PATCH" Example: method=POST |
| sort | string Example: sort=countTotal:-1 |
| page | integer Default: 1 Example: page=1 |
| limit | integer Default: 20 Example: limit=20 |
{- "meta": {
- "page": 1,
- "limit": 20,
- "totalItems": 7,
- "totalPages": 1,
- "hasNext": false,
- "hasPrev": false,
- "sort": {
- "countTotal": -1
}
}, - "filters": {
- "period": "month",
- "startKey": "202509",
- "endKey": "202509",
- "tenant": "",
- "identityType": null,
- "identityValue": null,
- "routeId": null,
- "routeContains": null,
- "method": null,
- "statusClass": null,
- "minCount": 0
}, - "totals": {
- "countTotal": 1988,
- "count2xx": 1887,
- "count4xx": 98,
- "count5xx": 1,
- "countRateLimited": 0,
- "sumDurMs": 2075522,
- "avgDurMs": 1044
}, - "data": [
- {
- "_id": "68b56dede86f53954c04eb43",
- "identityType": "tenant",
- "identityValue": "5deab0f9b7a6ac4236b5a179",
- "key": "202509",
- "method": "POST",
- "period": "month",
- "routeId": "POST:/v2/msg/template/:broker",
- "tenant": "5deab0f9b7a6ac4236b5a179",
- "count2xx": 1690,
- "count4xx": 0,
- "count5xx": 0,
- "countRateLimited": 0,
- "countTotal": 1690,
- "avgDurMs": 873,
- "sumDurMs": 1475115,
- "createdAt": "2025-09-01T09:57:01.076Z",
- "updatedAt": "2025-09-23T11:33:17.046Z"
}
]
}Contratos dos eventos HTTP enviados pela Mais Chat para endpoints configurados pelos clientes.
Webhooks são enviados para endpoints HTTP configurados pelo cliente. Cada entrega é um POST com corpo JSON
no envelope padrão:
{
"event": "newProtocol",
"entry": {},
"timestamp": 1719320400000
}
Campos do envelope:
event: nome do evento enviado.entry: conteúdo específico do evento.timestamp: epoch em milissegundos do momento de montagem do envelope.Headers padrão:
Content-Type: sempre application/json.X-Webhook-Event: nome do evento enviado.X-Webhook-Delivery: UUID da tentativa de entrega.X-Webhook-Id: identificador do evento de origem, quando disponível, para idempotência.X-Webhook-Signature: assinatura HMAC-SHA256 quando há secret.Retry e idempotência:
2xx para confirmar recebimento.4xx indicam rejeição definitiva e não são reprocessadas.5xx ou timeout são reprocessadas.X-Webhook-Delivery.X-Webhook-Id, quando disponível.X-Webhook-Id como chave de idempotência.Eventos disponíveis:
newProtocol, closedProtocol, queueProtocol, transferProtocol, tagsProtocol.newContact, updateContact.validacao, edicao.Evento enviado quando um protocolo é aberto.
| X-Webhook-Event required | string Enum: "newProtocol" "closedProtocol" "queueProtocol" "transferProtocol" "tagsProtocol" "newContact" "updateContact" "validacao" "edicao" Nome do evento enviado, igual ao campo |
| X-Webhook-Delivery required | string <uuid> UUID da tentativa de entrega. Cada retry recebe um novo valor. |
| X-Webhook-Id | string Identificador do evento de origem, quando disponível. Use como chave de idempotência. |
| X-Webhook-Signature | string^sha256=.+$ Assinatura |
Envelope JSON do evento newProtocol.
| event required | string Nome do evento enviado. Value: "newProtocol" |
required | object Conteúdo específico do evento. |
| timestamp required | integer <int64> Epoch em milissegundos do momento de montagem do envelope. |
{- "event": "newProtocol",
- "entry": {
- "protocolId": "6657a1f2c3d4e5f6a7b8c9d0",
- "protocol_number": "2024062500001",
- "channel": "wpp",
- "channelNumber": "5511999998888",
- "attendant": {
- "_id": "6650aa00bb11cc22dd33ee44",
- "name": "Maria Atendente"
}, - "contact": {
- "_id": "6651bb11cc22dd33ee44ff55",
- "name": "João Cliente",
- "messengerId": null,
- "instagramId": null,
- "address": {
- "cep": "01310100",
- "logradouro": "Av. Paulista",
- "numero": "1000",
- "complemento": "Conj. 101",
- "bairro": "Bela Vista",
- "cidade": "São Paulo",
- "estado": "SP",
- "pais": "BR"
}
}, - "human": true,
- "receptive": true,
- "tags": [
- {
- "_id": "6652cc22dd33ee44ff556600",
- "tag": "VIP"
}
], - "queue": {
- "_id": "6653dd33ee44ff5566001122",
- "name": "Suporte",
- "description": "Fila de suporte técnico"
}, - "state_protocol": "open",
- "createdAt": "2024-06-25T12:00:00.000Z",
- "humanDate": "2024-06-25T12:00:30.000Z",
- "queueDate": "2024-06-25T12:00:05.000Z",
- "attendanceDate": "2024-06-25T12:01:00.000Z"
}, - "timestamp": 1719320460000
}Evento enviado quando um protocolo entra em uma fila. Usa o mesmo formato de entry de newProtocol.
| X-Webhook-Event required | string Enum: "newProtocol" "closedProtocol" "queueProtocol" "transferProtocol" "tagsProtocol" "newContact" "updateContact" "validacao" "edicao" Nome do evento enviado, igual ao campo |
| X-Webhook-Delivery required | string <uuid> UUID da tentativa de entrega. Cada retry recebe um novo valor. |
| X-Webhook-Id | string Identificador do evento de origem, quando disponível. Use como chave de idempotência. |
| X-Webhook-Signature | string^sha256=.+$ Assinatura |
Envelope JSON do evento queueProtocol.
| event required | string Nome do evento enviado. Value: "queueProtocol" |
required | object Conteúdo específico do evento. |
| timestamp required | integer <int64> Epoch em milissegundos do momento de montagem do envelope. |
{- "event": "queueProtocol",
- "entry": {
- "protocolId": "6657a1f2c3d4e5f6a7b8c9d0",
- "protocol_number": "2024062500001",
- "channel": "wpp",
- "channelNumber": "5511999998888",
- "attendant": null,
- "contact": null,
- "human": false,
- "receptive": true,
- "tags": [ ],
- "queue": {
- "_id": "6653dd33ee44ff5566001122",
- "name": "Suporte",
- "description": "Fila de suporte técnico"
}, - "state_protocol": "queue",
- "createdAt": "2024-06-25T12:00:00.000Z",
- "humanDate": null,
- "queueDate": "2024-06-25T12:00:05.000Z",
- "attendanceDate": null
}, - "timestamp": 1719320405000
}Evento enviado quando um protocolo é transferido para outra fila ou usuário. Usa o mesmo formato de entry de newProtocol.
| X-Webhook-Event required | string Enum: "newProtocol" "closedProtocol" "queueProtocol" "transferProtocol" "tagsProtocol" "newContact" "updateContact" "validacao" "edicao" Nome do evento enviado, igual ao campo |
| X-Webhook-Delivery required | string <uuid> UUID da tentativa de entrega. Cada retry recebe um novo valor. |
| X-Webhook-Id | string Identificador do evento de origem, quando disponível. Use como chave de idempotência. |
| X-Webhook-Signature | string^sha256=.+$ Assinatura |
Envelope JSON do evento transferProtocol.
| event required | string Nome do evento enviado. Value: "transferProtocol" |
required | object Conteúdo específico do evento. |
| timestamp required | integer <int64> Epoch em milissegundos do momento de montagem do envelope. |
{- "event": "transferProtocol",
- "entry": {
- "protocolId": "6657a1f2c3d4e5f6a7b8c9d0",
- "protocol_number": "2024062500001",
- "channel": "wpp",
- "channelNumber": "5511999998888",
- "attendant": {
- "_id": "6650aa00bb11cc22dd33ee44",
- "name": "Maria Atendente"
}, - "contact": null,
- "human": true,
- "receptive": true,
- "tags": [ ],
- "queue": {
- "_id": "6653dd33ee44ff5566001122",
- "name": "Suporte",
- "description": "Fila de suporte técnico"
}, - "state_protocol": "open",
- "createdAt": "2024-06-25T12:00:00.000Z",
- "humanDate": "2024-06-25T12:00:30.000Z",
- "queueDate": "2024-06-25T12:00:05.000Z",
- "attendanceDate": "2024-06-25T12:01:00.000Z"
}, - "timestamp": 1719320460000
}Evento enviado quando as tags de um protocolo são alteradas. Usa o mesmo formato de entry de newProtocol.
| X-Webhook-Event required | string Enum: "newProtocol" "closedProtocol" "queueProtocol" "transferProtocol" "tagsProtocol" "newContact" "updateContact" "validacao" "edicao" Nome do evento enviado, igual ao campo |
| X-Webhook-Delivery required | string <uuid> UUID da tentativa de entrega. Cada retry recebe um novo valor. |
| X-Webhook-Id | string Identificador do evento de origem, quando disponível. Use como chave de idempotência. |
| X-Webhook-Signature | string^sha256=.+$ Assinatura |
Envelope JSON do evento tagsProtocol.
| event required | string Nome do evento enviado. Value: "tagsProtocol" |
required | object Conteúdo específico do evento. |
| timestamp required | integer <int64> Epoch em milissegundos do momento de montagem do envelope. |
{- "event": "tagsProtocol",
- "entry": {
- "protocolId": "6657a1f2c3d4e5f6a7b8c9d0",
- "protocol_number": "2024062500001",
- "channel": "wpp",
- "channelNumber": "5511999998888",
- "attendant": null,
- "contact": null,
- "human": true,
- "receptive": true,
- "tags": [
- {
- "_id": "6652cc22dd33ee44ff556600",
- "tag": "VIP"
}
], - "queue": null,
- "state_protocol": "open",
- "createdAt": "2024-06-25T12:00:00.000Z",
- "humanDate": "2024-06-25T12:00:30.000Z",
- "queueDate": null,
- "attendanceDate": "2024-06-25T12:01:00.000Z"
}, - "timestamp": 1719320460000
}Evento enviado no encerramento de um protocolo. Adiciona motivo, data de encerramento e mensagens normalizadas.
| X-Webhook-Event required | string Enum: "newProtocol" "closedProtocol" "queueProtocol" "transferProtocol" "tagsProtocol" "newContact" "updateContact" "validacao" "edicao" Nome do evento enviado, igual ao campo |
| X-Webhook-Delivery required | string <uuid> UUID da tentativa de entrega. Cada retry recebe um novo valor. |
| X-Webhook-Id | string Identificador do evento de origem, quando disponível. Use como chave de idempotência. |
| X-Webhook-Signature | string^sha256=.+$ Assinatura |
Envelope JSON do evento closedProtocol.
| event required | string Nome do evento enviado. Value: "closedProtocol" |
required | object (ClosedProtocolEntry) Conteúdo específico do evento. |
| timestamp required | integer <int64> Epoch em milissegundos do momento de montagem do envelope. |
{- "event": "closedProtocol",
- "entry": {
- "protocolId": "6657a1f2c3d4e5f6a7b8c9d0",
- "protocol_number": "2024062500001",
- "channel": "wpp",
- "channelNumber": "5511999998888",
- "attendant": {
- "_id": "6650aa00bb11cc22dd33ee44",
- "name": "Maria Atendente"
}, - "contact": {
- "_id": "6651bb11cc22dd33ee44ff55",
- "name": "João Cliente",
- "messengerId": null,
- "instagramId": null,
- "address": null
}, - "human": true,
- "receptive": true,
- "tags": [
- {
- "_id": "6652cc22dd33ee44ff556600",
- "tag": "VIP"
}
], - "queue": {
- "_id": "6653dd33ee44ff5566001122",
- "name": "Suporte",
- "description": "Fila de suporte técnico"
}, - "state_protocol": "closed",
- "createdAt": "2024-06-25T12:00:00.000Z",
- "humanDate": "2024-06-25T12:00:30.000Z",
- "queueDate": "2024-06-25T12:00:05.000Z",
- "attendanceDate": "2024-06-25T12:01:00.000Z",
- "reason": {
- "protocolReason": {
- "_id": "6654ee44ff55660011223344",
- "reasonParent": "Financeiro",
- "reasonName": "Dúvida de cobrança",
- "reasonNote": "Cliente sanou a dúvida"
}, - "reason": "6655ff5566001122334455aa",
- "motive": "6655ff5566001122334455bb"
}, - "closeDate": "2024-06-25T12:30:00.000Z",
- "countMessages": 2,
- "messages": [
- {
- "id": "6656001122334455aabbccdd",
- "ack": null,
- "ackLog": [ ],
- "hasQuotedMsg": false,
- "human": false,
- "template": false,
- "wppId": "ABCD1234",
- "direction": "incoming",
- "message_type": "text",
- "createdAt": "2024-06-25T12:00:10.000Z",
- "message": "Olá, preciso de ajuda com a fatura"
}, - {
- "id": "6656001122334455aabbccee",
- "ack": "3",
- "ackLog": [
- {
- "status": "3",
- "date": "2024-06-25T12:01:05.000Z"
}
], - "hasQuotedMsg": true,
- "quoted": "6656001122334455aabbccdd",
- "human": true,
- "template": false,
- "wppId": "ABCD1235",
- "direction": "outgoing",
- "message_type": "text",
- "createdAt": "2024-06-25T12:01:00.000Z",
- "message": "Claro! Já estou verificando."
}
]
}, - "timestamp": 1719322200000
}Evento enviado quando um contato é criado.
| X-Webhook-Event required | string Enum: "newProtocol" "closedProtocol" "queueProtocol" "transferProtocol" "tagsProtocol" "newContact" "updateContact" "validacao" "edicao" Nome do evento enviado, igual ao campo |
| X-Webhook-Delivery required | string <uuid> UUID da tentativa de entrega. Cada retry recebe um novo valor. |
| X-Webhook-Id | string Identificador do evento de origem, quando disponível. Use como chave de idempotência. |
| X-Webhook-Signature | string^sha256=.+$ Assinatura |
Envelope JSON do evento newContact.
| event required | string Nome do evento enviado. Value: "newContact" |
required | object Conteúdo específico do evento. |
| timestamp required | integer <int64> Epoch em milissegundos do momento de montagem do envelope. |
{- "event": "newContact",
- "entry": {
- "contactId": "6651bb11cc22dd33ee44ff55",
- "name": "João Cliente",
- "messengerId": null,
- "instagramId": null,
- "celular": "11988887777",
- "countryCode": "55",
- "type": "PF",
- "externalCode": "ERP-4567",
- "address": {
- "cep": "01310100",
- "logradouro": "Av. Paulista",
- "numero": "1000",
- "complemento": "Conj. 101",
- "bairro": "Bela Vista",
- "cidade": "São Paulo",
- "estado": "SP",
- "pais": "BR",
- "isPrincipal": true,
- "type": "contact"
}, - "createdAt": "2024-06-25T11:50:00.000Z",
- "updatedAt": "2024-06-25T11:50:00.000Z"
}, - "timestamp": 1719319800000
}Evento enviado quando um contato é atualizado. Usa o mesmo formato de entry de newContact.
| X-Webhook-Event required | string Enum: "newProtocol" "closedProtocol" "queueProtocol" "transferProtocol" "tagsProtocol" "newContact" "updateContact" "validacao" "edicao" Nome do evento enviado, igual ao campo |
| X-Webhook-Delivery required | string <uuid> UUID da tentativa de entrega. Cada retry recebe um novo valor. |
| X-Webhook-Id | string Identificador do evento de origem, quando disponível. Use como chave de idempotência. |
| X-Webhook-Signature | string^sha256=.+$ Assinatura |
Envelope JSON do evento updateContact.
| event required | string Nome do evento enviado. Value: "updateContact" |
required | object Conteúdo específico do evento. |
| timestamp required | integer <int64> Epoch em milissegundos do momento de montagem do envelope. |
{- "event": "updateContact",
- "entry": {
- "contactId": "6651bb11cc22dd33ee44ff55",
- "name": "João Cliente",
- "messengerId": null,
- "instagramId": null,
- "celular": "11988887777",
- "countryCode": "55",
- "type": "PF",
- "externalCode": "ERP-4567",
- "address": null,
- "createdAt": "2024-06-25T11:50:00.000Z",
- "updatedAt": "2024-06-25T12:10:00.000Z"
}, - "timestamp": 1719321000000
}Handshake enviado ao cadastrar ou revalidar a URL do webhook.
| X-Webhook-Event required | string Enum: "newProtocol" "closedProtocol" "queueProtocol" "transferProtocol" "tagsProtocol" "newContact" "updateContact" "validacao" "edicao" Nome do evento enviado, igual ao campo |
| X-Webhook-Delivery required | string <uuid> UUID da tentativa de entrega. Cada retry recebe um novo valor. |
| X-Webhook-Id | string Identificador do evento de origem, quando disponível. Use como chave de idempotência. |
| X-Webhook-Signature | string^sha256=.+$ Assinatura |
Envelope JSON do evento sistêmico validacao.
| event required | string Enum: "validacao" "edicao" Nome do evento enviado. |
required | object Conteúdo específico do evento. |
| timestamp required | integer <int64> Epoch em milissegundos do momento de montagem do envelope. |
{- "event": "validacao",
- "entry": {
- "test": true
}, - "timestamp": 1719319000000
}Notificação best-effort enviada ao salvar uma edição do webhook.
| X-Webhook-Event required | string Enum: "newProtocol" "closedProtocol" "queueProtocol" "transferProtocol" "tagsProtocol" "newContact" "updateContact" "validacao" "edicao" Nome do evento enviado, igual ao campo |
| X-Webhook-Delivery required | string <uuid> UUID da tentativa de entrega. Cada retry recebe um novo valor. |
| X-Webhook-Id | string Identificador do evento de origem, quando disponível. Use como chave de idempotência. |
| X-Webhook-Signature | string^sha256=.+$ Assinatura |
Envelope JSON do evento sistêmico edicao.
| event required | string Enum: "validacao" "edicao" Nome do evento enviado. |
required | object Conteúdo específico do evento. |
| timestamp required | integer <int64> Epoch em milissegundos do momento de montagem do envelope. |
{- "event": "edicao",
- "entry": {
- "test": true
}, - "timestamp": 1719319000000
}