API de Inst\u00e2ncias WhatsApp
As inst\u00e2ncias s\u00e3o conex\u00f5es individuais com o WhatsApp. Cada inst\u00e2ncia pode estar conectada a um n\u00famero diferente.
Endpoints Dispon\u00edveis
Listar Inst\u00e2ncias
Lista todas as inst\u00e2ncias do tenant.
GET /whatsapp/instances
Cookie: auth-session=...Resposta de Sucesso (200)
{
"success": true,
"data": [
{
"id": "inst_abc123",
"name": "Atendimento Principal",
"phone": "+5511999999999",
"status": "connected",
"webhookUrl": "https://seu-webhook.com",
"createdAt": "2024-01-15T10:00:00Z",
"active": true
}
]
}Criar Inst\u00e2ncia
Cria uma nova inst\u00e2ncia do WhatsApp.
POST /whatsapp/instances
Cookie: auth-session=...
Content-Type: application/jsonCorpo da Requisi\u00e7\u00e3o
{
"name": "Nova Inst\u00e2ncia",
"webhookUrl": "https://seu-webhook.com/whatsapp"
}Par\u00e2metros
| Campo | Tipo | Obrigat\u00f3rio | Descri\u00e7\u00e3o |
|---|---|---|---|
name | string | Sim | Nome da inst\u00e2ncia (3-50 caracteres) |
webhookUrl | string | N\u00e3o | URL para receber eventos |
Resposta de Sucesso (201)
{
"success": true,
"data": {
"instanceId": "inst_xyz789",
"instanceName": "Nova Inst\u00e2ncia",
"status": "created",
"integration": "WHATSAPP-BAILEYS",
"webhookUrl": "https://seu-webhook.com/whatsapp"
}
}Obter Detalhes da Inst\u00e2ncia
Retorna informa\u00e7\u00f5es detalhadas de uma inst\u00e2ncia.
GET /whatsapp/instances/{instanceId}
Cookie: auth-session=...Resposta de Sucesso (200)
{
"success": true,
"data": {
"id": "inst_abc123",
"name": "Atendimento Principal",
"phone": "+5511999999999",
"status": "connected",
"integration": "WHATSAPP-BAILEYS",
"webhookUrl": "https://seu-webhook.com",
"profilePicUrl": "https://...",
"active": true,
"createdAt": "2024-01-15T10:00:00Z",
"updatedAt": "2024-01-15T14:00:00Z"
}
}Atualizar Inst\u00e2ncia
Atualiza configura\u00e7\u00f5es de uma inst\u00e2ncia.
PUT /whatsapp/instances/{instanceId}
Cookie: auth-session=...
Content-Type: application/jsonCorpo da Requisi\u00e7\u00e3o
{
"name": "Novo Nome",
"webhookUrl": "https://novo-webhook.com"
}Deletar Inst\u00e2ncia
Remove permanentemente uma inst\u00e2ncia.
DELETE /whatsapp/instances/{instanceId}
Cookie: auth-session=...Cuidado
Esta a\u00e7\u00e3o \u00e9 irrevers\u00edvel! Todos os dados da inst\u00e2ncia ser\u00e3o perdidos.
Resposta de Sucesso (200)
{
"success": true,
"message": "Instance deleted successfully"
}Gerenciamento de Conex\u00e3o
Obter QR Code
Ap\u00f3s criar uma inst\u00e2ncia, um QR Code \u00e9 gerado automaticamente para conex\u00e3o.
GET /whatsapp/instances/{instanceId}
Cookie: auth-session=...A resposta incluir\u00e1 o campo qrCode quando dispon\u00edvel:
{
"success": true,
"data": {
"id": "inst_abc123",
"status": "qr",
"qrCode": {
"base64": "data:image/png;base64,iVBORw0KGgo...",
"expiry": 20,
"attemptId": "qr_attempt_1"
}
}
}Expira\u00e7\u00e3o do QR Code
- Cada QR Code expira em 20 segundos
- M\u00e1ximo de 6 tentativas (2 minutos total)
- Ap\u00f3s expirar todas as tentativas, use o endpoint de regenera\u00e7\u00e3o
Regenerar QR Code
Gera um novo conjunto de QR Codes ap\u00f3s expira\u00e7\u00e3o.
POST /whatsapp/instances/{instanceId}/regenerate-qr
Cookie: auth-session=...Desconectar Inst\u00e2ncia
Desconecta uma inst\u00e2ncia do WhatsApp.
POST /whatsapp/instances/{instanceId}/disconnect
Cookie: auth-session=...Status da Inst\u00e2ncia
| Status | Descri\u00e7\u00e3o |
|---|---|
created | Inst\u00e2ncia criada, aguardando configura\u00e7\u00e3o |
qr | QR Code dispon\u00edvel para escanear |
connected | Conectado e operacional |
disconnected | Desconectado temporariamente |
banned | N\u00famero banido pelo WhatsApp |
Enviando Mensagens
Enviar Texto
POST /whatsapp/instances/{instanceId}/send-text
Cookie: auth-session=...
Content-Type: application/jsonCorpo da Requisi\u00e7\u00e3o
{
"to": "5511999999999",
"message": "Ol\u00e1! Esta \u00e9 uma mensagem de teste."
}Enviar M\u00eddia
POST /whatsapp/instances/{instanceId}/send-media
Cookie: auth-session=...
Content-Type: application/jsonCorpo da Requisi\u00e7\u00e3o
{
"to": "5511999999999",
"mediaUrl": "https://exemplo.com/imagem.jpg",
"mediaType": "image",
"caption": "Legenda opcional"
}Tipos de M\u00eddia Suportados
image- Imagens (JPEG, PNG)video- V\u00eddeos (MP4)audio- \u00c1udios (MP3, OGG)document- Documentos (PDF, DOC, etc)
Limites
Os limites de inst\u00e2ncias dependem do seu plano:
| Plano | M\u00e1ximo de Inst\u00e2ncias |
|---|---|
| Starter | 1 |
| Pro | 5 |
| Enterprise | 50 |
Exemplos de C\u00f3digo
Criar e Conectar Inst\u00e2ncia
const axios = require('axios');
async function createAndConnect() {
const baseURL = 'https://api.zapflare.io';
// 1. Fazer login primeiro
const loginResponse = await axios.post(
`${baseURL}/auth/sessions`,
{
email: 'seu@email.com',
password: 'sua-senha'
},
{
withCredentials: true
}
);
// 2. Criar inst\u00e2ncia
const createResponse = await axios.post(
`${baseURL}/whatsapp/instances`,
{
name: 'Minha Inst\u00e2ncia',
webhookUrl: 'https://meu-webhook.com'
},
{
withCredentials: true
}
);
const instance = createResponse.data.data;
console.log('Inst\u00e2ncia criada:', instance.instanceId);
// 3. Aguardar QR Code
let connected = false;
while (!connected) {
await new Promise(resolve => setTimeout(resolve, 3000));
const statusResponse = await axios.get(
`${baseURL}/whatsapp/instances/${instance.instanceId}`,
{
withCredentials: true
}
);
const data = statusResponse.data.data;
if (data.qrCode) {
console.log('QR Code:', data.qrCode.base64);
// Exibir QR Code para o usu\u00e1rio escanear
}
if (data.status === 'connected') {
connected = true;
console.log('Conectado! N\u00famero:', data.phone);
}
}
}
createAndConnect().catch(console.error);import requests
import time
import base64
from PIL import Image
from io import BytesIO
def create_and_connect():
base_url = 'https://api.zapflare.io'
session = requests.Session()
# 1. Fazer login
login_response = session.post(
f'{base_url}/auth/sessions',
json={
'email': 'seu@email.com',
'password': 'sua-senha'
}
)
# 2. Criar inst\u00e2ncia
create_response = session.post(
f'{base_url}/whatsapp/instances',
json={
'name': 'Minha Inst\u00e2ncia',
'webhookUrl': 'https://meu-webhook.com'
}
)
instance = create_response.json()['data']
print(f'Inst\u00e2ncia criada: {instance["instanceId"]}')
# 3. Aguardar conex\u00e3o
connected = False
while not connected:
time.sleep(3)
status_response = session.get(
f'{base_url}/whatsapp/instances/{instance["instanceId"]}'
)
data = status_response.json()['data']
if 'qrCode' in data:
# Decodificar e mostrar QR Code
qr_data = data['qrCode']['base64'].split(',')[1]
img = Image.open(BytesIO(base64.b64decode(qr_data)))
img.show()
if data['status'] == 'connected':
connected = True
print(f'Conectado! N\u00famero: {data["phone"]}')
create_and_connect()Webhooks
Quando eventos ocorrem em uma inst\u00e2ncia, o ZapFlare envia notifica\u00e7\u00f5es para o webhook configurado.
Estrutura do Webhook
{
"event": "messages.upsert",
"instance": {
"instanceName": "Minha Inst\u00e2ncia",
"instanceId": "inst_abc123"
},
"data": {
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": false,
"id": "BAE5C8F9A2B4E231"
},
"message": {
"conversation": "Ol\u00e1!",
"messageTimestamp": "1704456789"
},
"messageType": "conversation",
"pushName": "Jo\u00e3o Silva"
}
}Eventos Dispon\u00edveis
connection.update- Mudan\u00e7as no status da conex\u00e3omessages.upsert- Nova mensagem recebida ou enviadamessages.update- Atualiza\u00e7\u00e3o de status de mensagemmessages.delete- Mensagem deletadagroups.update- Atualiza\u00e7\u00f5es em gruposgroups.upsert- Novo grupo criadocontacts.update- Atualiza\u00e7\u00f5es de contatospresence.update- Status online/offline