Documentação da API
Guia completo para integração com a API do Zapini
URL Base
https://instance-{id}.zapini.app
Autenticação
Bearer Token (Sanctum)
Rate Limit
100 requests / 15 min
Primeiros Passos
A API REST do Zapini permite integrar recursos de mensagens do WhatsApp em suas aplicações. Todas as requisições devem usar HTTPS e incluir autenticação Bearer token.
Tipos de API
O Zapini oferece dois tipos de API para diferentes necessidades. Escolha a que melhor se adapta ao seu caso de uso.
API Universal
https://instance-{id}.zapini.app
API REST completa para gerenciar todas as suas instâncias, conversas, contatos e configurações. Use esta API para aplicações web/mobile que precisam de acesso completo ao sistema.
API da Instância
https://instance-{id}.zapini.app/
API direta para enviar mensagens com baixa latência. Cada instância WhatsApp possui sua própria URL dedicada. Ideal para bots e automações de alto volume.
Qual API devo usar?
| Caso de Uso | API Recomendada |
|---|---|
| Aplicativo web/mobile | Universal (Token Sanctum) |
| Bot de mensagens | Instância (Token sk_) |
| CRM / Sistema de atendimento | Universal (Token Sanctum) |
| Envio em massa / campanhas | Instância (Token sk_) |
| Integração externa simples | Instância (Token sk_) |
ID da Instância
O UUID da instância (usado na API Universal) pode ser encontrado na página de Instâncias do painel administrativo. Copie o ID mostrado em cada card de instância.
Headers Obrigatórios
Authorization: Bearer {token}
Accept: application/json
Content-Type: application/json
Formato de Resposta
Resposta de Sucesso
{
"success": true,
"message": "Operation completed",
"data": { ... }
}
Resposta de Erro
{
"success": false,
"error": {
"code": "ERROR_CODE",
"message": "Error description",
"details": {}
}
}
Códigos HTTP
| Código | Descrição |
|---|---|
| 200 | OK - Requisição bem-sucedida |
| 201 | Created - Recurso criado com sucesso |
| 400 | Bad Request - Parâmetros inválidos |
| 401 | Unauthorized - Token inválido ou ausente |
| 403 | Forbidden - Sem permissão para este recurso |
| 404 | Not Found - Recurso não encontrado |
| 422 | Unprocessable Entity - Erro de validação |
| 429 | Too Many Requests - Limite de requisições excedido |
| 500 | Internal Server Error - Erro interno do servidor |
Autenticação
Tipos de Token
Existem dois tipos de tokens de autenticação, cada um adequado para diferentes cenários.
Token Sanctum
Token de usuário obtido via login. Dá acesso a todas as instâncias e recursos do seu tenant. Ideal para aplicações web/mobile onde o usuário faz login.
- • Como obter: POST /auth/login com email e senha
- • Formato: 1|abc123xyz...
- • Acesso: Todas as instâncias do tenant
Token de Instância (sk_)
Token específico de uma instância WhatsApp. Gerado no painel administrativo. Ideal para integrações externas e bots.
- • Como obter: Gerar no painel em Instâncias > Tokens API
- • Formato: sk_xxxxxxxxxxxxxxxx
- • Acesso: Apenas a instância específica
Ambos os tokens funcionam da mesma forma no header Authorization:
Authorization: Bearer {token}
/auth/login
Autentica um usuário e retorna um token de acesso.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
email |
string | Sim | E-mail do usuário |
password |
string | Sim | Senha do usuário |
device_name |
string | Não | Nome do dispositivo para identificação do token |
Exemplo
curl -X POST https://instance-{id}.zapini.app/auth/login \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email": "user@example.com",
"password": "your_password",
"device_name": "My App"
}'
Resposta
{
"success": true,
"message": "Login successful",
"data": {
"user": {
"id": 1,
"name": "User Name",
"email": "user@example.com",
"role": "admin"
},
"token": "1|abc123xyz...",
"token_type": "Bearer"
}
}
/auth/me
Retorna informações do usuário autenticado.
Exemplo
curl -X GET https://instance-{id}.zapini.app/auth/me \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
/auth/logout
Revoga o token de acesso atual.
Exemplo
curl -X POST https://instance-{id}.zapini.app/auth/logout \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
/auth/refresh
Atualiza o token de acesso.
Exemplo
curl -X POST https://instance-{id}.zapini.app/auth/refresh \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
Instâncias
/instances
Lista todas as instâncias do WhatsApp da sua conta.
Parâmetros de Consulta
| Campo | Tipo | Descrição |
|---|---|---|
status |
string | connected, disconnected, qr_ready, pending |
Exemplo
curl -X GET "https://instance-{id}.zapini.app/instances?status=connected" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
Resposta
{
"success": true,
"data": {
"instances": [
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"phone_number": "5511999999999",
"status": "connected",
"connected": true,
"messages_sent_today": 50,
"remaining_quota": 450,
"can_send_messages": true,
"last_activity_at": "2025-01-15T10:30:00Z"
}
]
}
}
/instances/{uuid}
Retorna detalhes de uma instância específica.
Exemplo
curl -X GET https://instance-{id}.zapini.app/instances/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
/instances/{uuid}/qr
Retorna o QR code para conectar a instância.
Exemplo
curl -X GET https://instance-{id}.zapini.app/instances/550e8400-e29b-41d4-a716-446655440000/qr \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
Resposta
{
"success": true,
"data": {
"status": "qr_ready",
"qr_code": "data:image/png;base64,...",
"qr_code_text": "2@...",
"qr_generated_at": "2025-01-15T10:30:00Z",
"qr_expired": false,
"message": "QR code ready to scan"
}
}
/instances/{uuid}/status
Retorna o status atual da instância.
Parâmetros de Consulta
| Campo | Tipo | Descrição |
|---|---|---|
realtime |
boolean | Se true, verifica o status em tempo real no servidor |
Exemplo
curl -X GET "https://instance-{id}.zapini.app/instances/550e8400-e29b-41d4-a716-446655440000/status?realtime=true" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
/instances/{uuid}/stats
Retorna estatísticas de uso da instância.
Resposta
{
"success": true,
"data": {
"messages_sent_today": 50,
"remaining_quota": 450,
"daily_limit": 500,
"messages_this_week": 200,
"messages_this_month": 800,
"messages_received_today": 30,
"conversations_count": 150,
"contacts_count": 500
}
}
/instances/{uuid}/disconnect
Desconecta a instância do WhatsApp.
Exemplo
curl -X POST https://instance-{id}.zapini.app/instances/550e8400-e29b-41d4-a716-446655440000/disconnect \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
/instances/{uuid}/reconnect
Inicia o processo de reconexão da instância.
Exemplo
curl -X POST https://instance-{id}.zapini.app/instances/550e8400-e29b-41d4-a716-446655440000/reconnect \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
Mensagens
API da Instância (Baileys)
API direta para enviar mensagens com baixa latência. Cada instância WhatsApp possui sua própria URL dedicada. Ideal para bots e automações de alto volume.
Base URL:
https://instance-{id}.zapini.app
API Universal - /chat/send
Para enviar mensagens via API Universal, use o endpoint /chat/send (consulte a aba Chat API).
/send-message
Envia uma mensagem de texto para um número do WhatsApp.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
recipient
(ou number, to)
|
string | Sim | Número do WhatsApp do destinatário (com código do país) (5511999999999) |
message |
string | Sim | Conteúdo da mensagem de texto |
reply_to
(ou quoted_message_id)
|
string | Não | ID da mensagem para responder |
recipient, number e to são equivalentes.
Assim como reply_to e quoted_message_id.
Exemplo
curl -X POST https://instance-{id}.zapini.app/send-message \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"recipient": "5511999999999",
"message": "Olá! Esta é uma mensagem de teste."
}'
Resposta
{
"success": true,
"message": "Message sent successfully",
"message_id": "3EB0B430A8B7F23C1D12",
"timestamp": "2025-12-30T17:30:00.000Z"
}
/send-media
Envia uma mensagem com mídia (imagem, vídeo, áudio, documento).
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
recipient
(ou number, to)
|
string | Sim | Número do WhatsApp do destinatário (com código do país) (5511999999999) |
media_url
(ou url)
|
string | Sim | URL pública do arquivo de mídia |
media_type
(ou type)
|
string | Sim | image, video, audio, document |
caption |
string | Não | Legenda para imagens e vídeos |
filename |
string | Não | Nome do arquivo para documentos |
recipient/number/to,
media_url/url e
media_type/type são equivalentes.
Exemplo
curl -X POST https://instance-{id}.zapini.app/send-media \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"recipient": "5511999999999",
"media_url": "https://example.com/image.jpg",
"media_type": "image",
"caption": "Confira esta imagem!"
}'
Resposta
{
"success": true,
"message": "Media sent successfully",
"message_id": "3EB0B430A8B7F23C1D13",
"timestamp": "2025-12-30T17:30:00.000Z"
}
/send-reaction
Envia um emoji de reação para uma mensagem específica.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
to |
string | Sim | JID do chat |
messageId |
string | Sim | ID da mensagem para reagir |
emoji |
string | Sim | Emoji da reação (ex: 👍, ❤️, 😂) |
Exemplo
curl -X POST https://instance-{id}.zapini.app/send-reaction \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"to": "5511999999999@s.whatsapp.net",
"messageId": "3EB0B430A8B7F23C1D12",
"emoji": "👍"
}'
/status
Retorna o status atual de conexão da instância do WhatsApp.
Exemplo
curl -X GET https://instance-{id}.zapini.app/status \
-H "Authorization: Bearer {token}"
Resposta
{
"success": true,
"status": "connected",
"phone": "5511999999999",
"name": "Meu WhatsApp",
"platform": "android"
}
/qr
Retorna o QR code para conectar a instância do WhatsApp. Disponível apenas quando o status é qr_ready.
Exemplo
curl -X GET https://instance-{id}.zapini.app/qr \
-H "Authorization: Bearer {token}"
Resposta
{
"success": true,
"qr": "data:image/png;base64,iVBORw0KGgoAAAA...",
"status": "qr_ready"
}
/health
Retorna o status de saúde do servidor da API. Não requer autenticação.
Exemplo
curl -X GET https://instance-{id}.zapini.app/health
Resposta
{
"status": "ok",
"uptime": 123456,
"timestamp": "2025-12-15T14:30:00.000Z"
}
Conversas
/conversations
Lista todas as conversas ativas.
Parâmetros de Consulta
| Campo | Tipo | Descrição |
|---|---|---|
instance_id |
string | Filtrar por instância (UUID) |
unread |
boolean | Mostrar apenas conversas não lidas |
search |
string | Buscar por nome ou número |
is_group |
boolean | Filtrar por grupos (true/false) |
per_page |
integer | Itens por página (max 100) |
include_tags |
boolean | Incluir tags da conversa na resposta |
tag_id |
uuid | Filtrar por ID da tag |
tag_ids |
uuid[] | Filtrar por múltiplos UUIDs de tags (separados por vírgula ou array) |
untagged |
boolean | Mostrar apenas conversas sem tags |
format |
string | Usar formato de resposta otimizado para chat (chat) |
?format=chat: A Chat API retorna os mesmos dados dos endpoints padrão, mas com campos adicionais otimizados para renderização de UI. Você também pode usar ?format=chat nos endpoints padrão.
Exemplo
curl -X GET "https://instance-{id}.zapini.app/conversations?unread=true&per_page=20" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
Resposta
{
"success": true,
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440045",
"contact_number": "5511999999999",
"contact_name": "John Doe",
"display_name": "John Doe",
"is_group": false,
"profile_picture_url": "https://...",
"last_message": "Ok, deal!",
"last_message_at": "2025-01-15T10:30:00Z",
"unread_count": 2,
"is_archived": false
}
],
"meta": {
"pagination": {
"total": 100,
"per_page": 20,
"current_page": 1,
"last_page": 5
}
}
}
/conversations/{uuid}
Retorna detalhes de uma conversa específica.
/conversations/{uuid}/messages
Retorna o histórico de mensagens de uma conversa.
Parâmetros de Consulta
| Campo | Tipo | Descrição |
|---|---|---|
from |
datetime | Data inicial (ISO 8601) |
to |
datetime | Data final (ISO 8601) |
before_id |
integer | Mensagens antes deste ID |
after_id |
integer | Mensagens após este ID |
limit |
integer | Limite de mensagens (max 100) |
format |
string | Usar formato de resposta otimizado para chat (chat) |
?format=chat: Retorna mensagens com formatted_body (@menções resolvidas) e reações agrupadas.
/conversations/{uuid}/mark-read
Marca uma conversa como lida.
/conversations/{uuid}/archive
Arquiva uma conversa.
Resposta
{
"success": true,
"message": "Conversation archived.",
"data": {
"archived_id": "550e8400-e29b-41d4-a716-446655440045",
"archived_at": "2025-12-29T12:00:00.000000Z"
}
}
/conversations/{uuid}/archive
Restaura uma conversa arquivada para status ativo.
O UUID deve ser de uma conversa arquivada. Use GET /conversations/archived para listar conversas arquivadas.
Resposta
{
"success": true,
"message": "Conversation restored.",
"data": {
"conversation_id": "550e8400-e29b-41d4-a716-446655440045",
"restored": true
}
}
/conversations/{uuid}
Exclui uma conversa e suas mensagens.
Controle de Automação
Gerencie a automação de IA para conversas. Quando a automação está ativa, mensagens manuais são bloqueadas até você assumir o chat.
Importante: Comportamento da Automação
- Quando a automação está ativa, mensagens manuais são bloqueadas para evitar conflitos com respostas da IA.
- Use "pause" para assumir o chat e enviar mensagens manualmente.
- Use "resume" para deixar a IA gerenciar a conversa novamente.
- IMPORTANTE: Para retomar a automação, você deve primeiro arquivar a conversa.
Segurança: Arquivamento Obrigatório para Retomar
A automação só pode ser retomada após arquivar a conversa. Isso garante que a sessão de atendimento manual seja encerrada corretamente antes de devolver o controle à IA. Ao retomar, a conversa será automaticamente desarquivada.
/conversations/{uuid}/automation
Retorna o status atual da automação para uma conversa.
Resposta
{
"success": true,
"data": {
"conversation_id": "550e8400-e29b-41d4-a716-446655440045",
"automation_status": "active",
"is_automation_active": true,
"can_send_manual_message": false,
"paused_at": null,
"paused_by": null,
"pause_reason": null
}
}
/conversations/{uuid}/automation/pause
Pausa a automação para uma conversa, permitindo mensagens manuais.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
reason |
string | Não | Motivo opcional para pausar a automação |
Exemplo
curl -X POST "https://instance-{id}.zapini.app/conversations/550e8400-e29b-41d4-a716-446655440045/automation/pause" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"reason": "Manual takeover for VIP client"}'
Resposta
{
"success": true,
"message": "Automation paused. You can now send messages manually.",
"data": {
"automation_status": "paused",
"paused_at": "2025-12-20T14:30:00Z",
"paused_by": "John Doe"
}
}
/conversations/{uuid}/automation/resume
Retoma a automação para uma conversa, deixando a IA gerenciar as respostas.
Resposta
{
"success": true,
"message": "Automation resumed. AI will handle this conversation.",
"data": {
"automation_status": "active"
}
}
/conversations/automation/bulk-pause
Pausa a automação para múltiplas conversas de uma vez.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
conversation_ids |
array | Sim | Array de IDs de conversas para processar |
reason |
string | Não | Motivo opcional para pausar a automação |
Exemplo
curl -X POST "https://instance-{id}.zapini.app/conversations/automation/bulk-pause" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"conversation_ids": ["550e8400-e29b-41d4-a716-446655440001", "550e8400-e29b-41d4-a716-446655440002", "550e8400-e29b-41d4-a716-446655440003"]}'
Resposta
{
"success": true,
"message": "3 conversations paused successfully."
}
/conversations/automation/bulk-resume
Retoma a automação para múltiplas conversas de uma vez.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
conversation_ids |
array | Sim | Array de IDs de conversas para processar |
Resposta
{
"success": true,
"message": "3 conversations resumed successfully."
}
Contatos
/contacts
Lista todos os contatos salvos.
Parâmetros de Consulta
| Campo | Tipo | Descrição |
|---|---|---|
instance_id |
string | Filtrar por instância (UUID) |
search |
string | Buscar por nome ou número |
per_page |
integer | Itens por página (max 100) |
Exemplo
curl -X GET "https://instance-{id}.zapini.app/contacts?search=john&per_page=50" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
Resposta
{
"success": true,
"data": [
{
"id": 1,
"phone_number": "5511999999999",
"name": "John Doe",
"display_name": "John",
"email": "john@example.com",
"company": "Acme Inc",
"notes": "VIP customer",
"profile_picture_url": "https://...",
"is_business": false,
"created_at": "2025-01-15T10:30:00Z"
}
],
"meta": {
"pagination": {
"total": 500,
"per_page": 50,
"current_page": 1,
"last_page": 10
}
}
}
/contacts
Cria um novo contato.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
instance_id |
string | Sim | ID da instância |
phone_number |
string | Sim | Número de telefone do contato |
name |
string | Não | Nome do contato |
email |
string | Não | E-mail do contato |
company |
string | Não | Empresa do contato |
notes |
string | Não | Observações sobre o contato |
Exemplo
curl -X POST https://instance-{id}.zapini.app/contacts \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"instance_id": "550e8400-e29b-41d4-a716-446655440000",
"phone_number": "+5511999999999",
"name": "John Doe",
"email": "john@example.com",
"company": "Acme Inc",
"notes": "Met at conference"
}'
/contacts/{id}
Retorna detalhes de um contato específico.
/contacts/{id}
Atualiza um contato existente.
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
name |
string | Nome do contato |
email |
string | E-mail do contato |
company |
string | Empresa do contato |
notes |
string | Observações sobre o contato |
/contacts/{id}
Exclui um contato.
/contacts/import
Importa múltiplos contatos de uma vez.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
instance_id |
string | Sim | ID da instância |
contacts |
array | Sim | Array de objetos de contato |
Exemplo
curl -X POST https://instance-{id}.zapini.app/contacts/import \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"instance_id": "550e8400-e29b-41d4-a716-446655440000",
"contacts": [
{"phone_number": "+5511999999999", "name": "John Doe"},
{"phone_number": "+5511888888888", "name": "Jane Smith"}
]
}'
Resposta
{
"success": true,
"message": "Contacts imported successfully",
"data": {
"imported": 2,
"skipped": 0,
"errors": []
}
}
/contacts/export
Exporta contatos em formato JSON ou CSV.
Parâmetros de Consulta
| Campo | Tipo | Descrição |
|---|---|---|
instance_id |
string | Filtrar por instância (UUID) |
format |
string | json, csv (default: json) |
Exemplo
curl -X GET "https://instance-{id}.zapini.app/contacts/export?format=csv" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
Webhooks
Sistema de Webhooks
Webhooks permitem que você receba notificações em tempo real sobre eventos nas suas instâncias do WhatsApp.
Webhooks de Entrada
URLs que o Zapini usa para receber dados das suas instâncias WhatsApp.
Webhooks de Saída
URLs que você configura para receber notificações do Zapini.
Webhooks de Saída
Receba notificações em tempo real no seu servidor
Configure webhooks para receber notificações em tempo real quando eventos ocorrerem na sua instância do WhatsApp. O Zapini enviará requisições HTTP POST para sua URL configurada com os dados do evento.
Como Configurar
- Vá para as configurações do seu Token de API e clique em "Configurar Webhook"
- Insira sua URL de webhook (deve ser HTTPS em produção)
- Gere ou insira uma chave secreta para verificação de assinatura
- Selecione quais eventos deseja receber e salve
Eventos Disponíveis
| Evento | Descrição |
|---|---|
message.received |
Nova mensagem recebida |
message.sent |
Mensagem enviada |
message.status |
Status da mensagem alterado (enviada, entregue, lida) |
instance.connected |
Instância conectou ao WhatsApp |
instance.disconnected |
Instância desconectou |
instance.qr |
Novo QR code gerado |
Entendendo os IDs de Mensagem
Cada mensagem tem dois identificadores. Use o correto dependendo do seu caso de uso:
| Campo | Formato | Uso |
|---|---|---|
message_id |
UUID (e.g., 055f01b2-da7b-476b-...) |
Chave primária para deduplicação e rastreamento no seu sistema |
whatsapp_message_id |
WhatsApp ID (e.g., 3EB0ABC123456789) |
Necessário para reações, respostas e operações do WhatsApp |
Dica: Como evitar duplicatas
Armazene o message_id quando receber um webhook. Antes de processar novos webhooks, verifique se o message_id já existe no seu banco de dados. Se existir, atualize o registro existente em vez de criar um novo.
Formato da Requisição
Cada requisição de webhook é enviada como HTTP POST com os seguintes headers:
POST https://your-server.com/webhook
Content-Type: application/json
X-Webhook-Signature: a1b2c3d4e5f6...
X-Webhook-Event: message.received
X-Instance-UUID: 550e8400-e29b-41d4-a716-446655440000
User-Agent: Zapini-Webhook/1.0
Headers do Webhook
| Header | Descrição |
|---|---|
X-Webhook-Signature |
Assinatura HMAC-SHA256 do payload JSON usando sua chave secreta |
X-Webhook-Event |
O tipo de evento que disparou este webhook |
X-Instance-UUID |
UUID da instância do WhatsApp |
User-Agent |
Zapini-Webhook/1.0 |
Exemplos de Payload
message.received
{
"event": "message.received",
"instance_uuid": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2025-01-15T10:30:00+00:00",
"data": {
"message_id": "055f01b2-da7b-476b-9a5d-dcecb3fe510c",
"whatsapp_message_id": "3EB0ABC123456789",
"sender_number": "5511999999999",
"sender_name": "John Doe",
"content": "Hello, I need help!",
"media_type": null,
"media_url": null,
"timestamp": "2025-01-15T10:30:00+00:00",
"conversation_id": 123
}
}
message.sent
{
"event": "message.sent",
"instance_uuid": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2025-01-15T10:31:00+00:00",
"data": {
"message_id": "f4a2e8c9-7b3d-4e5f-8a1c-2d9e6f0a3b7c",
"whatsapp_message_id": "3EB0ABC123456789",
"recipient_number": "5511888888888",
"content": "Thanks for contacting us!",
"media_type": null,
"media_url": null,
"timestamp": "2025-01-15T10:31:00+00:00",
"conversation_id": 123
}
}
message.status
{
"event": "message.status",
"instance_uuid": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2025-01-15T10:32:00+00:00",
"data": {
"message_id": "f4a2e8c9-7b3d-4e5f-8a1c-2d9e6f0a3b7c",
"whatsapp_message_id": "3EB0ABC123456789",
"previous_status": "sent",
"new_status": "delivered",
"recipient_number": "5511888888888",
"timestamp": "2025-01-15T10:32:00+00:00"
}
}
instance.connected
{
"event": "instance.connected",
"instance_uuid": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2025-01-15T10:00:00+00:00",
"data": {
"previous_status": "qr_ready",
"new_status": "connected",
"phone_number": "5511999999999"
}
}
/webhooks/instance/{uuid}/incoming
Recebe mensagens de entrada das instâncias WhatsApp.
Formato do Payload
{
"remoteJid": "5511999999999@s.whatsapp.net",
"message": {
"conversation": "Hello, how are you?",
"extendedTextMessage": null,
"imageMessage": null,
"videoMessage": null,
"audioMessage": null,
"documentMessage": null
},
"messageTimestamp": 1705312200,
"pushName": "John Doe",
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": false,
"id": "3EB0ABC123456789"
},
"participant": null,
"isGroup": false
}
Tipos de Mensagem
| Tipo | Campo | Descrição |
|---|---|---|
| Text | message.conversation |
Mensagem de texto simples |
| Extended Text | message.extendedTextMessage |
Texto com preview de link |
| Image | message.imageMessage |
Imagem com legenda |
| Video | message.videoMessage |
Mensagem de vídeo |
| Audio | message.audioMessage |
Mensagem de áudio/voz |
| Document | message.documentMessage |
Arquivo/documento |
Exemplo - Mensagem de Texto
curl -X POST https://zapini.app/webhooks/instance/{uuid}/incoming \
-H "Content-Type: application/json" \
-d '{
"remoteJid": "5511999999999@s.whatsapp.net",
"message": {
"conversation": "Hello!"
},
"messageTimestamp": 1705312200,
"pushName": "Customer Name",
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"fromMe": false,
"id": "ABC123"
}
}'
/webhooks/instance/{uuid}/status
Recebe atualizações de status de mensagens enviadas.
Formato do Payload
{
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"id": "3EB0ABC123456789",
"fromMe": true
},
"status": 3,
"messageTimestamp": 1705312200
}
Códigos de Status
| Código | Status | Descrição |
|---|---|---|
1 |
pending | Mensagem pendente de envio |
2 |
sent | Mensagem enviada ao servidor |
3 |
delivered | Mensagem entregue ao destinatário |
4 |
read | Mensagem lida pelo destinatário |
5 |
played | Áudio/vídeo reproduzido |
/webhooks/instance/{uuid}/qr
Recebe atualizações de QR code para conexão.
Formato do Payload
{
"qr": "2@ABC123...",
"qr_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...",
"generated_at": "2025-01-15T10:30:00Z"
}
/webhooks/instance/{uuid}/connection
Recebe atualizações do status de conexão da instância.
Formato do Payload
{
"status": "connected",
"phone_number": "5511999999999",
"timestamp": "2025-01-15T10:30:00Z"
}
Status de Conexão
| Status | Descrição |
|---|---|
| connected | Instância conectada e funcionando |
| qr_ready | QR code pronto para escanear |
| disconnected | Instância desconectada |
| offline | Instância offline |
/webhooks/instance/{uuid}/reaction
Recebe reações emoji em mensagens.
Formato do Payload
{
"key": {
"remoteJid": "5511999999999@s.whatsapp.net",
"id": "3EB0ABC123456789",
"fromMe": false
},
"reaction": {
"text": "👍",
"key": {
"id": "3EB0DEF987654321"
}
},
"senderJid": "5511888888888@s.whatsapp.net"
}
/instances/{uuid}/webhook
Configure uma URL externa para receber notificações de eventos.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
webhook_url |
string | Sim | URL que receberá as notificações via POST |
webhook_secret |
string | Não | Chave secreta para assinatura das requisições |
events |
array | Não | Eventos que dispararão o webhook |
is_active |
boolean | Não | Ativar ou desativar o webhook |
Eventos Disponíveis
Exemplo
curl -X PUT https://instance-{id}.zapini.app/instances/550e8400-e29b-41d4-a716-446655440000/webhook \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"webhook_url": "https://your-server.com/webhook",
"webhook_secret": "your_secret_key_here",
"events": ["message.incoming", "message.status"],
"is_active": true
}'
Segurança de Webhooks
Todas as requisições de webhook incluem uma assinatura HMAC para verificação de autenticidade.
Verificação de Assinatura
Cada requisição inclui um header X-Webhook-Signature com a assinatura HMAC-SHA256 do payload.
Header:
X-Webhook-Signature: a1b2c3d4e5f6789...
Verificar Assinatura (PHP)
<?php
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$secret = 'your_webhook_secret';
$expected = hash_hmac('sha256', $payload, $secret);
if (hash_equals($expected, $signature)) {
// Signature is valid
$data = json_decode($payload, true);
// Process webhook...
} else {
http_response_code(401);
exit('Invalid signature');
}
Verificar Assinatura (Node.js)
const crypto = require('crypto');
app.post('/webhook', (req, res) => {
const signature = req.headers['x-webhook-signature'];
const secret = 'your_webhook_secret';
const payload = JSON.stringify(req.body);
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
if (crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
)) {
// Signature is valid
console.log('Webhook received:', req.body);
res.status(200).send('OK');
} else {
res.status(401).send('Invalid signature');
}
});
Boas Práticas
- Sempre verifique a assinatura antes de processar o webhook.
- Responda rapidamente (dentro de 5 segundos) para evitar timeouts.
- Use uma fila para processar webhooks de forma assíncrona.
- Implemente idempotência para lidar com webhooks duplicados.
- Registre todos os webhooks recebidos para depuração.
Mídia
Gerenciamento de Mídia
Envie e gerencie arquivos de mídia como imagens, vídeos, áudios e documentos.
/media/upload
Faz upload de um arquivo de mídia para uso posterior.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
file |
file | Sim | Arquivo de mídia para upload (multipart/form-data) |
type |
string | Não | image, video, audio, document (auto-detected) |
Exemplo
curl -X POST https://instance-{id}.zapini.app/media/upload \
-H "Authorization: Bearer {token}" \
-F "file=@/path/to/image.jpg" \
-F "type=image"
Resposta
{
"success": true,
"data": {
"id": "media_abc123xyz",
"url": "https://storage.zapini.app/media/abc123xyz.jpg",
"type": "image",
"mime_type": "image/jpeg",
"size": 102400,
"filename": "image.jpg",
"expires_at": "2025-01-22T10:30:00Z"
}
}
/media/{id}
Retorna informações de um arquivo de mídia.
Resposta
{
"success": true,
"data": {
"id": "media_abc123xyz",
"url": "https://storage.zapini.app/media/abc123xyz.jpg",
"type": "image",
"mime_type": "image/jpeg",
"size": 102400,
"filename": "image.jpg",
"created_at": "2025-01-15T10:30:00Z",
"expires_at": "2025-01-22T10:30:00Z"
}
}
/media/{id}
Exclui um arquivo de mídia.
Exemplo
curl -X DELETE https://instance-{id}.zapini.app/media/media_abc123xyz \
-H "Authorization: Bearer {token}"
/messages/send-media
Envia uma mensagem com mídia anexada.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
instance_id |
string | Sim | ID da instância |
recipient |
string | Sim | Número do WhatsApp do destinatário (com código do país) |
media_url |
string | Sim* | URL pública do arquivo de mídia |
media_id |
string | Sim* | ID de uma mídia previamente enviada via upload |
media_type |
string | Sim | image, video, audio, document |
caption |
string | Não | Legenda para imagens e vídeos |
filename |
string | Não | Nome do arquivo para documentos |
* Forneça media_url OU media_id
Exemplo - Imagem
curl -X POST https://instance-{id}.zapini.app/messages/send-media \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"instance_id": "550e8400-e29b-41d4-a716-446655440000",
"recipient": "+5511999999999",
"media_url": "https://example.com/image.jpg",
"media_type": "image",
"caption": "Check this image!"
}'
Exemplo - Documento
curl -X POST https://instance-{id}.zapini.app/messages/send-media \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"instance_id": "550e8400-e29b-41d4-a716-446655440000",
"recipient": "+5511999999999",
"media_url": "https://example.com/report.pdf",
"media_type": "document",
"filename": "Monthly_Report.pdf",
"caption": "Here is the monthly report"
}'
Limites de Mídia
| Tipo | Tamanho Máximo | Formatos |
|---|---|---|
| Imagens | 16 MB | jpg, jpeg, png, gif, webp |
| Vídeos | 64 MB | mp4, 3gp, mov, avi, mkv |
| Áudio | 16 MB | mp3, ogg, wav, opus, aac, m4a |
| Documentos | 100 MB | pdf, doc, docx, xls, xlsx, ppt, pptx, txt, zip |
/messages/{uuid}/media
Faz download de mídia recebida em uma mensagem.
Exemplo
curl -X GET https://instance-{id}.zapini.app/messages/660e8400-e29b-41d4-a716-446655440001/media \
-H "Authorization: Bearer {token}" \
--output downloaded_media.jpg
Resposta
Retorna o arquivo binário com o Content-Type apropriado.
Grupos
Gerencie grupos do WhatsApp através da API. Crie grupos, adicione/remova participantes, atualize configurações e muito mais.
/instances/{uuid}/groups
Retorna todos os grupos do WhatsApp da instância.
Exemplo
curl -X GET "https://instance-{id}.zapini.app/instances/{uuid}/groups" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
Resposta
{
"success": true,
"data": {
"groups": [
{
"jid": "120363001234567890@g.us",
"subject": "Marketing Team",
"owner": "5511987654321@s.whatsapp.net",
"size": 25,
"description": "Team discussions"
}
],
"total": 5
}
}
/instances/{uuid}/groups
Cria um novo grupo do WhatsApp.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
subject |
string | Sim | api-docs.group_subject_desc |
participants |
array | Sim | api-docs.group_participants_desc |
Exemplo
curl -X POST "https://instance-{id}.zapini.app/instances/{uuid}/groups" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"subject": "My New Group",
"participants": ["5511987654321", "5511976543210"]
}'
Resposta
{
"success": true,
"data": {
"group": {
"jid": "120363001234567890@g.us",
"subject": "My New Group"
},
"message": "Group created successfully"
}
}
/instances/{uuid}/groups/{jid}
Retorna metadados detalhados de um grupo específico.
Resposta
{
"success": true,
"data": {
"jid": "120363001234567890@g.us",
"subject": "Marketing Team",
"description": "Team discussions",
"owner": "5511987654321@s.whatsapp.net",
"participants": [
{"jid": "5511987654321@s.whatsapp.net", "admin": "superadmin"},
{"jid": "5511976543210@s.whatsapp.net", "admin": null}
],
"size": 25
}
}
/instances/{uuid}/groups/{jid}
Atualiza o nome e/ou descrição do grupo.
Corpo da Requisição
| Campo | Tipo | Descrição |
|---|---|---|
subject |
string | Novo nome do grupo |
description |
string | Nova descrição do grupo |
Exemplo
curl -X PATCH "https://instance-{id}.zapini.app/instances/{uuid}/groups/{jid}" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"subject": "New Group Name",
"description": "Updated description"
}'
/instances/{uuid}/groups/{jid}/participants
Adiciona um ou mais participantes ao grupo.
Exemplo
curl -X POST "https://instance-{id}.zapini.app/instances/{uuid}/groups/{jid}/participants" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"participants": ["5511987654321", "5511976543210"]
}'
/instances/{uuid}/groups/{jid}/participants
Remove um ou mais participantes do grupo.
Exemplo
curl -X DELETE "https://instance-{id}.zapini.app/instances/{uuid}/groups/{jid}/participants" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"participants": ["5511987654321"]
}'
/instances/{uuid}/groups/{jid}/admins
api-docs.groups_promote_desc
Exemplo
curl -X POST "https://instance-{id}.zapini.app/instances/{uuid}/groups/{jid}/admins" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"participants": ["5511987654321"]
}'
/instances/{uuid}/groups/{jid}/admins
api-docs.groups_demote_desc
Exemplo
curl -X DELETE "https://instance-{id}.zapini.app/instances/{uuid}/groups/{jid}/admins" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"participants": ["5511987654321"]
}'
/instances/{uuid}/groups/{jid}/leave
Faz a instância sair de um grupo.
Exemplo
curl -X POST "https://instance-{id}.zapini.app/instances/{uuid}/groups/{jid}/leave" \
-H "Authorization: Bearer {token}"
/instances/{uuid}/groups/{jid}/invite
api-docs.groups_invite_get_desc
Resposta
{
"success": true,
"data": {
"code": "AbCdEfGhIjKl",
"invite_link": "https://chat.whatsapp.com/AbCdEfGhIjKl"
}
}
/instances/{uuid}/groups/{jid}/invite
api-docs.groups_invite_revoke_desc
Resposta
{
"success": true,
"data": {
"new_code": "MnOpQrStUvWx",
"new_invite_link": "https://chat.whatsapp.com/MnOpQrStUvWx"
},
"message": "Invite link revoked"
}
Tags
Gerencie tags de conversas para organizar e categorizar chats. Tags são escopadas por tenant e podem ser atribuídas a múltiplas conversas.
/tags
Lista todas as tags do tenant atual.
Exemplo
curl -X GET "https://instance-{id}.zapini.app/tags" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
Resposta
{
"success": true,
"data": {
"tags": [
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"name": "VIP",
"color": "#f59e0b",
"conversations_count": 15,
"created_at": "2025-01-15T10:30:00Z",
"updated_at": "2025-01-15T10:30:00Z"
},
{
"id": "550e8400-e29b-41d4-a716-446655440002",
"name": "Support",
"color": "#3b82f6",
"conversations_count": 42,
"created_at": "2025-01-15T10:35:00Z",
"updated_at": "2025-01-15T10:35:00Z"
}
]
}
}
/tags
Cria uma nova tag.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
name |
string | Sim | Nome da tag (único por tenant) (max 50) |
color |
string | Sim | Código de cor hexadecimal para a tag (#RRGGBB) |
Exemplo
curl -X POST "https://instance-{id}.zapini.app/tags" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"name": "Important",
"color": "#ef4444"
}'
Resposta
{
"success": true,
"message": "Tag created successfully",
"data": {
"tag": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"name": "Important",
"color": "#ef4444",
"conversations_count": 0,
"created_at": "2025-01-15T12:00:00Z",
"updated_at": "2025-01-15T12:00:00Z"
}
}
}
/tags/{uuid}
Retorna detalhes de uma tag específica.
Exemplo
curl -X GET "https://instance-{id}.zapini.app/tags/550e8400-e29b-41d4-a716-446655440001" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
/tags/{uuid}
Atualiza uma tag existente.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
name |
string | Não | Nome da tag (único por tenant) (max 50) |
color |
string | Não | Código de cor hexadecimal para a tag (#RRGGBB) |
Exemplo
curl -X PATCH "https://instance-{id}.zapini.app/tags/550e8400-e29b-41d4-a716-446655440001" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"name": "Very Important",
"color": "#dc2626"
}'
/tags/{uuid}
Exclui uma tag. A tag será automaticamente removida de todas as conversas.
Exemplo
curl -X DELETE "https://instance-{id}.zapini.app/tags/550e8400-e29b-41d4-a716-446655440001" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
Resposta
{
"success": true,
"message": "Tag deleted successfully"
}
/conversations/{uuid}/tags
Atualiza as tags atribuídas a uma conversa. Isso substitui todas as tags existentes pela lista fornecida.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tag_ids |
array | Sim | Array de UUIDs de tags para atribuir à conversa |
Exemplo
curl -X PUT "https://instance-{id}.zapini.app/conversations/550e8400-e29b-41d4-a716-446655440000/tags" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"tag_ids": ["550e8400-e29b-41d4-a716-446655440001", "550e8400-e29b-41d4-a716-446655440002"]
}'
Resposta
{
"success": true,
"message": "Conversation tags updated",
"data": {
"tags": [
{"id": "550e8400-e29b-41d4-a716-446655440001", "name": "VIP", "color": "#f59e0b"},
{"id": "550e8400-e29b-41d4-a716-446655440002", "name": "Support", "color": "#3b82f6"},
{"id": "550e8400-e29b-41d4-a716-446655440003", "name": "Important", "color": "#ef4444"}
]
}
}
Para remover todas as tags de uma conversa, envie um array vazio: {"tag_ids": []}
Chat API
OTIMIZADO PARA UIEndpoints otimizados para criar interfaces de chat tipo WhatsApp. Retorna dados pré-formatados com @menções resolvidas, reações agrupadas e helpers de alinhamento.
formatted_body
@menções pré-resolvidas em formato HTML
grouped_reactions
Reações agrupadas com contagem
is_from_me
Alinhamento fácil com is_from_me
tags
Tags das conversas incluídas
A Chat API retorna os mesmos dados dos endpoints padrão, mas com campos adicionais otimizados para renderização de UI. Você também pode usar ?format=chat nos endpoints padrão.
/api/v1/conversations?format=chat
/api/v1/chat/conversations
Lista conversas com tags, fotos de perfil e contagem de não lidas otimizada para UI de lista de chat.
Parâmetros de Consulta
| Campo | Tipo | Descrição |
|---|---|---|
instance_id |
string | Filtrar por instância (UUID) |
search |
string | Buscar por nome ou número |
unread |
boolean | Mostrar apenas conversas não lidas |
per_page |
integer | Itens por página (max 100) |
Exemplo
curl -X GET "https://zapini.app/api/v1/chat/conversations?unread=true" \
-H "Authorization: Bearer {token}"
Resposta
{
"success": true,
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440045",
"contact_number": "5521999999999",
"display_name": "John Doe",
"is_group": false,
"profile_picture_url": "https://...",
"last_message": "Hello!",
"last_message_at": "2025-12-16T10:00:00Z",
"unread_count": 3,
"tags": [
{"id": "bf287f4d-037c-4280-8413-c7b7d08df5a0", "name": "VIP", "color": "#f59e0b"}
],
"instance": {
"uuid": "21ed5c9b-51a0-4569-85db-05433ea414b7",
"phone_number": "5511988887777",
"status": "connected"
}
}
],
"meta": {
"pagination": {
"total": 50,
"per_page": 15,
"current_page": 1,
"last_page": 4
}
}
}
/api/v1/chat/conversations/{uuid}/messages
Retorna mensagens com formatted_body (@menções resolvidas) e reações agrupadas.
Parâmetros de Consulta
| Campo | Tipo | Descrição |
|---|---|---|
before_id |
integer | Mensagens antes deste ID |
after_id |
integer | Mensagens após este ID |
limit |
integer | Limite de mensagens (max 100) |
Exemplo
curl -X GET "https://zapini.app/api/v1/chat/conversations/550e8400-e29b-41d4-a716-446655440045/messages?limit=50" \
-H "Authorization: Bearer {token}"
Resposta
{
"success": true,
"data": {
"messages": [
{
"id": 456,
"unique_id": "msg-abc-123",
"direction": "incoming",
"is_from_me": false,
"message_body": "Ola @5521999999999!",
"formatted_body": "Ola <span class=\"mention\" data-phone=\"5521999999999\">@John Doe</span>!",
"mentioned_jids": ["5521999999999@s.whatsapp.net"],
"sender_name": "Maria",
"status": "read",
"grouped_reactions": [
{
"emoji": "👍",
"count": 2,
"has_my_reaction": true,
"reactors": ["5521988887777", "5521966665555"],
"reactor_names": ["Carlos", "Ana"]
}
],
"created_at": "2025-12-16T10:00:00Z"
}
],
"has_more": true,
"oldest_id": 400,
"newest_id": 456
}
}
Recursos Principais
formatted_body
Texto da mensagem com @menções resolvidas para nomes de contatos. Retorna HTML com spans clicáveis.
Olá @João Silva!
is_from_me
Boolean indicando se a mensagem foi enviada pela sua instância. Use para alinhamento de mensagens.
grouped_reactions
Reações agrupadas por emoji com contagens e informações dos reagentes.
{"emoji": "👍", "count": 2, "has_my_reaction": true}
mentioned_jids
Array de JIDs do WhatsApp mencionados na mensagem.
/api/v1/chat/send
Envia uma mensagem de texto e retorna a mensagem em formato otimizado para chat.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
instance_id |
string | Sim | UUID da instância (obrigatório) |
recipient |
string | Sim | Número de telefone do destinatário com código do país |
message |
string | Sim | Conteúdo da mensagem de texto |
reply_to |
string | Não | ID da mensagem para responder |
Exemplo
curl -X POST "https://zapini.app/api/v1/chat/send" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"instance_id": "18",
"recipient": "5521999999999",
"message": "Hello from Chat API!"
}'
/api/v1/chat/send-media
Envia mídia (imagem, vídeo, áudio, documento) e retorna resposta otimizada para chat.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
instance_id |
string | Sim | UUID da instância (obrigatório) |
recipient |
string | Sim | Número de telefone do destinatário com código do país |
media_url |
string | Sim | URL do arquivo de mídia a enviar |
media_type |
string | Sim | Tipo de mídia (image, video, audio, document) |
caption |
string | Não | Legenda para imagem/vídeo |
Exemplo
curl -X POST "https://zapini.app/api/v1/chat/send-media" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"instance_id": "18",
"recipient": "5521999999999",
"media_url": "https://example.com/image.jpg",
"media_type": "image",
"caption": "Check this out!"
}'
/api/v1/chat/messages/{uuid}
Edita o conteúdo de uma mensagem enviada.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
message |
string | Sim | Novo conteúdo da mensagem |
Exemplo
curl -X PATCH "https://zapini.app/api/v1/chat/messages/msg-abc-123" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"message": "Updated message content"}'
/api/v1/chat/messages/{uuid}
Exclui uma mensagem enviada.
Exemplo
curl -X DELETE "https://zapini.app/api/v1/chat/messages/msg-abc-123" \
-H "Authorization: Bearer {token}"
/api/v1/chat/messages/{uuid}/reaction
Adiciona uma reação emoji a uma mensagem.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
emoji |
string | Sim | Emoji para reagir |
Exemplo
curl -X POST "https://zapini.app/api/v1/chat/messages/msg-abc-123/reaction" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"emoji": "👍"}'
/api/v1/chat/messages/{uuid}/reaction
Remove uma reação de uma mensagem.
Exemplo
curl -X DELETE "https://zapini.app/api/v1/chat/messages/msg-abc-123/reaction" \
-H "Authorization: Bearer {token}"
/api/v1/chat/conversations/{uuid}/mark-read
Marca uma conversa como lida.
Exemplo
curl -X POST "https://zapini.app/api/v1/chat/conversations/550e8400-e29b-41d4-a716-446655440045/mark-read" \
-H "Authorization: Bearer {token}"
/api/v1/chat/conversations/{uuid}/archive
Arquiva uma conversa.
Exemplo
curl -X POST "https://zapini.app/api/v1/chat/conversations/550e8400-e29b-41d4-a716-446655440045/archive" \
-H "Authorization: Bearer {token}"
Resposta
{
"success": true,
"message": "Conversation archived.",
"data": {
"archived_id": "550e8400-e29b-41d4-a716-446655440045",
"archived_at": "2025-12-29T12:00:00.000000Z"
}
}
/api/v1/chat/conversations/{uuid}/archive
Restaura uma conversa arquivada para status ativo.
O UUID deve ser de uma conversa arquivada. Use GET /conversations/archived para listar conversas arquivadas.
Exemplo
curl -X DELETE "https://zapini.app/api/v1/chat/conversations/550e8400-e29b-41d4-a716-446655440045/archive" \
-H "Authorization: Bearer {token}"
Resposta
{
"success": true,
"message": "Conversation restored.",
"data": {
"conversation_id": "550e8400-e29b-41d4-a716-446655440045",
"restored": true
}
}
/api/v1/chat/conversations/{uuid}/pause-automation
Pausar a automação de uma conversa para permitir envio de mensagens manuais.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
reason |
string | Não | Motivo opcional para pausar a automação |
Exemplo
curl -X POST "https://zapini.app/api/v1/chat/conversations/550e8400-e29b-41d4-a716-446655440045/pause-automation" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"reason": "Manual takeover"}'
/api/v1/chat/conversations/{uuid}/resume-automation
Retomar a automação de uma conversa, devolvendo o controle ao sistema automatizado.
Exemplo
curl -X POST "https://zapini.app/api/v1/chat/conversations/550e8400-e29b-41d4-a716-446655440045/resume-automation" \
-H "Authorization: Bearer {token}"
Automações
IMPORTANTEAviso Importante sobre Automações
Se sua instância tem automações (fluxos ou integrações) ativas, o envio de mensagens via API pode ser bloqueado. Leia esta seção para entender como funciona.
O que são Automações?
Automações são fluxos automatizados que respondem mensagens automaticamente. O sistema possui dois tipos de automação:
Fluxos
Fluxos de conversação criados no editor visual que respondem automaticamente baseado em regras e condições.
Integrações
Conexões com sistemas externos (webhooks, APIs, IA) que processam e respondem mensagens automaticamente.
Bloqueio de Mensagens
Quando uma conversa tem automação ativa, o envio de mensagens pela API é bloqueado para evitar conflitos entre respostas automáticas e manuais.
Resposta de Erro
{
"success": false,
"error": {
"code": "AUTOMATION_ACTIVE",
"message": "Cannot send messages. This conversation has active automation. Pause the automation first to send messages manually.",
"conversation_id": 123
}
}
Quando o Envio é Bloqueado?
- • A instância tem um fluxo ou integração ativa
- • A conversa não foi pausada manualmente
- • A conversa ainda está sendo gerenciada pela automação
Como Enviar Mensagens com Automação Ativa
Para enviar mensagens manualmente quando há automação ativa, você precisa pausar a automação para a conversa específica:
Verifique o Status
Use o endpoint de detalhes da conversa para verificar o campo automation_status.
Pause a Automação
Se automation_status for "active", use o endpoint de pausa para permitir mensagens manuais.
Envie a Mensagem
Após pausar, você pode enviar mensagens normalmente via API.
/api/v1/chat/conversations/{uuid}
Verifique o status de automação de uma conversa antes de tentar enviar mensagens.
Campos de Resposta
| Campo | Tipo | Descrição |
|---|---|---|
automation_status |
string | Status atual da automação (active ou paused) |
can_send_manual_message |
boolean | Se você pode enviar mensagens manuais |
automation_paused_at |
datetime|null | Data/hora de quando a automação foi pausada |
Valores de Status
| Status | Descrição | Pode Enviar via API? |
|---|---|---|
active |
Automação está respondendo mensagens automaticamente | Não |
paused |
Automação pausada, usuário assumiu o controle | Sim |
/api/v1/chat/conversations/{uuid}/pause-automation
Pausa a automação para permitir envio de mensagens manuais via API.
Corpo da Requisição (optional)
| Campo | Tipo | Descrição |
|---|---|---|
reason |
string | Motivo opcional para pausar (ex.: "Intervenção manual necessária") |
Exemplo
curl -X POST https://instance-{id}.zapini.app/api/v1/chat/conversations/a1b2c3d4-e5f6-7890-abcd-ef1234567890/pause-automation \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"reason": "Manual intervention required"}'
Exemplo de Resposta
{
"success": true,
"message": "Automation paused successfully",
"data": {
"conversation_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"automation_paused": true,
"paused_at": "2025-01-15T10:30:00+00:00",
"paused_by": "John Doe",
"reason": "Manual intervention required"
}
}
/api/v1/chat/conversations/{uuid}/resume-automation
Retoma a automação, devolvendo o controle ao sistema automatizado.
Exemplo
curl -X POST https://instance-{id}.zapini.app/api/v1/chat/conversations/a1b2c3d4-e5f6-7890-abcd-ef1234567890/resume-automation \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json"
Exemplo de Resposta
{
"success": true,
"message": "Automation resumed successfully",
"data": {
"conversation_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"automation_paused": false,
"resumed_at": "2025-01-15T11:00:00+00:00"
}
}
Operações em Lote
Pause ou retome a automação de múltiplas conversas de uma vez. Útil para manutenção, campanhas ou processamento em lote. Máximo de 100 conversas por requisição.
/api/v1/conversations/automation/bulk-pause
Pausa a automação de múltiplas conversas de uma vez. Ignora conversas que já estão pausadas ou não têm automação ativa.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
conversation_ids |
array | Sim | Array de UUIDs de conversas (máx 100) |
reason |
string | Não | Motivo opcional para pausar (ex.: "Intervenção manual necessária") |
Exemplo
curl -X POST https://instance-{id}.zapini.app/api/v1/conversations/automation/bulk-pause \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"conversation_ids": [
"a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"b2c3d4e5-f6a7-8901-bcde-f12345678901"
],
"reason": "Bulk pause for maintenance"
}'
Resposta
{
"success": true,
"message": "2 conversations paused",
"data": {
"paused": 2,
"skipped": 0,
"errors": 0
}
}
/api/v1/conversations/automation/bulk-resume
Retoma a automação de múltiplas conversas de uma vez. Ignora conversas que não estão pausadas ou não têm automação ativa.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
conversation_ids |
array | Sim | Array de UUIDs de conversas (máx 100) |
Exemplo
curl -X POST https://instance-{id}.zapini.app/api/v1/conversations/automation/bulk-resume \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"conversation_ids": [
"a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"b2c3d4e5-f6a7-8901-bcde-f12345678901"
]
}'
Resposta
{
"success": true,
"message": "2 automations resumed",
"data": {
"resumed": 2,
"skipped": 0,
"errors": 0
}
}
Boas Práticas
- Sempre verifique can_send_manual_message antes de enviar mensagens para evitar erros.
- Pause a automação apenas quando necessário para intervenção humana.
- Retome a automação após o atendimento manual para manter a experiência consistente.
Pronto para Começar?
Crie sua conta agora e comece a integrar o WhatsApp em suas aplicações com nossa API poderosa e fácil de usar.