Documentação da API
API REST sob https://api.zapinapi.duckdns.org/v1, JSON, autenticada por Authorization: Bearer. Eventos chegam ao seu sistema por webhook assinado com HMAC. Referência gerada do contrato OpenAPI (ZapinApi v1).
Situação do serviço: página de status.
Início rápido
1. Crie a conta e uma instância
No painel, em Instâncias → Criar instância. O token da instância (wai_…) aparece uma única vez: guarde-o como senha.
2. Leia o QR Code
A tela mostra o QR Code ao vivo. No celular: WhatsApp → Dispositivos conectados → Conectar dispositivo. Quando conectar, o estado vira connected.
3. Envie a primeira mensagem
Chame POST /v1/instances/{id}/messages/text com o token no Authorization.
4. Receba eventos
Configure a URL do webhook (painel ou PUT /v1/instances/{id}/webhook) e valide a assinatura HMAC de cada entrega.
export TOKEN=wai_... # token da instância
export INSTANCE_ID=inst_... # ID público da instância
# Estado (connected quando o QR Code foi lido)
curl "https://api.zapinapi.duckdns.org/v1/instances/$INSTANCE_ID/status" -H "Authorization: Bearer $TOKEN"
# Enviar texto
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/$INSTANCE_ID/messages/text" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"to": "5511999999999", "text": "Olá!"}'Para automatizar a criação de instâncias, use uma API key (crie em Painel → Integração):
# Com uma API key da organização (escopo instances:manage)
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Atendimento"}'
# 201 {"id":"inst_…","status":"disconnected","token":"wai_…", ...} ← token só aqui
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/$INSTANCE_ID/connect" -H "Authorization: Bearer $API_KEY"
curl "https://api.zapinapi.duckdns.org/v1/instances/$INSTANCE_ID/qrcode" -H "Authorization: Bearer $API_KEY" -o qr.pngAutenticação
| Credencial | Formato | Para quê |
|---|---|---|
| Token da instância | wai_<id>_… | Integrações que operam um número: envio, conversas, contatos, grupos, webhook e estado daquela instância. Outra instância responde 404. |
| API key da organização | wa_live_… | Automação da conta: criar e apagar instâncias, ler assinatura. Escopos: messages:send, messages:read, groups:write, contacts:read, instances:manage, billing:read. Aceita também X-Api-Key. |
| Sessão do painel | JWT (10 min) | Usada pelo painel. API keys e equipe só podem ser geridas com ela. |
Credenciais aparecem uma única vez (ao criar ou rotacionar). No banco ficam só como hash. Escopo ausente responde 403 insufficient_scope.
Webhooks
Configure por instância a URL (https pública), os eventos (nenhum = todos) e receba um segredo whsec_… exibido uma vez. Cada evento é um POST com corpo JSON e os cabeçalhos:
| Cabeçalho | Valor |
|---|---|
| X-Webhook-Id | eventId (estável entre tentativas) |
| Idempotency-Key | eventId |
| X-Webhook-Timestamp | segundos Unix desta tentativa |
| X-Webhook-Signature | sha256= + hex(HMAC-SHA256(segredo, timestamp + "." + corpo cru)) |
| X-Instance-Id | ID público da instância |
| X-Webhook-Event / X-Webhook-Attempt | nome do evento / número da tentativa (informativos) |
{
"eventId": "8f0d1c9e-5d0b-4a43-9a52-1f7d2f3c6b11",
"event": "message.received",
"instanceId": "inst_3b7f0c2a9d8e4f6a8b1c2d3e4f5a6b7c",
"sequence": 42,
"timestamp": "2026-10-21T05:17:45.123Z",
"data": {
"messageId": "3EB0C4F1A2B3", "chatId": "5511988887777", "from": "5511988887777",
"fromMe": false, "isGroup": false, "pushName": "Ana", "type": "text", "text": "Olá!",
"timestamp": "2026-10-21T05:17:44Z"
}
}| Evento | Quando |
|---|---|
| message.received / message.sent | mensagem recebida ou enviada (texto, mídia, localização, contato, enquete) |
| message.status | entregue, lida ou reproduzida |
| message.reaction | reação a uma mensagem |
| poll.vote | voto em enquete |
| button.reply / list.reply | resposta a botões ou lista |
| group.participants.updated | participante adicionado, removido, promovido ou rebaixado |
| instance.connected / instance.disconnected / instance.qrcode | mudança de estado e QR Code novo (o QR em si só por GET …/qrcode) |
- Só HTTP 2xx confirma. 3xx (redirecionamentos não são seguidos), 4xx, 5xx, timeout e erro de rede voltam a tentar com backoff exponencial até 5 min.
- Depois de 10 falhas a entrega vai para a DLQ e só é reenviada sob pedido (painel ou
POST …/deliveries/{eventId}/retry). - Pelo menos uma vez: deduplique por
eventId; a ordem de chegada não é garantida, ordene porsequence. - A URL não pode apontar para rede privada, loopback ou metadados de nuvem.
- Rotacionar o segredo vale a partir da próxima tentativa, sem período de convivência.
Valide a assinatura sobre o corpo cru (antes de interpretar o JSON) e recuse timestamps com mais de 5 minutos de diferença:
import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody: o corpo exatamente como recebido (string/Buffer), antes de JSON.parse
export function verify(secret, headers, rawBody) {
const ts = headers["x-webhook-timestamp"];
const sig = headers["x-webhook-signature"] ?? "";
if (!/^\d+$/.test(ts ?? "") || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false; // replay
const expected = "sha256=" + createHmac("sha256", secret).update(ts + "." + rawBody).digest("hex");
return expected.length === sig.length && timingSafeEqual(Buffer.from(expected), Buffer.from(sig));
}using System.Security.Cryptography;
using System.Text;
static bool Verify(string secret, string timestamp, string signature, byte[] rawBody)
{
if (!long.TryParse(timestamp, out var ts) ||
Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - ts) > 300) return false; // replay
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var prefix = Encoding.UTF8.GetBytes(timestamp + ".");
var data = new byte[prefix.Length + rawBody.Length];
prefix.CopyTo(data, 0);
rawBody.CopyTo(data, prefix.Length);
var expected = Encoding.ASCII.GetBytes("sha256=" + Convert.ToHexString(hmac.ComputeHash(data)).ToLowerInvariant());
return CryptographicOperations.FixedTimeEquals(expected, Encoding.ASCII.GetBytes(signature ?? ""));
}Erros
Todo erro é application/problem+json com type, title, status, detail e code. Trate pelo code; o texto pode mudar.
HTTP/1.1 402 Payment Required
Content-Type: application/problem+json
{
"type": "https://docs.whatsapp-api.invalid/errors/instance_limit_reached",
"title": "Payment Required",
"status": 402,
"detail": "Limite de instâncias do plano atingido.",
"code": "instance_limit_reached"
}| Status | code | Significado |
|---|---|---|
| 400 | invalid_body, text_required, invalid_recipient… | Corpo ou parâmetro inválido. Corrija antes de repetir. |
| 401 | unauthorized | Credencial ausente, inválida, revogada ou expirada. |
| 402 | instance_limit_reached, subscription_required, subscription_suspended | Assinatura não permite (cota de instâncias, sem plano, suspensa). |
| 403 | insufficient_scope, pro_feature_required, instance_token_not_allowed | Credencial sem permissão; recurso PRO traz upgradeUrl. |
| 404 | instance_not_found | Inexistente — ou de outra organização (resposta idêntica). |
| 409 | instance_not_connected, idempotency_request_in_progress | Estado não permite agora. |
| 422 | idempotency_key_reused | Mesma Idempotency-Key com corpo diferente. |
| 429 | rate_limited | Acima do limite por minuto. Respeite Retry-After. |
| 503 / 504 | node_unavailable, node_timeout | Servidor da instância fora ou lento. 504 = desfecho incerto: não reenvie às cegas. |
Paginação
Listas usam cursor: limit e after na consulta, nextCursor na resposta. Passe o nextCursor como after até ele vir null (ou 0 em conversas e entregas). Entregas aceitam também status (pending|processing|delivered|dead).
GET /v1/instances?limit=50
→ {"items":[…], "nextCursor":"inst_…"}
GET /v1/instances?limit=50&after=inst_…
→ {"items":[…], "nextCursor":null} # fimIdempotência
Envie Idempotency-Key (até 255 caracteres; um UUID por mensagem) em todo POST …/messages/* e DELETE …/messages/{messageId}. Por 24 h, repetir a mesma chave com o mesmo pedido devolve a mesma resposta com Idempotent-Replayed: true, sem novo envio. Corpo diferente: 422 idempotency_key_reused; ainda em andamento: 409 idempotency_request_in_progress. Respostas 4xx liberam a chave.
Um 504 é desfecho incerto (a mensagem pode ter saído): repita com a mesma chave, nunca com uma nova.
Limites
| Plano | Requisições | Instâncias |
|---|---|---|
| Teste grátis | 60 req/min | 1 instância |
| LITE | 60 req/min | conforme a quantidade contratada |
| PRO | 120 req/min | conforme a quantidade contratada |
| Escala | 300 req/min | sob contrato |
- O limite é por organização. Acima dele:
429 rate_limitedcomRetry-After(segundos). - Assinatura sem pagamento, suspensa ou sem vaga:
402. Recursos PRO (enquete, lista, botões, Pix) num plano sem PRO:403 pro_feature_requiredcomupgradeUrl. - Corpo da requisição até 96 MiB; mídia até 64 MiB (em base64, ~86 MiB).
- O QR Code se renova sozinho (60 s o primeiro, 20 s os seguintes, 6 códigos); esgotados, a instância fica
disconnectedcomreason=qr_expirede um novoconnectrecomeça. - Uso responsável: nada de spam ou disparo em massa. O WhatsApp pode banir o número.
Referência
Clique numa rota para ver parâmetros, exemplo e respostas. {id} é o ID público da instância (inst_…).
Instâncias
Criar, conectar por QR Code, consultar estado, rotacionar token e apagar.
GET/v1/instances/{id}/statusEstado vivo da instancia no no
Escopo exigido de API key ou token de instancia: `instances:manage`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/status" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instances/{id}/qrcodeQR Code de pareamento (image/png, ou JSON com ?format=base64)
Escopo exigido de API key ou token de instancia: `instances:manage`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/qrcode" \
-H "Authorization: Bearer $TOKEN"- 200 OK (image/png)
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/connectConectar (gera QR se nao pareada)
Escopo exigido de API key ou token de instancia: `instances:manage`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/connect" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/disconnectDesconectar mantendo a sessao
Escopo exigido de API key ou token de instancia: `instances:manage`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/disconnect" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/logoutDesvincular o aparelho e apagar a sessao
Escopo exigido de API key ou token de instancia: `instances:manage`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/logout" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instancesListar instancias (after/nextCursor)
Autenticação: API key (instances:manage) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| after | query | string | |
| limit | query | integer int32 |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances" \
-H "Authorization: Bearer $TOKEN"- 200 OK
POST/v1/instancesCriar instancia (inicia o teste gratis na primeira; token exibido uma vez)
Autenticação: API key (instances:manage) ou sessão do painel
Corpo (JSON): name: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Minha integração"}'- 201 Created
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instances/{id}Consultar instancia
Autenticação: API key (instances:manage) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID" \
-H "Authorization: Bearer $TOKEN"- 200 OK
DELETE/v1/instances/{id}Apagar instancia (desconecta, libera a vaga e purga no no)
Autenticação: API key (instances:manage) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X DELETE "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID" \
-H "Authorization: Bearer $TOKEN"- 204 No Content
POST/v1/instances/{id}/tokenRotacionar o token da instancia (o anterior deixa de valer; o novo aparece uma vez)
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/token" \
-H "Authorization: Bearer $TOKEN"- 201 Created
Mensagens
Envio (aceita Idempotency-Key), apagar, marcar como lida e presença.
POST/v1/instances/{id}/messages/textTexto
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/text" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","text":"Olá! Seu pedido saiu para entrega."}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/imageImagem (URL ou base64)
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/image" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","url":"https://exemplo.com.br/foto.jpg","caption":"Comprovante"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/audioAudio ou nota de voz
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/audio" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","url":"https://exemplo.com.br/audio.ogg","ptt":true}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/videoVideo
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/video" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","url":"https://exemplo.com.br/video.mp4","caption":"Tutorial"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/documentDocumento
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/document" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","url":"https://exemplo.com.br/boleto.pdf","fileName":"boleto.pdf"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/stickerFigurinha
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/sticker" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","url":"https://exemplo.com.br/figurinha.webp"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/locationLocalizacao
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/location" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","latitude":-23.5614,"longitude":-46.6559,"name":"Loja Paulista"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/contactContato (vCard)
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/contact" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","name":"Suporte","phone":"5511988887777"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/replyResponder citando
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/reply" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","text":"Combinado!","messageId":"3EB0C4F1A2B3"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/reactReagir
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/react" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","messageId":"3EB0C4F1A2B3","reaction":"👍"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/forwardEncaminhar
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/forward" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","messageId":"3EB0C4F1A2B3"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/pollEnquete (PRO)PRO
Escopo exigido de API key ou token de instancia: `messages:send`. Recurso PRO: plano sem PRO recebe 403 pro_feature_required com upgradeUrl.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/poll" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","question":"Melhor horário?","options":["Manhã","Tarde"],"selectableCount":1}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/listLista/menu (PRO)PRO
Escopo exigido de API key ou token de instancia: `messages:send`. Recurso PRO: plano sem PRO recebe 403 pro_feature_required com upgradeUrl.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/list" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","text":"Escolha uma opção","buttonText":"Ver opções","sections":[{"title":"Atendimento","rows":[{"id":"2via","title":"2ª via do boleto"},{"id":"humano","title":"Falar com atendente"}]}]}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/messages/pixCobranca Pix (PRO)PRO
Escopo exigido de API key ou token de instancia: `messages:send`. Recurso PRO: plano sem PRO recebe 403 pro_feature_required com upgradeUrl.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/pix" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","amount":12990,"merchantName":"Minha Loja","pixKey":"financeiro@exemplo.com.br","pixKeyType":"EMAIL"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
DELETE/v1/instances/{id}/messages/{messageId}Apagar para todos
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| Idempotency-Key | header | string | Ate 255 caracteres. Mesma chave + mesmo pedido em 24 h devolve a mesma resposta (Idempotent-Replayed: true); pedido diferente → 422. |
| messageId * | path | string |
curl -X DELETE "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/messages/$MESSAGEID" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/readMarcar como lidas
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/read" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"to":"5511999999999","messageIds":["3EB0C4F1A2B3"]}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/presencePresenca (digitando, gravando, online)
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/presence" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"state":"typing","to":"5511999999999"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
Webhook e entregas
Configuração do webhook, log de entregas e reenvio (inclusive da DLQ).
GET/v1/instances/{id}/webhookConfiguracao do webhook (sem o segredo)
Escopo exigido de API key ou token de instancia: `instances:manage`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/webhook" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
PUT/v1/instances/{id}/webhookConfigurar o webhook; o segredo aparece uma vez
Escopo exigido de API key ou token de instancia: `instances:manage`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X PUT "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/webhook" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://seu-sistema.com.br/webhooks/whatsapp","events":["message.received","message.status"],"rotateSecret":false}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instances/{id}/deliveriesLog de entregas (after/nextCursor)
Escopo exigido de API key ou token de instancia: `messages:read`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/deliveries" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instances/{id}/deliveries/{eventId}Uma entrega
Escopo exigido de API key ou token de instancia: `messages:read`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| eventId * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/deliveries/$EVENTID" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/deliveries/{eventId}/retryReenviar entrega (inclusive da DLQ)
Escopo exigido de API key ou token de instancia: `instances:manage`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| eventId * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/deliveries/$EVENTID/retry" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
Conversas
Histórico recebido e enviado, paginado por cursor.
GET/v1/instances/{id}/chatsConversas (after/nextCursor)
Escopo exigido de API key ou token de instancia: `messages:read`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/chats" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instances/{id}/chats/{phone}/messagesMensagens de uma conversa (after/nextCursor)
Escopo exigido de API key ou token de instancia: `messages:read`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| phone * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/chats/$PHONE/messages" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
Contatos
Contatos, verificação de número e bloqueio.
GET/v1/instances/{id}/contactsContatos
Escopo exigido de API key ou token de instancia: `contacts:read`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/contacts" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instances/{id}/contacts/{phone}Um contato
Escopo exigido de API key ou token de instancia: `contacts:read`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| phone * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/contacts/$PHONE" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instances/{id}/contacts/{phone}/existsNumero tem WhatsApp?
Escopo exigido de API key ou token de instancia: `contacts:read`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| phone * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/contacts/$PHONE/exists" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instances/{id}/contacts/{phone}/pictureFoto do contato
Escopo exigido de API key ou token de instancia: `contacts:read`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| phone * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/contacts/$PHONE/picture" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/contacts/{phone}/blockBloquear
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| phone * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/contacts/$PHONE/block" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/contacts/{phone}/unblockDesbloquear
Escopo exigido de API key ou token de instancia: `messages:send`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| phone * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/contacts/$PHONE/unblock" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
Grupos
Criar e administrar grupos.
GET/v1/instances/{id}/groupsGrupos
Escopo exigido de API key ou token de instancia: `contacts:read`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/groupsCriar grupo
Escopo exigido de API key ou token de instancia: `groups:write`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Clientes VIP","participants":["5511999999999"]}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instances/{id}/groups/{gid}Um grupo com participantes
Escopo exigido de API key ou token de instancia: `contacts:read`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| gid * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups/$GID" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
PUT/v1/instances/{id}/groups/{gid}/subjectAssunto
Escopo exigido de API key ou token de instancia: `groups:write`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| gid * | path | string |
curl -X PUT "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups/$GID/subject" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"subject":"Clientes VIP 2026"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
PUT/v1/instances/{id}/groups/{gid}/descriptionDescricao
Escopo exigido de API key ou token de instancia: `groups:write`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| gid * | path | string |
curl -X PUT "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups/$GID/description" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"description":"Avisos e promoções"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instances/{id}/groups/{gid}/pictureFoto do grupo
Escopo exigido de API key ou token de instancia: `contacts:read`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| gid * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups/$GID/picture" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
PUT/v1/instances/{id}/groups/{gid}/pictureTrocar a foto
Escopo exigido de API key ou token de instancia: `groups:write`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| gid * | path | string |
curl -X PUT "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups/$GID/picture" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://exemplo.com.br/logo.png"}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
PUT/v1/instances/{id}/groups/{gid}/settingsConfiguracoes (announce, locked)
Escopo exigido de API key ou token de instancia: `groups:write`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| gid * | path | string |
curl -X PUT "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups/$GID/settings" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"announce":true,"locked":false}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/groups/{gid}/participantsParticipantes (add, remove, promote, demote)
Escopo exigido de API key ou token de instancia: `groups:write`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| gid * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups/$GID/participants" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"action":"add","participants":["5511999999999"]}'- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
GET/v1/instances/{id}/groups/{gid}/invite-linkLink de convite (?reset=true gera outro)
Escopo exigido de API key ou token de instancia: `groups:write`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| gid * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups/$GID/invite-link" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/groups/{gid}/invite-link/resetGerar outro link de convite
Escopo exigido de API key ou token de instancia: `groups:write`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| gid * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups/$GID/invite-link/reset" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
POST/v1/instances/{id}/groups/{gid}/leaveSair do grupo
Escopo exigido de API key ou token de instancia: `groups:write`.
Autenticação: API key, token da instância (wai_…) ou sessão do painel
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string | |
| gid * | path | string |
curl -X POST "https://api.zapinapi.duckdns.org/v1/instances/inst_SEU_ID/groups/$GID/leave" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 401 Unauthorized · problem+json
- 402 Payment Required · problem+json
- 403 Forbidden · problem+json
- 404 Not Found · problem+json
- 429 Too Many Requests · problem+json
- 503 Service Unavailable · problem+json
API keys
Chaves da organização (exigem sessão do painel).
GET/v1/api-keysGET /v1/api-keys
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
curl -X GET "https://api.zapinapi.duckdns.org/v1/api-keys" \
-H "Authorization: Bearer $TOKEN"- 200 OK
POST/v1/api-keysPOST /v1/api-keys
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
Corpo (JSON): name: string, scopes: string[], expiresInDays: integer int32
curl -X POST "https://api.zapinapi.duckdns.org/v1/api-keys" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Minha integração","scopes":["messages:send"],"expiresInDays":90}'- 200 OK
DELETE/v1/api-keys/{id}DELETE /v1/api-keys/{id}
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string uuid |
curl -X DELETE "https://api.zapinapi.duckdns.org/v1/api-keys/inst_SEU_ID" \
-H "Authorization: Bearer $TOKEN"- 200 OK
POST/v1/api-keys/{id}/rotatePOST /v1/api-keys/{id}/rotate
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string uuid |
Corpo (JSON): gracePeriodHours: integer int32
curl -X POST "https://api.zapinapi.duckdns.org/v1/api-keys/inst_SEU_ID/rotate" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"gracePeriodHours":24}'- 200 OK
Assinatura e faturas
Planos, assinatura e faturas (API key com billing:read para leitura).
GET/v1/plansGET /v1/plans
Autenticação: Pública
curl -X GET "https://api.zapinapi.duckdns.org/v1/plans"- 200 OK
GET/v1/subscriptions/currentGET /v1/subscriptions/current
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
curl -X GET "https://api.zapinapi.duckdns.org/v1/subscriptions/current" \
-H "Authorization: Bearer $TOKEN"- 200 OK
POST/v1/subscriptions/trialPOST /v1/subscriptions/trial
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
curl -X POST "https://api.zapinapi.duckdns.org/v1/subscriptions/trial" \
-H "Authorization: Bearer $TOKEN"- 200 OK
POST/v1/subscriptionsPOST /v1/subscriptions
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
Corpo (JSON): plan: string, quantity: integer int32, name: string, cpfCnpj: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/subscriptions" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"plan":"...","quantity":1,"name":"Minha integração","cpfCnpj":"..."}'- 200 OK
PATCH/v1/subscriptionsPATCH /v1/subscriptions
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
Corpo (JSON): plan: string, quantity: integer int32
curl -X PATCH "https://api.zapinapi.duckdns.org/v1/subscriptions" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"plan":"...","quantity":1}'- 200 OK
DELETE/v1/subscriptionsDELETE /v1/subscriptions
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
curl -X DELETE "https://api.zapinapi.duckdns.org/v1/subscriptions" \
-H "Authorization: Bearer $TOKEN"- 200 OK
GET/v1/invoicesGET /v1/invoices
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
curl -X GET "https://api.zapinapi.duckdns.org/v1/invoices" \
-H "Authorization: Bearer $TOKEN"- 200 OK
GET/v1/invoices/{id}/pixGET /v1/invoices/{id}/pix
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string uuid |
curl -X GET "https://api.zapinapi.duckdns.org/v1/invoices/inst_SEU_ID/pix" \
-H "Authorization: Bearer $TOKEN"- 200 OK
Organização e equipe
Organização ativa, membros e convites.
POST/v1/organizations/{id}/exportPedir exportacao dos dados da organizacao (LGPD; link de uso unico por 24 h)
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string uuid |
curl -X POST "https://api.zapinapi.duckdns.org/v1/organizations/inst_SEU_ID/export" \
-H "Authorization: Bearer $TOKEN"- 202 Accepted
- 403 Forbidden · problem+json
- 409 Conflict · problem+json
GET/v1/organizations/{id}/exports/{exportId}Estado de uma exportacao (sem o link)
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string uuid | |
| exportId * | path | string uuid |
curl -X GET "https://api.zapinapi.duckdns.org/v1/organizations/inst_SEU_ID/exports/$EXPORTID" \
-H "Authorization: Bearer $TOKEN"- 200 OK
GET/v1/organizationGET /v1/organization
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
curl -X GET "https://api.zapinapi.duckdns.org/v1/organization" \
-H "Authorization: Bearer $TOKEN"- 200 OK
POST/v1/invitations/acceptPOST /v1/invitations/accept
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
Corpo (JSON): token: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/invitations/accept" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"token":"..."}'- 200 OK
POST/v1/auth/switch-organizationPOST /v1/auth/switch-organization
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
Corpo (JSON): organizationId: string uuid, refreshToken: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/switch-organization" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"organizationId":"...","refreshToken":"..."}'- 200 OK
GET/v1/organizations/{id}/membersGET /v1/organizations/{id}/members
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string uuid |
curl -X GET "https://api.zapinapi.duckdns.org/v1/organizations/inst_SEU_ID/members" \
-H "Authorization: Bearer $TOKEN"- 200 OK
POST/v1/organizations/{id}/membersPOST /v1/organizations/{id}/members
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string uuid |
Corpo (JSON): email: string, role: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/organizations/inst_SEU_ID/members" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":"voce@exemplo.com.br","role":"..."}'- 200 OK
DELETE/v1/organizations/{id}/members/{userId}DELETE /v1/organizations/{id}/members/{userId}
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string uuid | |
| userId * | path | string uuid |
curl -X DELETE "https://api.zapinapi.duckdns.org/v1/organizations/inst_SEU_ID/members/$USERID" \
-H "Authorization: Bearer $TOKEN"- 200 OK
DELETE/v1/organizations/{id}/invitations/{invitationId}DELETE /v1/organizations/{id}/invitations/{invitationId}
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| id * | path | string uuid | |
| invitationId * | path | string uuid |
curl -X DELETE "https://api.zapinapi.duckdns.org/v1/organizations/inst_SEU_ID/invitations/$INVITATIONID" \
-H "Authorization: Bearer $TOKEN"- 200 OK
Conta
Usuário, sessões ativas e exclusão de conta.
GET/v1/usageConsumo da organizacao: requisicoes e mensagens enviadas por instancia e por mes (from/to = AAAA-MM, padrao o mes atual; escopo billing:read)
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| from | query | string | |
| to | query | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/usage" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 400 Bad Request · problem+json
- 401 Unauthorized · problem+json
- 403 Forbidden · problem+json
GET/v1/me/sessionsSessoes ativas (dispositivos conectados)
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
curl -X GET "https://api.zapinapi.duckdns.org/v1/me/sessions" \
-H "Authorization: Bearer $TOKEN"- 200 OK
DELETE/v1/me/sessions/{familyId}Encerrar uma sessao
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| familyId * | path | string uuid |
curl -X DELETE "https://api.zapinapi.duckdns.org/v1/me/sessions/$FAMILYID" \
-H "Authorization: Bearer $TOKEN"- 204 No Content
GET/v1/meGET /v1/me
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
curl -X GET "https://api.zapinapi.duckdns.org/v1/me" \
-H "Authorization: Bearer $TOKEN"- 200 OK
DELETE/v1/meExcluir a conta (LGPD)
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
Corpo (JSON): confirmEmail: string
curl -X DELETE "https://api.zapinapi.duckdns.org/v1/me" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"confirmEmail":"voce@exemplo.com.br"}'- 204 No Content
- 409 Conflict · problem+json
POST/v1/me/passwordPOST /v1/me/password
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
Corpo (JSON): currentPassword: string, newPassword: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/me/password" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"currentPassword":"sua-senha-forte","newPassword":"sua-senha-forte"}'- 200 OK
Autenticação
Cadastro, login, renovação e recuperação de senha (usadas pelo painel).
POST/v1/auth/registerPOST /v1/auth/register
Autenticação: Pública
Corpo (JSON): email: string, password: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/register" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":"voce@exemplo.com.br","password":"sua-senha-forte"}'- 200 OK
POST/v1/auth/loginPOST /v1/auth/login
Autenticação: Pública
Corpo (JSON): email: string, password: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/login" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":"voce@exemplo.com.br","password":"sua-senha-forte"}'- 200 OK
POST/v1/auth/refreshPOST /v1/auth/refresh
Autenticação: Pública
Corpo (JSON): refreshToken: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/refresh" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"refreshToken":"..."}'- 200 OK
POST/v1/auth/logoutPOST /v1/auth/logout
Autenticação: Pública
Corpo (JSON): refreshToken: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/logout" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"refreshToken":"..."}'- 200 OK
POST/v1/auth/logout-allPOST /v1/auth/logout-all
Autenticação: Pública
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/logout-all" \
-H "Authorization: Bearer $TOKEN"- 200 OK
POST/v1/auth/email/confirmPOST /v1/auth/email/confirm
Autenticação: Pública
Corpo (JSON): token: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/email/confirm" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"token":"..."}'- 200 OK
POST/v1/auth/email/resendPOST /v1/auth/email/resend
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/email/resend" \
-H "Authorization: Bearer $TOKEN"- 200 OK
POST/v1/auth/password/forgotPOST /v1/auth/password/forgot
Autenticação: Pública
Corpo (JSON): email: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/password/forgot" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":"voce@exemplo.com.br"}'- 200 OK
POST/v1/auth/password/resetPOST /v1/auth/password/reset
Autenticação: Pública
Corpo (JSON): token: string, newPassword: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/password/reset" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"token":"...","newPassword":"sua-senha-forte"}'- 200 OK
GET/v1/auth/oauth/{provider}/startGET /v1/auth/oauth/{provider}/start
Autenticação: Pública
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| provider * | path | string | |
| redirect_uri | query | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/auth/oauth/$PROVIDER/start" \
-H "Authorization: Bearer $TOKEN"- 200 OK
GET/v1/auth/oauth/{provider}/callbackGET /v1/auth/oauth/{provider}/callback
Autenticação: Pública
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| provider * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/auth/oauth/$PROVIDER/callback" \
-H "Authorization: Bearer $TOKEN"- 200 OK
POST/v1/auth/oauth/{provider}/exchangePOST /v1/auth/oauth/{provider}/exchange
Autenticação: Pública
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| provider * | path | string |
Corpo (JSON): code: string, state: string, codeVerifier: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/oauth/$PROVIDER/exchange" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"code":"...","state":"...","codeVerifier":"..."}'- 200 OK
POST/v1/auth/oauth/link/confirmPOST /v1/auth/oauth/link/confirm
Autenticação: Pública
Corpo (JSON): token: string
curl -X POST "https://api.zapinapi.duckdns.org/v1/auth/oauth/link/confirm" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"token":"..."}'- 200 OK
Sistema
Saúde e chaves públicas de verificação do JWT.
GET/v1/exports/{token}Baixar a exportacao (o token do link e a credencial; uso unico)
Autenticação: Bearer (sessão do painel ou API key, conforme o escopo)
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
| token * | path | string |
curl -X GET "https://api.zapinapi.duckdns.org/v1/exports/$TOKEN" \
-H "Authorization: Bearer $TOKEN"- 200 OK
- 202 Accepted
- 404 Not Found · problem+json
- 410 Gone · problem+json
GET/healthGET /health
Autenticação: Pública
curl -X GET "https://api.zapinapi.duckdns.org/health"- 200 OK
GET/.well-known/jwks.jsonGET /.well-known/jwks.json
Autenticação: Pública
curl -X GET "https://api.zapinapi.duckdns.org/.well-known/jwks.json"- 200 OK