Obtenha as credenciais
Bearer da API, ID e token da instância. O bearer completo é exibido uma única vez.
Integre mensagens, conexão, consultas e webhooks por uma única fachada autenticada. A sessão correta é vinculada no servidor e as credenciais internas nunca fazem parte da sua integração.
https://api2.wzap-api.comGere o bearer uma vez no painel, copie o ID e o token da instância e envie uma mensagem de teste pelo seu backend.
Bearer da API, ID e token da instância. O bearer completo é exibido uma única vez.
Use a base pública, a ação documentada e envie o token da instância somente no cabeçalho.
Nunca exponha as credenciais em JavaScript do navegador.
curl --request POST \
--url "https://api2.wzap-api.com/instances/SEU_INSTANCE_ID/send-text" \
--header "Authorization: Bearer wzap_live_SEU_BEARER" \
--header "X-Instance-Token: SEU_INSTANCE_TOKEN" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '{
"chatId": "[email protected]",
"text": "Olá pela WZAP-API!"
}'
Não envie session no JSON. A WZAP-API injeta a sessão pertencente ao usuário autenticado e ignora qualquer tentativa de substituí-la.
A fachada usa um bearer com escopos e, quando necessário, a credencial da instância. O fluxo legado com API key e CSRF existe apenas durante a migração.
| Credencial | Onde enviar | Finalidade |
|---|---|---|
api_token | Authorization: Bearer … | Identifica a conta e aplica os escopos da credencial. |
instance_id | Segmento da URL | Seleciona uma instância pertencente à conta nas ações da fachada. |
instance_token | X-Instance-Token: … | Autoriza o uso daquela instância nas ações da fachada sem entrar no request-target. |
Copie o bearer no momento da emissão: somente o hash é persistido e uma rotação revoga os anteriores. Nunca coloque o token da instância na URL; envie-o em X-Instance-Token e remova cabeçalhos sensíveis da observabilidade.
A credencial principal emitida pelo painel inclui somente instances:read, instances:write, messages:send, webhooks:read, webhooks:write e billing:balance. Credenciais legadas permanecem temporariamente apenas em ações não financeiras.
Uma estrutura previsível para todas as ações.
https://api2.wzap-api.com/instances/{instance_id}/{action}
Cada ação aceita apenas o método documentado. Outro método retorna 405 e o cabeçalho Allow.
Chamadas com corpo exigem application/json, objeto JSON válido e no máximo 10 MiB.
A instância precisa pertencer à mesma conta das credenciais. Recursos de outros usuários não são revelados.
Conta bloqueada ou instância inativa, pausada, não paga ou vencida é interrompida antes do WhatsApp. Um cancelamento agendado continua ativo até o vencimento.
chatId| Destino | Formato |
|---|---|
| Contato | [email protected] |
| Grupo | [email protected] |
| LID | 123456789012345@lid |
| Canal | 120363000000000000@newsletter |
| Status | status@broadcast |
A WZAP-API preserva o status HTTP 2xx e retorna somente o contrato público permitido em ok, data e request_id. Campos internos da engine são descartados. Cada resposta inclui X-Request-Id.
Planeje payloads, paginação e evolução do cliente usando somente o contrato público da WZAP-API.
| Item | Limite público | Como integrar |
|---|---|---|
| Corpo da fachada | 10 MiB | Para mídia grande, prefira file.url HTTPS temporária. |
| Resposta do upstream | 8 MiB | Use paginação nas consultas e não dependa de respostas ilimitadas. |
| Listagens | limit de 1 a 200 | Avance com offset e ordenação estável. |
| Webhooks do cliente | Até 9 por instância | Assine apenas os eventos necessários e use uma fila no recebimento. |
| Contatos por envio | 1 a 20 | Divida lotes maiores em chamadas independentes. |
Listagens usam data.items/data.count; envios retornam somente confirmação e o ID público quando disponível.
Conexão, ativação e exclusão remota podem ficar pendentes. Consulte o estado antes de repetir uma ação.
A API pública da WZAP-API é o único contrato necessário para sua integração.
Após timeout em um envio, verifique seus registros e webhooks para evitar mensagens duplicadas.
Crie, ative, renove e exclua instâncias da sua própria conta usando o bearer do backend.
Estas rotas usam https://wzap-api.com/endpoint/, bearer em Authorization e JSON. Criação e exclusão exigem instances:write; pagamento com saldo também exige billing:balance e Idempotency-Key. Use-as somente pelo seu backend.
Cria a instância com Pix pendente ou debita o saldo da conta e libera uma assinatura de 30 dias.
https://wzap-api.com/endpoint/criar_instancia.php
{
"nome": "Atendimento São Paulo",
"criar_instancia": true,
"payment_method": "balance"
}
Idempotency-Key: 9f643462-ec66-49f1-977f-3cccf57d42ea
201 Created ou 202 Accepted{
"status": "success",
"instance_id": 123,
"instance_hash": "ID_GERADO_PELO_SERVIDOR",
"instance_token": "TOKEN_GERADO_PELO_SERVIDOR",
"payment_status": "PAID",
"expires_at": "2026-10-01 12:00:00",
"balance_remaining_cents": 5010,
"idempotent_replay": false,
"remote_start_pending": false
}
nome é obrigatório e aceita de 2 a 120 caracteres.instances:write; com payment_method: balance, também precisa de billing:balance.criar_instancia é opcional; quando enviado, precisa ser true.payment_method aceita pix ou balance. Pix devolve payment_url; saldo debita o preço do plano no servidor e libera exatamente 30 dias.balance, gere uma chave UUID por operação, persista-a e reutilize a mesma Idempotency-Key em timeout ou retry. Trocar payload com a mesma chave retorna 409.pagar_nahora: true é aceito como alias legado de payment_method: balance. O valor precisa ser booleano estrito e não pode conflitar com payment_method; caso contrário, retorna 422.remote_start_pending: true não desfaz o pagamento: a assinatura já foi liberada e o worker repetirá o início da sessão.200. Nova criação responde 201; início remoto pendente responde 202.400 JSON inválido, 401 credenciais, 402 saldo insuficiente, 403 escopo/conta, 405 método, 409 conflito idempotente, 413 limite de 32 KiB, 422 validação e 503 ledger indisponível.Debita o preço do plano e concede 30 dias a uma instância existente, sem expor ou trocar seu token.
https://wzap-api.com/endpoint/ativar_instancia_saldo.php
Authorization: Bearer wzap_live_SEU_BEARER
Idempotency-Key: 9f643462-ec66-49f1-977f-3cccf57d42ea
Content-Type: application/json
{
"instance_hash": "ID_DA_INSTANCIA"
}
200 OK ou 202 Accepted{
"status": "success",
"code": "balance_instance_renewed",
"billing_source": "BALANCE",
"idempotent_replay": false,
"operation": "RENEW",
"operation_id": "UUID_DA_OPERACAO",
"payment_id": "UUID_DO_PAGAMENTO",
"instance_id": 123,
"instance_hash": "ID_DA_INSTANCIA",
"amount_cents": 4990,
"balance_remaining_cents": 5010,
"expires_at": "2026-10-31 12:00:00",
"vencimento": "2026-10-31 12:00:00",
"payment_status": "PAID",
"activation_pending": false,
"remote_start_pending": false
}
instance_hash com 32 caracteres hexadecimais. O token da instância não é necessário e nunca é retornado.Idempotency-Key após timeout. Um replay devolve o mesmo operation_id sem novo débito.409 payment_in_progress; Pix já pago retorna billing_source: ATIVOPAY e não debita saldo.activation_pending ou remote_start_pending indica trabalho remoto pendente, não falha ou reversão financeira.401 bearer, 402 insufficient_balance, 403 escopo/conta, 404 instance_not_found, 409 pagamento/ativação/conflito/estado, 422 corpo/chave, 429 limite e 503 billing_unavailable.Desativa uma instância pertencente à conta e solicita a remoção segura da sessão correspondente.
https://wzap-api.com/endpoint/deletar_instancia.php
{
"instance_hash": "ID_DA_INSTANCIA"
}
200 OK{
"status": "success",
"message": "Instância excluída.",
"remote_cleanup_pending": false
}
instance_hash ou, alternativamente, instance_id numérico. Se ambos forem enviados e o hash for válido, ele prevalece.DELETE com o mesmo corpo JSON.remote_cleanup_pending: true significa que a exclusão local foi concluída, mas a limpeza da sessão ainda não foi confirmada.409, evitando que um pagamento tardio fique sem serviço.400 JSON inválido, 401 credenciais, 404 instância ausente ou de outra conta, 405 método, 409 cobrança/ativação pendente, 413 limite de 16 KiB, 422 identificador e 500 falha interna.A rota histórica não altera mais vencimentos. Licenças mudam somente por Pix confirmado, saldo transacional ou ação administrativa auditada.
https://wzap-api.com/endpoint/add_days.php410 Gone{
"status": "error",
"code": "endpoint_retired",
"message": "Alteração direta de vencimento foi desativada."
}
ativar_instancia_saldo.php ou o fluxo Pix.Consulte o estado da sessão, obtenha o QR Code e controle a conexão do WhatsApp.
Retorna o QR Code atual em JSON quando a sessão aguarda pareamento.
/instances/{instance_id}/qr
Retorna somente o estado público atual da conexão, sem configuração interna da sessão.
/instances/{instance_id}/status
Reinicia o processo da sessão sem remover o pareamento salvo.
/instances/{instance_id}/restart
Encerra o pareamento atual. Um novo QR Code será necessário para reconectar.
/instances/{instance_id}/disconnect
Envie texto, mídia, links, localização, contatos e mensagens interativas.
Envia texto para um contato, grupo, canal ou status compatível.
/instances/{instance_id}/send-text
{
"chatId": "[email protected]",
"text": "Olá! Sua confirmação chegou.",
"linkPreview": false
}
Envia uma imagem por URL HTTPS pública ou Base64. URLs são importadas pela fachada e repassadas como dados.
/instances/{instance_id}/send-image
{
"chatId": "[email protected]",
"file": {
"mimetype": "image/jpeg",
"filename": "comprovante.jpg",
"url": "https://cdn.exemplo.com/comprovante.jpg"
},
"caption": "Seu comprovante"
}
Envia vídeo importado com transporte fixado ou Base64, com conversão opcional.
/instances/{instance_id}/send-video
{
"chatId": "[email protected]",
"file": {
"mimetype": "video/mp4",
"filename": "demonstracao.mp4",
"url": "https://cdn.exemplo.com/demonstracao.mp4"
},
"caption": "Veja a demonstração",
"convert": true
}
Envia documento importado com transporte seguro ou Base64.
/instances/{instance_id}/send-file
{
"chatId": "[email protected]",
"file": {
"mimetype": "application/pdf",
"filename": "contrato.pdf",
"url": "https://cdn.exemplo.com/contrato.pdf"
},
"caption": "Contrato para conferência"
}
Envia um link HTTPS clicável com prévia declarada pela fachada, sem busca remota de metadados.
/instances/{instance_id}/send-link
{
"chatId": "[email protected]",
"url": "https://www.exemplo.com/oferta",
"title": "Confira sua oferta"
}
Envia coordenadas geográficas e um título legível.
/instances/{instance_id}/send-location
{
"chatId": "[email protected]",
"latitude": -23.55052,
"longitude": -46.633308,
"title": "Unidade Centro"
}
Envia um ou mais contatos em formato de cartão.
/instances/{instance_id}/send-contact
{
"chatId": "[email protected]",
"contacts": [
{
"fullName": "Atendimento WZAP",
"organization": "WZAP-API",
"phoneNumber": "+55 11 99999-9999",
"whatsappId": "5511999999999",
"vcard": null
}
]
}
Envia uma mensagem interativa com botões de resposta, URL, ligação ou cópia.
/instances/{instance_id}/send-buttons
{
"chatId": "[email protected]",
"header": "Atendimento",
"body": "Como podemos ajudar?",
"footer": "Escolha uma opção",
"buttons": [
{"type": "reply", "text": "Financeiro", "id": "financeiro"},
{"type": "url", "text": "Central", "url": "https://www.exemplo.com"}
]
}
Envia um menu com seções e linhas selecionáveis.
/instances/{instance_id}/send-list
{
"chatId": "[email protected]",
"message": {
"title": "Menu principal",
"description": "Selecione o assunto",
"footer": "Equipe WZAP",
"button": "Escolher",
"sections": [
{
"title": "Atendimento",
"rows": [
{"title": "Financeiro", "rowId": "financeiro", "description": "Pagamentos e notas"},
{"title": "Suporte", "rowId": "suporte", "description": "Ajuda técnica"}
]
}
]
}
}
Marque conversas como lidas, apague, reaja, encaminhe ou responda mensagens existentes.
Marca as mensagens pendentes de um chat como visualizadas.
/instances/{instance_id}/mark-as-read
{
"chatId": "[email protected]",
"messageIds": [
"[email protected]_AAAAAAAAAAAAAAAAAAAA"
]
}
Solicita a remoção de uma mensagem pelo identificador completo.
/instances/{instance_id}/delete-message
{
"chatId": "[email protected]",
"messageId": "[email protected]_AAAAAAAAAAAAAAAAAAAA"
}
Adiciona uma reação a uma mensagem ou a remove enviando texto vazio.
/instances/{instance_id}/send-reaction
{
"messageId": "[email protected]_AAAAAAAAAAAAAAAAAAAA",
"reaction": "👍"
}
Encaminha uma mensagem existente para outro chat.
/instances/{instance_id}/forward-message
{
"chatId": "[email protected]",
"messageId": "[email protected]_AAAAAAAAAAAAAAAAAAAA"
}
Envia texto vinculado a uma mensagem anterior.
/instances/{instance_id}/reply-message
{
"chatId": "[email protected]",
"reply_to": "[email protected]_AAAAAAAAAAAAAAAAAAAA",
"text": "Recebemos sua mensagem e já vamos ajudar."
}
Consulte dados armazenados pela engine usando paginação e ordenação controladas.
Lista os contatos disponíveis para a sessão.
/instances/{instance_id}/get-contacts?limit=100&offset=0&sortBy=name&sortOrder=asc
Confirma se um número internacional está disponível e retorna somente um identificador seguro quando existir.
/instances/{instance_id}/check-number
{
"phone": "5511999999999"
}
Lista conversas com paginação, ordenação e união opcional de LID.
/instances/{instance_id}/get-chats?limit=100&offset=0&sortBy=conversationTimestamp&sortOrder=desc&merge=true
Lista grupos da sessão sem carregar participantes por padrão.
/instances/{instance_id}/groups?limit=100&offset=0&sortBy=id&sortOrder=desc&exclude=participants
Gerencie destinos do cliente e callbacks server-to-server sem expor configurações operacionais.
Lista somente os webhooks do cliente confirmados na instância.
/instances/{instance_id}/get-webhooks
Atualiza exclusivamente config.webhooks da sessão autenticada.
/instances/{instance_id}/save-webhooks
{
"config": {
"webhooks": [
{
"url": "https://app.exemplo.com/webhooks/wzap",
"events": ["message", "message.ack", "session.status"],
"hmac": {"key": "uma-chave-secreta-com-32-caracteres"},
"retries": {
"policy": "exponential",
"delaySeconds": 2,
"attempts": 5
},
"customHeaders": [
{"name": "X-Integration-Id", "value": "wzap-producao"}
]
}
]
}
}
Faz upsert do callback privado configurado no servidor e preserva os webhooks de cliente protegidos pelo relay.
/instances/{instance_id}/register-integration-webhook
Vincula explicitamente uma sessão existente ao identificador reservado da integração sem trocar ID, token ou webhooks.
/instances/{instance_id}/adopt-integration
{
"source_ref": "wdivulga-user-0123456789abcdef0123456789abcdef"
}
Revoga imediatamente o uso pela fachada e agenda a pausa da sessão preservando ID e token.
/instances/{instance_id}/suspend-integration
Agenda a retomada da sessão preservada e só libera envios depois da confirmação remota.
/instances/{instance_id}/resume-integration
Valide a assinatura do corpo bruto antes de processar qualquer evento.
X-Webhook-Request-IdID único da tentativa; use para deduplicar.X-Webhook-TimestampHorário de envio em milissegundos Unix.X-Webhook-HmacAssinatura hexadecimal do corpo bruto.X-Webhook-Hmac-AlgorithmAlgoritmo informado, atualmente sha512.<?php
$secret = getenv('WZAP_WEBHOOK_SECRET');
$rawBody = file_get_contents('php://input');
$received = strtolower(trim($_SERVER['HTTP_X_WEBHOOK_HMAC'] ?? ''));
$algorithm = strtolower($_SERVER['HTTP_X_WEBHOOK_HMAC_ALGORITHM'] ?? '');
$timestampHeader = $_SERVER['HTTP_X_WEBHOOK_TIMESTAMP'] ?? '';
$requestId = $_SERVER['HTTP_X_WEBHOOK_REQUEST_ID'] ?? '';
if (
!is_string($secret) || $secret === ''
|| $algorithm !== 'sha512'
|| !preg_match('/^[a-f0-9]{128}$/', $received)
|| !preg_match('/^\d{10,16}$/', $timestampHeader)
) {
http_response_code(401);
exit;
}
$sentAt = (int) $timestampHeader;
if ($sentAt > 9999999999) {
$sentAt = (int) floor($sentAt / 1000);
}
if (abs(time() - $sentAt) > 300) {
http_response_code(401);
exit;
}
$expected = hash_hmac('sha512', $rawBody, $secret);
if (!hash_equals($expected, $received)) {
http_response_code(401);
exit;
}
$event = json_decode($rawBody, true, 64, JSON_THROW_ON_ERROR);
http_response_code(204);
// Deduplique por $requestId e processe $event em fila.
session.status
message
message.any
message.ack
message.reaction
message.edited
message.revoked
chat.archive
group.v2.join
group.v2.leave
group.v2.participants
group.v2.update
presence.update
poll.vote
call.received
Evite assinar * em produção: eventos desnecessários aumentam tráfego, custo e superfície de processamento.
Erros da fachada possuem estrutura estável e um request ID para diagnóstico.
{
"ok": false,
"error": {
"code": "validation_error",
"message": "O campo chatId é obrigatório.",
"request_id": "7df043fe82bb56b928b132f4",
"field": "chatId"
}
}
| HTTP | Significado | Ação recomendada |
|---|---|---|
| 400 | Rota, corpo ou JSON inválido. | Corrija a requisição; não repita igual. |
| 401 | Credenciais ausentes ou inválidas. | Revise o bearer e gere outro se ele tiver sido rotacionado. |
| 402 | Assinatura pausada, não paga ou vencida. | Regularize a instância no painel. |
| 403 | Conta bloqueada. | Fale com o suporte. |
| 404 | Ação inexistente, instância não encontrada ou token inválido. | Revise rota, propriedade e token. |
| 405 | Método HTTP incorreto. | Use o método indicado em Allow. |
| 409 | Estado atual incompatível com a operação. | Consulte status, ajuste o fluxo e tente novamente. |
| 410 | Instância inativa. | Crie ou reative uma instância válida. |
| 413 | Corpo ou mídia maior que o limite da rota. | Mantenha o JSON em até 10 MiB e a mídia URL/Base64 em até 7 MiB decodificados. |
| 415 | Content-Type incorreto. | Envie application/json. |
| 422 | Campo inválido. | Corrija o campo apontado no erro. |
| 429 | Limite temporário no serviço de WhatsApp. | Aguarde e use backoff com jitter. |
| 502 | Serviço de WhatsApp indisponível ou recusou autenticação interna. | Repita apenas se a operação for segura. |
| 504 | Tempo limite excedido. | Consulte o estado antes de repetir um envio. |
Ao abrir um chamado, informe o horário, a ação e o request_id. Nunca envie bearer, API key legada, CSRF token ou token da instância.
Integrações confiáveis evitam vazamento de segredos e duplicidade de mensagens.
Guarde credenciais em variáveis de ambiente ou cofre de segredos. Não chame a API diretamente do navegador.
Use timeout de conexão e de resposta. Em caso de dúvida após timeout, consulte status ou seus registros antes de reenviar.
Repita 429, 502 e 504 com backoff exponencial e jitter. Não repita automaticamente erros 4xx de validação.
Quando o tipo de mensagem aceitar id, gere e reutilize um identificador estável ao tentar novamente.
Valide HMAC, deduplique pelo request ID, responda 2xx rapidamente e processe em fila.
Use URLs HTTPS públicas temporárias de até 7 MiB, sem redirects. A fachada fixa o IP, valida o MIME e importa o arquivo antes do envio interno.
Registre ação, status, latência e request ID. Nunca registre Authorization, X-Csrf-Token ou X-Instance-Token.
Respeite consentimento, contexto e limites do WhatsApp. Automação agressiva aumenta bloqueios e reclamações.
Tente buscar pelo nome da ação, método HTTP ou assunto.