LS LoggaSynk Developers Documentação da API WhatsApp

API REST

LoggaSynk API para WhatsApp

Autentique por JWT, consulte instâncias, configure webhooks e envie mensagens. Mensagens recebidas são encaminhadas ao webhook do cliente; a LoggaSynk salva apenas contadores e metadados mínimos.

Gerenciar credenciais

Base URL

Todas as rotas públicas usam a versão v1.

https://api.loggasynk.com.br/api/v1
Content-Type
application/json
Accept
application/json
Auth
Bearer JWT

POST /auth/token

Gera um token JWT usando Client ID e Client Secret.

Request

curl -X POST https://api.loggasynk.com.br/api/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "lgs_1234567890",
    "client_secret": "sk_live_1234567890"
  }'

Payload

CampoTipoObrigatórioDescrição
client_idstringSimIdentificador da credencial.
client_secretstringSimSegredo exibido apenas ao gerar a credencial.

Resposta 200

{
  "access_token": "eyJ0eXAi...",
  "token_type": "Bearer",
  "expires_in": 3600
}

Possíveis erros: 400 payload inválido, 401 credenciais inválidas, 429 rate limit.

POST /whatsapp/instances

Cria uma instância consumindo uma vaga de um pacote ativo da sua conta. A contratação de pacotes é feita no site (loggasynk.com.br) — a API não gera cobrança. Sem vaga disponível, responde 402.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/instances \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Suporte"
  }'
CampoTipoObrigatórioDescrição
namestringNãoNome de identificação. Padrão: "Nova Conexão".

Resposta 201

{
  "success": true,
  "message": "Instância criada.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "name": "Suporte",
    "status": "DISCONNECTED",
    "connected": false
  }
}

Sem vaga (402)

{
  "success": false,
  "error": {
    "code": "payment_required",
    "message": "Sem instâncias disponíveis no seu pacote. Contrate um pacote no painel para criar novas instâncias."
  }
}

Erros: 401 token, 402 payment_required (sem vaga — contrate um pacote), 429 rate limit (10/min).

GET /whatsapp/{instanceId}/billing

Consulta a última cobrança associada à instância (do pacote/assinatura que a cobre). A contratação e o pagamento acontecem no site — este endpoint é somente leitura.

curl -X GET https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/billing \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN"
{
  "success": true,
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "billing": {
      "order_id": "ORDE_A1B2C3",
      "status": "paid",
      "paid": true,
      "label": "Pago",
      "amount_cents": 5000,
      "checkout_url": null,
      "pix": { "copy_paste": null, "image_url": null }
    }
  }
}

Erros: 404 instance_not_found ou billing_not_found (instância sem cobrança vinculada).

GET /whatsapp/{instanceId}/status

Consulta se a instância está conectada.

curl -X GET https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/status \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN"
{
  "success": true,
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "name": "Suporte",
    "status": "CONNECTED",
    "connected": true,
    "active": true,
    "reject_calls": false,
    "billing": {
      "status": "paid",
      "paid": true,
      "label": "Pago"
    },
    "updated_at": "2026-06-19 20:30:00"
  }
}

Status possiveis: STARTING, WAITING_QR, CONNECTED, DISCONNECTED. Use active para saber se a instância está liberada para uso (coberta por um pacote ativo ou cortesia da gestão); billing.paid reflete apenas a última cobrança.

GET /whatsapp/{instanceId}/data

Retorna os dados e configurações da instância (nome, webhook, bloqueio de ligação e datas). Diferente de /status, que foca no estado e na cobrança.

curl https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/data \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN"
{
  "success": true,
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "name": "Suporte",
    "status": "CONNECTED",
    "connected": true,
    "reject_calls": false,
    "webhook_url": "https://seuapp.com/webhooks/whatsapp",
    "created_at": "2026-06-01T14:32:00-03:00",
    "updated_at": "2026-06-28T09:10:00-03:00"
  }
}

GET /whatsapp/{instanceId}/device

Retorna dados do celular conectado (telefone, nome de exibição e plataforma). Exige a instância conectada.

curl https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/device \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN"
{
  "success": true,
  "data": {
    "phone": "5511999998888",
    "jid": "5511999998888:12@s.whatsapp.net",
    "push_name": "Suporte LoggaSynk",
    "platform": "android"
  }
}

Se a instância não estiver conectada, retorna 409 com instance_not_connected.

GET /whatsapp/{instanceId}/qr-code

Retorna o QR Code atual quando a instância está aguardando leitura.

curl -X GET https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/qr-code \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN"
{
  "success": true,
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "status": "WAITING_QR",
    "qr_code": "data:image/png;base64,iVBORw0KGgo...",
    "expires_in": 45
  }
}

POST /whatsapp/{instanceId}/profile

Atualiza o perfil do WhatsApp da instância: foto, nome e descrição (recado). Exige instância conectada. Envie só os campos que quer alterar.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/profile \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "photo_url": "https://cdn.seusite.com/avatar.png",
    "name": "Suporte LoggaSynk",
    "description": "Atendimento das 9h às 18h."
  }'
CampoTipoObrigatórioDescrição
photo_urlstringNãoURL pública da imagem para a foto do perfil.
namestringNãoNome exibido no perfil.
descriptionstringNãoRecado/about. String vazia limpa o recado.
{
  "success": true,
  "message": "Perfil atualizado.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "updated": ["photo_url", "name", "description"]
  }
}

Erros: 409 instance_not_connected, 422 nenhum campo enviado, 502 falha no bridge.

POST /whatsapp/{instanceId}/call-blocking

Automações da instância: recusa de ligações (voz e vídeo), mensagem automática após recusar e leitura automática das mensagens recebidas.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/call-blocking \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "reject_calls": true,
    "reject_message": "Olá! Não atendemos por ligação. Mande sua mensagem aqui. 🙂",
    "auto_read": true,
    "auto_read_status": true
  }'
CampoTipoObrigatórioDescrição
reject_callsbooleanSimtrue recusa ligações automaticamente; false desativa.
reject_messagestringNãoMensagem enviada ao contato logo após a ligação ser recusada (máx. 1000). Envie "" para limpar; omita para não alterar. Só é enviada com o bloqueio ativo.
auto_readbooleanNãotrue marca toda mensagem recebida como lida automaticamente (recibo de leitura). Omita para não alterar.
auto_read_statusbooleanNãotrue visualiza automaticamente os status (stories) dos contatos. Omita para não alterar.
{
  "success": true,
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "reject_calls": true,
    "reject_message": "Olá! Não atendemos por ligação. Mande sua mensagem aqui. 🙂",
    "auto_read": true,
    "auto_read_status": true
  }
}

O estado atual também aparece em reject_calls na resposta de /status.

PATCH /whatsapp/{instanceId}/name

Renomeia a instância. Altera apenas o nome de exibição — não afeta a conexão.

curl -X PATCH https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/name \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Suporte"
  }'
CampoTipoObrigatórioDescrição
namestringSimNovo nome da instância (1 a 120 caracteres).
{
  "success": true,
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "name": "Suporte",
    "status": "DISCONNECTED",
    "connected": false
  }
}

POST /whatsapp/{instanceId}/disconnect

Desconecta o número (logout) sem excluir a instância. A reconexão exige a leitura de um novo QR Code. Não afeta a cobrança.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/disconnect \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN"
{
  "success": true,
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "status": "DISCONNECTED"
  }
}

Para voltar a conectar, gere um novo QR Code em /whatsapp/{instanceId}/qr-code.

POST /whatsapp/{instanceId}/restart

Reinicia a sessão reusando as credenciais salvas — volta a conectar sem novo QR. Útil para sanar travamentos. Não afeta a cobrança.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/restart \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN"
{
  "success": true,
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "status": "restarting"
  }
}

A reconexão é assíncrona: acompanhe por /status ou pelo evento connected no webhook. Diferente de /disconnect, que exige novo QR.

GET /{instanceId}/webhook

Consulta o webhook configurado para a instância.

curl -X GET https://api.loggasynk.com.br/api/v1/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/webhook \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN"
{
  "success": true,
  "data": {
    "webhook_url": "https://connect.bytebrix.com.br/webhooks/whatsapp",
    "webhook_secret": "whsec_1a2b3c...",
    "event": "message.received"
  }
}

POST /{instanceId}/webhook

Configura a URL que recebera eventos message.received.

curl -X POST https://api.loggasynk.com.br/api/v1/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/webhook \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "webhook_url": "https://connect.bytebrix.com.br/webhooks/whatsapp",
    "webhook_secret": "whsec_suachavesecreta"
  }'
CampoTipoObrigatórioDescrição
webhook_urlstring|nullNãoURL pública http/https. Envie vazio para remover.
webhook_secretstring|nullNãoSua chave para assinar as entregas (HMAC-SHA256). Omita para não alterar; envie vazio para remover e voltar ao segredo padrão.
{
  "success": true,
  "message": "Webhook atualizado com sucesso.",
  "data": {
    "webhook_url": "https://connect.bytebrix.com.br/webhooks/whatsapp",
    "webhook_secret": "whsec_suachavesecreta",
    "event": "message.received"
  }
}

POST /whatsapp/{instanceId}/send-text

Envia uma mensagem de texto. Aceita message ou text.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/send-text \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "message": "Ola! Seu pedido foi aprovado."
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero com DDI e DDD.
messagestringSimTexto enviado ao contato.

Resposta 200

{
  "success": true,
  "message": "Mensagem enviada com sucesso.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "status": "sent"
  }
}

Com a fila ligada e a instância desconectada, retorna 202 com "status": "queued" e o queue_id.

POST /whatsapp/{instanceId}/send-image

Envia uma imagem por URL pública, com legenda opcional.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/send-image \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "image": "https://cdn.seusite.com/comprovante.png",
    "caption": "Segue o comprovante."
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero com DDI e DDD.
imagestringSimURL pública da imagem.
captionstringNãoLegenda opcional.

Resposta 200

{
  "success": true,
  "message": "Mensagem enviada com sucesso.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "status": "sent"
  }
}

POST /whatsapp/{instanceId}/send-location

Envia uma localização (pino no mapa).

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/send-location \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "latitude": -23.55052,
    "longitude": -46.633308,
    "name": "Praça da Sé",
    "address": "Sé, São Paulo - SP"
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero do contato com DDI e DDD.
latitudenumberSimLatitude (-90 a 90).
longitudenumberSimLongitude (-180 a 180).
namestringNãoNome do local.
addressstringNãoEndereço do local.
{
  "success": true,
  "message": "Localização enviada.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "message_id": "3EB0..."
  }
}

POST /whatsapp/{instanceId}/send-audio

Envia um áudio. ptt: true envia como mensagem de voz. A mídia aceita URL pública ou base64.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/send-audio \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "audio": "https://cdn.seusite.com/audio.ogg",
    "ptt": true
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero com DDI e DDD.
audiostringSimURL pública ou base64 do áudio.
pttbooleanNãotrue envia como mensagem de voz. Padrão false.
mimetypestringNãoEx.: audio/ogg; codecs=opus.

Resposta 200

{
  "success": true,
  "message": "Mídia enviada.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "type": "audio",
    "message_id": "3EB0A91899C8FC285915A2"
  }
}

POST /whatsapp/{instanceId}/send-video

Envia um vídeo (URL pública ou base64), com legenda opcional.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/send-video \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "video": "https://cdn.seusite.com/video.mp4",
    "caption": "Confira!"
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero com DDI e DDD.
videostringSimURL pública ou base64 do vídeo.
captionstringNãoLegenda do vídeo.

Resposta 200

{
  "success": true,
  "message": "Mídia enviada.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "type": "video",
    "message_id": "3EB0A91899C8FC285915A2"
  }
}

POST /whatsapp/{instanceId}/send-document

Envia um documento/arquivo (URL pública ou base64).

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/send-document \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "document": "https://cdn.seusite.com/contrato.pdf",
    "fileName": "Contrato.pdf",
    "mimetype": "application/pdf"
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero com DDI e DDD.
documentstringSimURL pública ou base64 do arquivo.
fileNamestringNãoNome exibido do arquivo.
mimetypestringNãoEx.: application/pdf.

Resposta 200

{
  "success": true,
  "message": "Mídia enviada.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "type": "document",
    "message_id": "3EB0A91899C8FC285915A2"
  }
}

POST /whatsapp/{instanceId}/send-sticker

Envia um sticker (WebP). Aceita URL pública ou base64.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/send-sticker \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "sticker": "https://cdn.seusite.com/figura.webp"
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero com DDI e DDD.
stickerstringSimURL pública ou base64 da figura em WebP.

Resposta 200

{
  "success": true,
  "message": "Mídia enviada.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "type": "sticker",
    "message_id": "3EB0A91899C8FC285915A2"
  }
}

POST /whatsapp/{instanceId}/send-contact

Envia um ou mais contatos (vCard).

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/send-contact \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "contacts": [
      { "fullName": "Maria Souza", "phoneNumber": "5511988887777", "organization": "Suporte" }
    ]
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero de destino com DDI e DDD.
contactsarraySimLista de contatos (ao menos 1).
contacts[].fullNamestringSimNome completo do contato.
contacts[].phoneNumberstringSimNúmero do contato com DDI e DDD.
contacts[].organizationstringNãoEmpresa/organização.
{
  "success": true,
  "message": "Contato(s) enviado(s).",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "count": 1,
    "message_id": "3EB0..."
  }
}

POST /whatsapp/{instanceId}/send

Endpoint flexivel para texto, imagem ou ambos.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/send \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "text": "Mensagem com imagem opcional",
    "image_url": "https://cdn.seusite.com/imagem.png"
  }'

Resposta 200

{
  "success": true,
  "message": "Mensagem enviada com sucesso.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "status": "sent"
  }
}

POST /whatsapp/{instanceId}/reply

Envia uma resposta citando uma mensagem. Retorna o message_id da nova mensagem.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/reply \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "message": "Claro, posso ajudar com isso!",
    "messageId": "3A8F...",
    "quotedText": "Vocês têm esse produto?"
  }'
CampoTipoObrigatórioDescrição
phonestringSimDestinatário: número com DDI+DDD ou um JID/LID do WhatsApp (ex.: o from/from_lid recebido no webhook). Permite responder sem ter o número.
messagestringSimTexto da resposta.
messageIdstringSimId da mensagem citada (campo message_id do webhook).
quotedTextstringNãoTexto original citado — melhora a prévia da citação no app do destinatário.
fromMebooleanNãoSe a mensagem citada foi enviada por você. Padrão false.

O campo phone aceita telefone ou JID/LID em todos os endpoints de envio — então dá para responder a um contato que chegou como @lid passando o próprio valor do webhook.

{
  "success": true,
  "message": "Resposta enviada.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "quoted_message_id": "3A8F...",
    "message_id": "3EB0..."
  }
}

POST /whatsapp/{instanceId}/forward

Reencaminha uma mensagem para outro número. A mensagem precisa ter trafegado recentemente pela instância (o bridge mantém um histórico recente em memória).

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/forward \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511888887777",
    "messageId": "3A8F...",
    "fromPhone": "5511999999999"
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero de destino com DDI e DDD.
messageIdstringSimId da mensagem a reencaminhar (campo message_id do webhook).
fromPhonestringNãoNúmero de origem da mensagem (informativo).
{
  "success": true,
  "message": "Mensagem reencaminhada.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511888887777",
    "forwarded_message_id": "3A8F...",
    "message_id": "3EB0..."
  }
}

Se a mensagem não estiver no histórico recente, retorna 404 message_not_found.

POST /whatsapp/{instanceId}/read

Marca uma mensagem recebida como lida (envia o recibo de leitura — o "visto azul").

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/read \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "messageId": "3A8F..."
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero do contato com DDI e DDD.
messageIdstringSimId da mensagem recebida — o campo message_id do webhook.
{
  "success": true,
  "message": "Mensagem marcada como lida.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "message_id": "3A8F..."
  }
}

POST /whatsapp/{instanceId}/reaction

Envia (ou remove) uma reação de emoji a uma mensagem. reaction vazio remove a reação.

curl -X POST https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/reaction \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "messageId": "3A8F...",
    "reaction": "👍"
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero do contato com DDI e DDD.
messageIdstringSimId da mensagem — o campo message_id do webhook.
reactionstringNãoEmoji da reação (ex.: 👍). Envie "" para remover a reação.
{
  "success": true,
  "message": "Reação enviada.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "message_id": "3A8F...",
    "reaction": "👍"
  }
}

DELETE /whatsapp/{instanceId}/message

Apaga uma mensagem. forEveryone: true revoga para todos (só funciona em mensagens enviadas por você); caso contrário, apaga apenas para você.

curl -X DELETE https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/message \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "messageId": "3A8F...",
    "forEveryone": true
  }'
CampoTipoObrigatórioDescrição
phonestringSimNúmero do contato com DDI e DDD.
messageIdstringSimId da mensagem (do webhook ou retornado no envio).
forEveryonebooleanNãotrue apaga para todos (revoga, só mensagens suas); false (padrão) apaga só para você.
fromMebooleanNãoIndica se a mensagem foi enviada por você. Padrão true.
{
  "success": true,
  "message": "Mensagem apagada para todos.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "phone": "5511999999999",
    "message_id": "3A8F...",
    "for_everyone": true
  }
}

PATCH /whatsapp/{instanceId}/queue/config

Configura a fila de envio. Com enqueue_when_disconnected ligado, mensagens enviadas enquanto a instância está desconectada são enfileiradas e disparadas automaticamente quando ela reconecta (em vez de retornar 409). Vale para texto, imagem, mídia, localização e contato.

curl -X PATCH https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/queue/config \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "enqueue_when_disconnected": true,
    "ttl_seconds": 3600,
    "max_size": 1000
  }'
CampoTipoObrigatórioDescrição
enqueue_when_disconnectedbooleanNãoLiga/desliga o enfileiramento.
ttl_secondsnumberNãoValidade de cada item; expira e é descartado depois disso. null = sem expiração.
max_sizenumberNãoTamanho máximo da fila; envios além disso são recusados. null = ilimitado.

Resposta 200

{
  "success": true,
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "enqueue_when_disconnected": true,
    "ttl_seconds": 3600,
    "max_size": 1000
  }
}

Ao enfileirar, o envio responde 202 com "status": "queued" e o queue_id.

GET /whatsapp/{instanceId}/queue

Lista as mensagens pendentes na fila. Paginação por cursor.

curl "https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/queue?limit=50&cursor=12" \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN"
QueryTipoDescrição
cursornumberId do último item da página anterior (next_cursor).
limitnumberItens por página (1 a 100, padrão 50).
{
  "success": true,
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "items": [
      { "id": 12, "phone": "5511999999999", "message_type": "text", "payload": { "text": "Olá!" }, "expires_at": "2026-06-29T18:00:00-03:00", "created_at": "2026-06-29T17:00:00-03:00" }
    ],
    "next_cursor": null
  }
}

DELETE /whatsapp/{instanceId}/queue/{queueItemId}

Remove um item específico da fila.

curl -X DELETE https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/queue/12 \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN"

Resposta 200

{
  "success": true,
  "message": "Item removido da fila.",
  "data": {
    "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
    "queue_id": 12
  }
}

Item inexistente retorna 404 queue_item_not_found.

DELETE /whatsapp/{instanceId}/queue

Esvazia toda a fila pendente da instância.

curl -X DELETE https://api.loggasynk.com.br/api/v1/whatsapp/inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12/queue \
  -H "Authorization: Bearer SEU_ACCESS_TOKEN"
{
  "success": true,
  "message": "Fila esvaziada.",
  "data": { "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12", "removed": 3 }
}

Webhook recebido pelo cliente

Quando a instância recebe mensagem, a LoggaSynk envia este evento para sua URL.

{
  "event": "message.received",
  "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
  "message_id": "3A8F...",
  "from": "5511999999999@s.whatsapp.net",
  "from_lid": null,
  "chat_id": "5511999999999@s.whatsapp.net",
  "is_group": false,
  "participant": null,
  "participant_lid": null,
  "sender_name": "Cliente",
  "type": "link",
  "message": {
    "text": "https://www.mercadolivre.com.br/",
    "url": "https://www.mercadolivre.com.br/"
  },
  "timestamp": "2026-06-19T20:30:00.000Z"
}

Tipos possiveis: text, link, document, image, audio, video, contact, location, sticker, button e option.

Remetente (from) e LID

O from é o identificador do remetente. Normalmente é o telefone (5511999999999@s.whatsapp.net). Quando o WhatsApp não expõe o número (privacidade), o contato chega como um LID (ex.: 223750633062608@lid). Sempre que dá, a LoggaSynk resolve o LID para o telefone real e coloca no from; se veio como LID, o valor original também vem em from_lid (senão, null).

Para responder, basta devolver o from (ou o from_lid) no campo to dos endpoints de envio/resposta — assim você responde mesmo sem ter o número. Veja Responder e Envio flexível.

Grupo vs. contato

Use o campo is_group para filtrar — não tente deduzir pelo @lid. O LID é a identidade de privacidade de um contato individual, não indica grupo. Grupo é sempre @g.us; contato é @s.whatsapp.net ou @lid.

CampoContato individualGrupo
is_groupfalsetrue
chat_idJID do contatoJID do grupo (...@g.us)
participantnullquem enviou (resolvido p/ telefone quando dá)
participant_lidnullLID do remetente, se veio mascarado

Em grupo, responda no chat_id (manda no grupo) ou no participant (manda no privado de quem falou).

Assinatura

WEBHOOK_SIGNING_SECRET é o segredo desta instância, que você define ou gera no painel (aba Configurações) ou envia em webhook_secret no endpoint acima. Só você o conhece — por isso pode verificar a autenticidade. Cada entrega leva os headers X-LoggaSynk-Timestamp e X-LoggaSynk-Signature.

signed_payload = timestamp + "." + raw_body
expected = "sha256=" + hmac_sha256(signed_payload, WEBHOOK_SIGNING_SECRET)
function verifyLoggaSynkWebhook(string $rawBody, array $headers, string $secret): bool
{
    $timestamp = $headers['X-LoggaSynk-Timestamp'] ?? '';
    $signature = $headers['X-LoggaSynk-Signature'] ?? '';
    $expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $rawBody, $secret);

    return hash_equals($expected, $signature);
}

Evento payment.confirmed

Enviado ao seu webhook quando o PagBank confirma o pagamento da instância. Alternativa ao polling de /status. Só é disparado se a instância tiver webhook configurado.

{
  "event": "payment.confirmed",
  "instance_id": "inst_3f9a2c1b-7d4e-4a86-9b1f-2c5e8a0d6f12",
  "order_id": "ORDE_A1B2C3",
  "status": "paid",
  "amount_cents": 5000,
  "paid_at": "2026-06-25 18:40:09",
  "timestamp": "2026-06-25T18:40:11-03:00"
}

A entrega é assíncrona, com até 5 tentativas e backoff. Os mesmos headers de assinatura do message.received são aplicados.

Status codes e erros

As respostas de erro seguem envelope padronizado.

StatusQuando ocorre
400Payload obrigatório ausente em /auth/token.
401Token ausente, inválido, expirado ou credenciais inválidas.
402Ao criar: sem vaga de pacote disponível. Em outras rotas: instância sem acesso ativo (payment_required). Contrate um pacote no site.
404Instância não encontrada para o usuário autenticado.
409Instância existe, mas não está conectada ao WhatsApp.
422Campos obrigatórios ausentes ou inválidos.
429Rate limit excedido.
502Falha no bridge do WhatsApp (ou no gateway, em operações de cobrança).
{
  "success": false,
  "error": {
    "code": "validation_error",
    "message": "O campo phone é obrigatório.",
    "details": {
      "phone": ["Informe o número com DDI e DDD."]
    }
  }
}