API de contas do WhatsApp
Conectar um número de WhatsApp (API)
Inicie a conexão de um número de WhatsApp ao seu espaço de trabalho a partir do seu próprio app. O WbizTool abre uma nova sessão do WhatsApp e envia um QR code, ou com login_method=phone um código de 8 caracteres, para a URL do seu webhook. Mostre-o ao dono do celular, ele escaneia o QR code ou digita o código no WhatsApp e o número fica pronto para enviar mensagens. Com um QR code, você não precisa saber o número com antecedência: o WbizTool o lê do WhatsApp depois do escaneamento e o envia para o seu webhook.
Vai conectar o seu próprio número manualmente? Siga Conecte seu número de WhatsApp.
https://wbiztool.com/api/v1/whatsapp/connect/Corpo: JSON ou campos de formulário
POST /api/v1/whatsapp-client/create/ é um alias idêntico: executa o mesmo código e retorna as mesmas respostas. Os dois caminhos continuam funcionando.
Como a conexão funciona#
A chamada à API apenas inicia a conexão. O QR code ou o código chega depois, na URL do seu webhook.
Chame a API de conexão
Envie o seu
webhook_url, maiswhatsapp_numbercomlogin_method=phone. Para reconectar um número que você adicionou antes, envie também owhatsapp_client_iddele. A resposta traz umwhatsapp_client_id. Guarde-o.Receba o QR code ou o código
Com o padrão
login_method=qr, seu webhook recebestatus=qr_generatedcom a imagem do QR code emqr_image. O QR code é enviado novamente a cada poucos segundos enquanto o WbizTool aguarda o escaneamento, então sempre mostre o mais recente. A pessoa tem cerca de dois minutos para escanear.Com
login_method=phone, seu webhook recebestatus=pairing_codecom um código de 8 caracteres empairing_code, comoK5EWPGY5. Ele é enviado uma única vez e é válido por cerca de três minutos.Mostre a imagem ou o código à pessoa dona do celular. Se não for usado a tempo, ou se o WhatsApp pedir para recarregar o código, você recebe
not_connected; chame a API novamente para obter um novo.Vincule o celular
No celular, abra o WhatsApp → Dispositivos conectados (Linked devices) → Conectar dispositivo (Link a device). Escaneie o QR code, ou toque em Conectar com número de telefone (Link with phone number instead) e digite o código de 8 caracteres.
Receba o resultado
Seu webhook recebe
status=connectedcom o número vinculado emwhatsapp_numberquando o número é conectado, oustatus=not_connectedse o código não foi escaneado a tempo ou a conexão falhou. O eventoconnectedpode chegar alguns segundos antes de Status da conexão retornarConnected. Responda primeiro ao webhook e depois consulte Status da conexão a cada poucos segundos por até um minuto. Não faça uma única verificação de dentro do handler do seu webhook.
Exemplo rápido#
curl -X POST https://wbiztool.com/api/v1/whatsapp/connect/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"webhook_url": "https://example.com/wbiztool/connect-events?token=LONG_RANDOM_SECRET"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/whatsapp/connect/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"webhook_url": "https://example.com/wbiztool/connect-events?token=LONG_RANDOM_SECRET",
},
timeout=30,
)
result = response.json() # read the body even when the HTTP code is 400 or 403
if result.get("status") == 1:
print("Waiting for QR code, whatsapp_client_id", result["whatsapp_client_id"])
else:
print("Failed:", result.get("message"))// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/whatsapp/connect/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
webhook_url: "https://example.com/wbiztool/connect-events?token=LONG_RANDOM_SECRET",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400 or 403
if (result.status === 1) {
console.log("Waiting for QR code, whatsapp_client_id", result.whatsapp_client_id);
} else {
console.error("Failed:", result.message);
}<?php
$payload = [
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'webhook_url' => 'https://example.com/wbiztool/connect-events?token=LONG_RANDOM_SECRET',
];
$ch = curl_init('https://wbiztool.com/api/v1/whatsapp/connect/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($result['status'] ?? 0) === 1) {
echo 'Waiting for QR code, whatsapp_client_id ' . $result['whatsapp_client_id'];
} else {
echo 'Failed: ' . ($result['message'] ?? 'no response');
}Substitua 12345 e YOUR_API_KEY pelos seus próprios valores. Veja em Autenticação onde encontrá-los. Para receber um código no celular, adicione "login_method": "phone" e "whatsapp_number": "919876543210".
Parâmetros da requisição#
client_idintegerobrigatórioSeu ID do Cliente da API, em Configurações → Chaves API.
api_keystringobrigatórioSua chave de API, na mesma página. O número é adicionado ao espaço de trabalho em que esta chave foi criada.
whatsapp_numberstringSó com login_method=phoneCom
login_method=phone, o número internacional completo para onde o código será enviado, porque o WhatsApp o envia exatamente para esse número: primeiro o código do país, sem0à esquerda, como919876543210.+, espaços e hífens são removidos automaticamente.Com
login_method=qrele é ignorado, e você pode omiti-lo. O WbizTool salva o número que o WhatsApp informa depois do escaneamento e o envia no webhookconnected.login_methodstringopcionalqr(padrão) para receber um QR code, ouphonepara receber um código de 8 caracteres que o dono digita no WhatsApp em Conectar com número de telefone. Útil quando o celular não consegue escanear um QR code, por exemplo quando ele é o único dispositivo.whatsapp_client_idintegeropcionalPara reconectar um número que está no seu espaço de trabalho, mas não está conectado, envie o
whatsapp_client_iddele. O mesmo ID é mantido, então suas outras chamadas à API continuam funcionando. Omita-o para adicionar um novo número.A linha fica com o número que for vinculado. Se outro celular escanear o QR code, ou se você enviar outro
whatsapp_numbercomlogin_method=phone, essewhatsapp_client_idpassa a enviar a partir do novo número, incluindo as mensagens que já estavam na fila para ele.webhook_urlstringObrigatório para receber o QR codeSua URL
httpouhttpsque recebe o QR code e as atualizações da conexão, com até 250 caracteres (URLs mais longas falham com HTTP500). A API aceita uma requisição sem ela, mas nesse caso nada é enviado para você e não há como obter o QR code pela API. Veja Eventos de webhook.
Usar os clientes oficiais#
O cliente Python chama /api/v1/whatsapp-client/create/ para você. Ele pede whatsapp_number; com um QR code, o valor é ignorado.
from wbiztool_client import WbizToolClient
client = WbizToolClient(api_key="YOUR_API_KEY", client_id=12345)
result = client.create_whatsapp_client(
whatsapp_number="919876543210",
webhook_url="https://example.com/wbiztool/connect-events?token=LONG_RANDOM_SECRET",
)
print(result)O cliente Python lança requests.exceptions.HTTPError quando a API retorna HTTP 400 ou 403, então coloque a chamada dentro de um try/except.
Resposta#
Quando a solicitação de conexão é criada, a API retorna HTTP 200:
{
"message": "Whatsapp Client Created",
"whatsapp_client_id": 678,
"login_method": "qr",
"status": 1
}
| Campo | Tipo | Descrição |
|---|---|---|
status | integer | 1 se a solicitação de conexão foi criada, 0 se falhou. |
message | string | Whatsapp Client Created em caso de sucesso; caso contrário, o erro. |
whatsapp_client_id | integer | ID do número de WhatsApp. Use-o como whatsapp_client em outras chamadas à API. Presente apenas em caso de sucesso. |
login_method | string | qr ou phone, conforme usado nesta tentativa. Presente apenas em caso de sucesso. |
"status": 1 significa que a solicitação foi criada, não que o número está conectado. Chamar a API novamente não acumula números:
- Com um QR code e sem
whatsapp_client_id, você recebe o mesmowhatsapp_client_idde volta até que um dos QR codes dele seja escaneado. - Com
login_method=phone, um número que já foi adicionado antes, mas não está conectado, recebe de volta owhatsapp_client_idexistente. - Com
whatsapp_client_id, esse número é reconectado.
Até o primeiro QR code ser escaneado, o número ainda não tem número de telefone: Listar números conectados e Status da conexão retornam um número vazio para ele.
Erros#
| Mensagem | HTTP | Como corrigir |
|---|---|---|
login_method must be 'qr' or 'phone' | 400 | Envie qr, phone ou omita o campo. |
For login_method phone, whatsapp_number must be the full international number with country code and no leading 0, e.g. 919876543210 | 400 | Envie o número com o código do país, como 919876543210, e não 09876543210 ou 9876543210. |
Auth Error | 200 | Envie client_id e api_key. Também é retornado quando o corpo JSON é inválido. |
Invalid Client Id | 403 | Envie client_id como número inteiro, por exemplo 12345. |
Auth Error: invalid api key | 400 | Verifique se a chave existe, não foi excluída e pertence a este client_id. |
Higher Subscription Required | 200 | Seu plano não inclui esta API. Faça upgrade do seu plano. |
WhatsApp Account Limit Reached. Upgrade your account to get more whatsapp limit | 200 | Você já tem tantos números conectados quanto o seu plano permite. Desconecte um ou faça upgrade. |
Already Connected With Given Number | 200 | Com login_method=phone, este número já está conectado neste espaço de trabalho. Com whatsapp_client_id, esse número já está conectado. Não é preciso fazer nada. Se você já estiver no limite de números do seu plano, recebe WhatsApp Account Limit Reached em vez disso. |
Invalid WhatsApp client | 400 | O whatsapp_client_id não existe, foi excluído ou pertence a outro espaço de trabalho. Omita-o para adicionar um novo número. |
Uma requisição que não seja POST retorna um objeto vazio {} com HTTP 200.
Eventos de webhook#
O WbizTool envia um POST para o seu webhook_url a cada etapa. O corpo é codificado como formulário (application/x-www-form-urlencoded), não como JSON.
QR code pronto (enviado novamente a cada poucos segundos enquanto aguarda o escaneamento, muitas vezes com a mesma URL):
status=qr_generated&whatsapp_client_id=678&qr_image=...
Código no celular pronto (com login_method=phone, enviado uma única vez):
status=pairing_code&whatsapp_client_id=678&pairing_code=K5EWPGY5
Número conectado, com o número que está logado, como o WhatsApp o informa:
status=connected&whatsapp_client_id=678&whatsapp_number=919876543210
Falha na conexão, por exemplo porque o QR code não foi escaneado ou o código não foi digitado a tempo:
status=not_connected&whatsapp_client_id=678
| Campo | Valores |
|---|---|
status | qr_generated, pairing_code, connected ou not_connected |
whatsapp_client_id | O whatsapp_client_id retornado pela API. |
whatsapp_number | Somente com connected. O número vinculado com o código do país, como 919876543210. Use-o para saber qual número foi escaneado. Fica vazio no caso raro de o WhatsApp não o informar. |
pairing_code | Somente com pairing_code. O código de 8 caracteres a ser digitado no WhatsApp. Mostre-o como está; espaços ou um hífen entre as duas metades não são problema. |
qr_image | Somente com qr_generated. Pode ser uma URL data: com a imagem em base64 ou uma URL https da imagem. Trate os dois casos. A URL https é a mesma em todas as atualizações do mesmo número, enquanto a imagem por trás dela muda. Adicione uma query para evitar cache ao exibi-la (por exemplo ?t=<timestamp>), ou o navegador pode continuar mostrando um código expirado. |
Sua URL precisa ser acessível publicamente e deve responder em poucos segundos. O WbizTool aguarda sua resposta por até 10 segundos; se o seu servidor for lento ou não puder ser acessado, esse evento se perde, mas a tentativa de conexão continua. Qualquer código de status HTTP é aceito. Entregas que falham não são repetidas, e nada é enviado se o número se desconectar depois. Para acompanhar um número depois de conectado, consulte periodicamente Status da conexão.
Polling em vez de webhooks#
Se o seu servidor não consegue receber webhooks, você ainda precisa do webhook para obter o QR code, mas não precisa depender dele para saber o resultado. Depois que o QR code for escaneado, chame Status da conexão com o whatsapp_client_id a cada poucos segundos até que ele retorne Connected. Listar contas mostra a mesma informação para todos os seus números.
Dicas#
- Trate eventos duplicados: faça com que seu handler possa ser executado mais de uma vez com segurança, caso um evento seja entregue duas vezes.
- Mostre o QR code mais recente: substitua a imagem sempre que chegar um novo evento
qr_generated, adicionando uma query para evitar cache a uma URLhttps. Os códigos antigos param de funcionar. - Escaneie em cerca de dois minutos: depois disso, você recebe
not_connected. Chame a API novamente para obter um novo código. - Confira o número depois de escanear o QR code: o
whatsapp_numberdo eventoconnectedé o número que foi realmente vinculado, que pode ser diferente do que você esperava. - Digite o código em cerca de três minutos: cada tentativa gera um único código. Se ele expirar, você recebe
not_connected; chame a API novamente. - Nenhum QR code ou código depois de 10 minutos? A solicitação expirou. Chame a API novamente.
- Conectar pelo painel é mais simples quando você está conectando seu próprio número. Use as configurações do WhatsApp e escaneie o código lá.
