...

API do WaSap

Tempo de leitura estimado: 12 minutos 130 visualizações

Este documento é destinado a desenvolvedores que desejam integrar seus próprios sites, sistemas, aplicativos ou serviços à API fornecida pelo WaSap. Ele descreve as operações de envio e agendamento de mensagens, contatos e tarefas. Os exemplos usam valores fictícios; adapte a URL, os identificadores e os campos às configurações da sua instalação.

Segurança: nunca grave uma API Key real no Git, em logs, em capturas de tela ou no código-fonte distribuído ao navegador.

Sumário

  1. Pré-requisitos
  2. Configuração e autenticação
  3. Convenções
  4. Referência rápida
  5. Mensagens
  6. Agendamentos
  7. Contatos
  8. Tarefas
  9. Exemplos em JavaScript e Python
  10. Erros e tentativas
  11. Boas práticas de produção
  12. Solução de problemas

1. Pré-requisitos

Antes de iniciar, obtenha com o administrador da sua instalação:

  • a URL base, por exemplo https://suaapi.wasap.com.br;
  • uma API Key ativa;
  • os IDs de conexão do WhatsApp, usuário e fila necessários ao seu fluxo;
  • os escopos/permissões correspondentes às operações que serão executadas.

Para testar os exemplos de terminal, tenha o curl instalado. Para integrar em uma aplicação, utilize um cliente HTTP capaz de enviar cabeçalhos de autenticação, corpos JSON e, no envio de arquivos, requisições multipart/form-data.

2. Configuração e autenticação

Defina a URL sem barra no final e o token sem o prefixo Bearer:

export WASAP_URL='https://suaapi.wasap.com.br'
export WASAP_TOKEN='SUA_API_KEY'

As requisições autenticadas enviam a chave no cabeçalho HTTP:

Authorization: Bearer SUA_API_KEY

Nos corpos JSON, envie também:

Content-Type: application/json

Teste básico de autenticação:

curl "$WASAP_URL/api/contacts?pageNumber=1" \
  -H "Authorization: Bearer $WASAP_TOKEN"

Um retorno 401 UNAUTHORIZED normalmente indica chave ausente, inválida, expirada ou desativada. Um 403 INSUFFICIENT_SCOPE indica que a chave é reconhecida, mas não possui a permissão pedida. Nesse caso, consulte error.details.requiredScope na resposta.

3. Convenções

3.1 Telefones

Use somente dígitos, incluindo DDI e DDD:

  • correto: 5511999999999;
  • incorreto: +55 (11) 99999-9999.

Antes de enviar uma mensagem, o telefone pode ser verificado por GET /api/contacts/check/:number.

3.2 Datas e horários

Use ISO 8601 com fuso explícito. UTC é recomendado:

2026-04-01T10:00:00Z

Também é possível representar um deslocamento explícito, como 2026-04-01T07:00:00-03:00. Evite datas sem fuso, pois elas podem ser interpretadas de maneira diferente entre ambientes.

3.3 IDs, booleanos e arrays

  • Envie IDs numéricos como números, não como descrições.
  • Envie booleanos JSON como true ou false, não como strings.
  • Envie listas como arrays JSON, por exemplo "assignedUserIds": [1, 2].
  • Garanta que IDs relacionados pertençam ao mesmo ambiente/empresa.

3.4 Campos opcionais e paginação

  • Omita propriedades e filtros opcionais que não forem usados; não os envie como string vazia.
  • pageNumber começa em 1.
  • Nas listagens, use count e hasMore da resposta para decidir se a próxima página deve ser consultada.
  • Codifique parâmetros de consulta; curl --data-urlencode faz isso automaticamente.

4. Referência rápida

MétodoRotaFinalidade
POST/api/messages/sendEnviar mensagem de texto ou mídia
POST/api/messages/scheduleAgendar mensagem
GET/api/messages/scheduleListar agendamentos
DELETE/api/messages/schedule/:idCancelar agendamento pendente
GET/api/contactsListar/pesquisar contatos
GET/api/contacts/:numberConsultar contato pelo telefone
POST/api/contactsCriar ou sincronizar contato
GET/api/contacts/check/:numberValidar conta do WhatsApp
GET/api/tasksListar tarefas
GET/api/tasks/:taskIdConsultar tarefa
POST/api/tasksCriar tarefa
PUT/api/tasks/:taskIdAtualizar tarefa
DELETE/api/tasks/:taskIdExcluir tarefa

5. Mensagens

5.1 Enviar texto

Rota: POST /api/messages/send

CampoTipoObrigatoriedadeDescrição
numberstringobrigatórioTelefone com DDI e DDD, somente dígitos
bodystringobrigatório no envio textualConteúdo da mensagem
userIdnumberconforme instalaçãoUsuário/atendente associado
whatsappIdnumberconforme instalaçãoConexão usada no envio
queueIdnumberconforme instalaçãoFila/setor associado
disableBotbooleanopcionalControla o bot no atendimento
openTicketbooleanopcionalControla a abertura do ticket
curl -X POST "$WASAP_URL/api/messages/send" \
  -H "Authorization: Bearer $WASAP_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "number": "5511999999999",
    "body": "Olá! Esta é uma mensagem de teste.",
    "userId": 1,
    "whatsappId": 1,
    "queueId": 1,
    "disableBot": false,
    "openTicket": true
  }'

Considere a mensagem aceita somente depois de receber um status HTTP de sucesso. Guarde o identificador retornado pela sua instalação quando precisar acompanhar o envio.

5.2 Enviar mídia

Use a mesma rota com multipart/form-data. O arquivo é enviado no campo medias:

curl -X POST "$WASAP_URL/api/messages/send" \
  -H "Authorization: Bearer $WASAP_TOKEN" \
  -F 'number=5511999999999' \
  -F 'body=Confira o anexo' \
  -F 'whatsappId=1' \
  -F 'medias=@./arquivo.pdf'

O curl cria o cabeçalho multipart e seu boundary; não defina manualmente Content-Type nesse exemplo. Confirme previamente tamanho e tipo de arquivo aceitos pela sua instalação. Não envie URL ou Base64 como se fosse um arquivo, salvo quando sua instalação documentar explicitamente esse formato.

6. Agendamentos

6.1 Agendar uma mensagem

Rota: POST /api/messages/schedule

number, body e scheduledAt formam os dados centrais. Os IDs dependem da configuração operacional.

curl -X POST "$WASAP_URL/api/messages/schedule" \
  -H "Authorization: Bearer $WASAP_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "number": "5511999999999",
    "body": "Lembrete agendado",
    "scheduledAt": "2026-04-01T10:00:00Z",
    "userId": 1,
    "whatsappId": 1,
    "queueId": 1
  }'

Use uma data futura e confira o fuso. Registre o ID retornado para consultar ou cancelar o agendamento.

6.2 Listar agendamentos

Rota: GET /api/messages/schedule

Os filtros contactId e userId são opcionais:

curl --get "$WASAP_URL/api/messages/schedule" \
  -H "Authorization: Bearer $WASAP_TOKEN" \
  --data-urlencode 'contactId=42' \
  --data-urlencode 'userId=1'

Para listar sem filtros, não inclua esses parâmetros.

6.3 Cancelar um agendamento

Rota: DELETE /api/messages/schedule/:id

curl -X DELETE "$WASAP_URL/api/messages/schedule/45" \
  -H "Authorization: Bearer $WASAP_TOKEN"

Somente agendamentos pendentes podem ser cancelados. Consulte o recurso antes da exclusão e confirme o ID; SCHEDULE_NOT_CANCELLABLE significa que o estado já não permite cancelamento.

7. Contatos

7.1 Listar e pesquisar

Rota: GET /api/contacts

ParâmetroTipoDescrição
searchParamstringBusca por nome ou número
pageNumberintegerPágina, iniciando em 1
curl --get "$WASAP_URL/api/contacts" \
  -H "Authorization: Bearer $WASAP_TOKEN" \
  --data-urlencode 'searchParam=João' \
  --data-urlencode 'pageNumber=1'

Resposta representativa:

{
  "contacts": [],
  "count": 120,
  "hasMore": true
}

7.2 Consultar pelo telefone

Rota: GET /api/contacts/:number

curl "$WASAP_URL/api/contacts/5511999999999" \
  -H "Authorization: Bearer $WASAP_TOKEN"

Resposta representativa:

{
  "id": 42,
  "name": "João",
  "number": "5511999999999",
  "tags": [],
  "advanceData": []
}

7.3 Criar ou sincronizar

Rota: POST /api/contacts

name e number são obrigatórios; email é opcional. A operação cria ou atualiza o contato e sincroniza os dados disponíveis.

curl -X POST "$WASAP_URL/api/contacts" \
  -H "Authorization: Bearer $WASAP_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "João",
    "number": "5511999999999",
    "email": "[email protected]"
  }'

Resposta representativa:

{
  "id": 42,
  "name": "João",
  "number": "5511999999999"
}

7.4 Validar WhatsApp

Rota: GET /api/contacts/check/:number

curl "$WASAP_URL/api/contacts/check/5511999999999" \
  -H "Authorization: Bearer $WASAP_TOKEN"

Resposta representativa:

{
  "isValid": true,
  "number": "5511999999999",
  "remoteJid": "[email protected]"
}

Essa validação é útil antes de sincronizar um contato ou iniciar um envio. Trate isValid: false como um resultado de negócio, além de tratar eventuais erros HTTP.

8. Tarefas

8.1 Listar tarefas

Rota: GET /api/tasks

Todos os filtros são opcionais:

FiltroTipoDescrição
statusstringEx.: pending, in_progress, done
searchParamstringBusca no título ou descrição
pageNumberintegerPágina, iniciando em 1
columnIdintegerColuna do Kanban
prioritystringlow, medium ou high
queueIdintegerFila/setor
assignedUserIdintegerUsuário atribuído
assignedToMebooleanLimita às tarefas do dono do token
contactIdintegerContato vinculado
ticketIdintegerTicket vinculado
curl --get "$WASAP_URL/api/tasks" \
  -H "Authorization: Bearer $WASAP_TOKEN" \
  --data-urlencode 'status=pending' \
  --data-urlencode 'priority=high' \
  --data-urlencode 'pageNumber=1'

Resposta representativa:

{
  "tasks": [
    {"id": 1, "title": "Retornar contato", "status": "pending"}
  ],
  "count": 1,
  "hasMore": false
}

8.2 Consultar detalhes

Rota: GET /api/tasks/:taskId

curl "$WASAP_URL/api/tasks/1" \
  -H "Authorization: Bearer $WASAP_TOKEN"

A resposta detalhada pode incluir checklist e comentários, além dos campos básicos.

8.3 Criar tarefa

Rota: POST /api/tasks

title é obrigatório. Os demais campos devem ser incluídos apenas quando necessários:

curl -X POST "$WASAP_URL/api/tasks" \
  -H "Authorization: Bearer $WASAP_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "title": "Retornar contato",
    "description": "Responder pelo WhatsApp",
    "status": "pending",
    "priority": "high",
    "dueDate": "2026-04-01T10:00:00Z",
    "contactId": 42,
    "ticketId": 10,
    "columnId": 2,
    "assignedUserIds": [1, 2],
    "queueIds": [1]
  }'

Resposta representativa:

{
  "id": 2,
  "title": "Retornar contato",
  "status": "pending"
}

8.4 Atualizar tarefa

Rota: PUT /api/tasks/:taskId

Envie somente os campos que pretende alterar:

curl -X PUT "$WASAP_URL/api/tasks/2" \
  -H "Authorization: Bearer $WASAP_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"title":"Contato respondido","status":"done"}'

Não repita campos antigos sem necessidade, pois eles podem sobrescrever alterações feitas por outro processo.

8.5 Excluir tarefa

Rota: DELETE /api/tasks/:taskId

curl -X DELETE "$WASAP_URL/api/tasks/2" \
  -H "Authorization: Bearer $WASAP_TOKEN"

A exclusão é permanente. Consulte a tarefa e confirme seu ID antes de executar.

9. Exemplos em JavaScript e Python

As chamadas devem ser realizadas no servidor da sua aplicação, onde a API Key possa permanecer protegida. Não exponha o token em JavaScript executado no navegador, aplicativos distribuídos sem armazenamento seguro ou repositórios públicos.

9.1 JavaScript com fetch

Exemplo para runtimes com fetch nativo:

const baseUrl = process.env.WASAP_URL;
const token = process.env.WASAP_TOKEN;

const response = await fetch(`${baseUrl}/api/messages/send`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${token}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    number: '5511999999999',
    body: 'Olá pela API!',
    whatsappId: 1,
  }),
});

const result = await response.json().catch(() => null);
if (!response.ok) {
  throw new Error(`WaSap ${response.status}: ${JSON.stringify(result)}`);
}

console.log(result);

9.2 Python com requests

import os
import requests

base_url = os.environ["WASAP_URL"]
token = os.environ["WASAP_TOKEN"]

response = requests.get(
    f"{base_url}/api/contacts",
    headers={"Authorization": f"Bearer {token}"},
    params={"searchParam": "João", "pageNumber": 1},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Sempre defina timeout no cliente HTTP e trate separadamente falhas de rede, respostas não JSON e status HTTP sem sucesso.

10. Erros e tentativas

Formato defensivo representativo (os campos podem variar conforme a instalação):

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Um ou mais campos enviados são inválidos.",
    "details": {}
  },
  "requestId": "request-id"
}
HTTPCódigoCausa provávelAção
400VALIDATION_ERRORCampo ausente ou inválidoCorrigir o payload; não repetir sem alteração
400INVALID_NUMBERFormato do telefone inválidoEnviar somente dígitos com DDI e DDD
400WHATSAPP_NUMBER_INVALIDNúmero sem conta ativaVerificar o telefone pelo endpoint check
400MESSAGE_SEND_FAILEDFalha no envioConferir conexão e dados; repetir com cautela
400SCHEDULE_NOT_CANCELLABLEAgendamento não está pendenteConsultar o estado atual
401UNAUTHORIZEDChave inválida/expirada/desativadaCorrigir ou renovar a chave
403INSUFFICIENT_SCOPEEscopo ausenteConceder error.details.requiredScope
403FORBIDDENRecurso não autorizadoConferir escopo e propriedade do recurso
404CONTACT_NOT_FOUNDContato não localizadoConferir número/contexto
404WHATSAPP_NOT_FOUNDConexão não localizadaConferir whatsappId e conexão
404SCHEDULE_NOT_FOUNDAgendamento não localizadoConferir ID
404TASK_NOT_FOUNDTarefa não localizadaConferir ID
500INTERNAL_ERRORFalha inesperada no servidorGuardar requestId e tentar com backoff

Política de retry recomendada

  • Não repita automaticamente erros 400, 401, 403 ou 404; eles normalmente exigem correção ou mudança de estado.
  • Em falhas temporárias de rede e respostas 5xx, faça poucas tentativas com backoff exponencial e jitter, por exemplo 1 s, 2 s e 4 s.
  • Respeite um eventual cabeçalho Retry-After.
  • Tenha cuidado ao repetir operações POST: sem garantia de idempotência, uma resposta perdida pode resultar em mensagem ou tarefa duplicada.
  • Registre requestId, método, rota, status e horário UTC, mas nunca o token ou o corpo completo com dados pessoais.

11. Boas práticas de produção

  1. Menor privilégio: crie chaves apenas com os escopos necessários.
  2. Segredos: use cofre de segredos ou credenciais protegidas e faça rotação periódica.
  3. Validação: normalize telefones e valide payloads antes da chamada.
  4. Timeout: configure limites de conexão e leitura em todos os clientes.
  5. Observabilidade: registre status, latência, rota e requestId, ocultando dados sensíveis.
  6. Paginação: percorra páginas respeitando hasMore, sem criar loops ilimitados.
  7. Concorrência: evite que dois processos atualizem a mesma tarefa sem coordenação.
  8. Exclusões: consulte e confirme recurso/estado antes de qualquer DELETE.
  9. Dados pessoais: retenha apenas o necessário e aplique as políticas de privacidade da organização.
  10. Ambientes: mantenha tokens, URLs e IDs de teste separados dos de produção.

12. Solução de problemas

A URL retorna 404 em todas as rotas

  • Confirme o domínio da instalação.
  • Remova a barra final de WASAP_URL para evitar //api/....
  • Confirme que a rota começa com /api.

A API retorna 401

  • Confira se o cabeçalho é exatamente Authorization: Bearer TOKEN.
  • Não duplique o prefixo (Bearer Bearer ...).
  • Verifique expiração, desativação e ambiente da chave.

A API retorna 403

  • Leia error.details.requiredScope.
  • Confirme se a chave pode acessar a conexão, contato, tarefa ou fila informada.

O número é recusado

  • Remova +, espaços, parênteses e hífens.
  • Inclua DDI e DDD.
  • Consulte /api/contacts/check/:number antes do envio.

A data ocorre no horário errado

  • Envie Z para UTC ou offset explícito.
  • Converta a data no sistema de origem antes de montar o JSON.

A mídia não chega

  • Confirme que a requisição é multipart e que o campo se chama medias.
  • Envie o conteúdo binário real do arquivo.
  • Confirme que sua biblioteca HTTP está enviando o arquivo como conteúdo binário no campo medias.
  • Verifique limites e formatos aceitos pela instalação.

Checklist final de diagnóstico

  1. URL e rota estão corretas?
  2. O token pertence ao ambiente correto e tem o escopo exigido?
  3. O telefone contém apenas dígitos com DDI e DDD?
  4. IDs e tipos JSON estão corretos?
  5. Campos opcionais vazios foram removidos?
  6. Datas contêm fuso horário?
  7. O requestId foi preservado para suporte?

Os exemplos de respostas são representativos. Campos adicionais, limites operacionais e regras específicas podem variar conforme a versão e a configuração do sistema WaSap.

Resumo