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.
Base URL
Todas as rotas públicas usam a versão v1.
https://api.loggasynk.com.br/api/v1
application/json
application/json
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
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
client_id | string | Sim | Identificador da credencial. |
client_secret | string | Sim | Segredo 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"
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
name | string | Não | Nome 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."
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
photo_url | string | Não | URL pública da imagem para a foto do perfil. |
name | string | Não | Nome exibido no perfil. |
description | string | Não | Recado/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
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
reject_calls | boolean | Sim | true recusa ligações automaticamente; false desativa. |
reject_message | string | Não | Mensagem 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_read | boolean | Não | true marca toda mensagem recebida como lida automaticamente (recibo de leitura). Omita para não alterar. |
auto_read_status | boolean | Não | true 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"
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
name | string | Sim | Novo 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"
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
webhook_url | string|null | Não | URL pública http/https. Envie vazio para remover. |
webhook_secret | string|null | Não | Sua 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."
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número com DDI e DDD. |
message | string | Sim | Texto 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."
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número com DDI e DDD. |
image | string | Sim | URL pública da imagem. |
caption | string | Não | Legenda 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"
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número do contato com DDI e DDD. |
latitude | number | Sim | Latitude (-90 a 90). |
longitude | number | Sim | Longitude (-180 a 180). |
name | string | Não | Nome do local. |
address | string | Não | Endereç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
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número com DDI e DDD. |
audio | string | Sim | URL pública ou base64 do áudio. |
ptt | boolean | Não | true envia como mensagem de voz. Padrão false. |
mimetype | string | Não | Ex.: 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!"
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número com DDI e DDD. |
video | string | Sim | URL pública ou base64 do vídeo. |
caption | string | Não | Legenda 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"
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número com DDI e DDD. |
document | string | Sim | URL pública ou base64 do arquivo. |
fileName | string | Não | Nome exibido do arquivo. |
mimetype | string | Não | Ex.: 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"
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número com DDI e DDD. |
sticker | string | Sim | URL 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" }
]
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número de destino com DDI e DDD. |
contacts | array | Sim | Lista de contatos (ao menos 1). |
contacts[].fullName | string | Sim | Nome completo do contato. |
contacts[].phoneNumber | string | Sim | Número do contato com DDI e DDD. |
contacts[].organization | string | Não | Empresa/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?"
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Destinatá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. |
message | string | Sim | Texto da resposta. |
messageId | string | Sim | Id da mensagem citada (campo message_id do webhook). |
quotedText | string | Não | Texto original citado — melhora a prévia da citação no app do destinatário. |
fromMe | boolean | Não | Se 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"
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número de destino com DDI e DDD. |
messageId | string | Sim | Id da mensagem a reencaminhar (campo message_id do webhook). |
fromPhone | string | Não | Nú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..."
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número do contato com DDI e DDD. |
messageId | string | Sim | Id 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": "👍"
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número do contato com DDI e DDD. |
messageId | string | Sim | Id da mensagem — o campo message_id do webhook. |
reaction | string | Não | Emoji 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
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
phone | string | Sim | Número do contato com DDI e DDD. |
messageId | string | Sim | Id da mensagem (do webhook ou retornado no envio). |
forEveryone | boolean | Não | true apaga para todos (revoga, só mensagens suas); false (padrão) apaga só para você. |
fromMe | boolean | Não | Indica 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
}'
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
enqueue_when_disconnected | boolean | Não | Liga/desliga o enfileiramento. |
ttl_seconds | number | Não | Validade de cada item; expira e é descartado depois disso. null = sem expiração. |
max_size | number | Não | Tamanho 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"
| Query | Tipo | Descrição |
|---|---|---|
cursor | number | Id do último item da página anterior (next_cursor). |
limit | number | Itens 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.
| Campo | Contato individual | Grupo |
|---|---|---|
is_group | false | true |
chat_id | JID do contato | JID do grupo (...@g.us) |
participant | null | quem enviou (resolvido p/ telefone quando dá) |
participant_lid | null | LID 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.
| Status | Quando ocorre |
|---|---|
400 | Payload obrigatório ausente em /auth/token. |
401 | Token ausente, inválido, expirado ou credenciais inválidas. |
402 | Ao criar: sem vaga de pacote disponível. Em outras rotas: instância sem acesso ativo (payment_required). Contrate um pacote no site. |
404 | Instância não encontrada para o usuário autenticado. |
409 | Instância existe, mas não está conectada ao WhatsApp. |
422 | Campos obrigatórios ausentes ou inválidos. |
429 | Rate limit excedido. |
502 | Falha 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."]
}
}
}