Synergy Connect

Documentação

Enviar mensagens

Todo envio é um POST com o corpo da Cloud API da Meta. A Synergy confere a chave e o número, e repassa o corpo à Meta sem alterar; a resposta da Meta (de sucesso ou de erro) volta como ela mandou. Quem já integra com a Meta só troca o host e o token.

O endpoint#

  • {version} é a versão da Graph API (por exemplo v25.0), repassada como veio.
  • {phone_number_id} é o id do número, que aparece no cartão "Como conectar" de Configurações → API e webhooks. Um número que não é da organização da chave responde 404 (código 100).
  • O corpo tem até 64 KB. Acima disso a resposta é 400 (código 100).
  • A mensagem aparece na conversa do cliente no app, enviada pela automação.
Texto
POST https://api.synergyconnect.com.br/{version}/{phone_number_id}/messages

Autenticação#

Header Authorization: Bearer <chave>, com uma chave de escopo messages que alcance o número (Autenticação). O plano precisa ter a feature api.

Headers opcionais da Synergy:

HeaderPara quê
Idempotency-KeyUma chave sua para UMA requisição (por exemplo o id do pedido, até 200 caracteres). Repetir a requisição com a mesma chave devolve o mesmo messages[].id e a Meta recebe a mensagem uma vez só. Enquanto o primeiro envio está em andamento, a repetição recebe 409 (código 1390002); reusar a chave para outro destinatário é 422 (código 1390003)
X-Synergy-RepliesPara onde vai a resposta do cliente: queue (fila dos atendentes) ou automation (continua com a integração). Sem o header vale o modo da chave

O formato da Meta#

Todo corpo tem messaging_product: "whatsapp" e to (o telefone do cliente, com DDI, só dígitos). O type diz o tipo da mensagem, e o objeto de mesmo nome traz o conteúdo ("type": "image" → image). Sem type, a Meta entende text. recipient_type é individual (padrão) ou group.

Uma resposta 200 quer dizer que a Meta aceitou a mensagem. A entrega em si é avisada depois, nos status do webhook (sent, delivered, read ou failed): veja Receber mensagens e status. O messages[0].id (o wamid) é a chave para casar o envio com o status.

Resposta 200:

Fora da janela de 24 h do cliente só um modelo (template) é entregue: veja Janela de atendimento de 24 horas e Modelos de mensagem (templates). Os exemplos abaixo valem dentro da janela. Estar na janela não torna a mensagem gratuita: a Meta cobra por mensagem enviada (veja Cobrança).

JSON
{
  "messaging_product": "whatsapp",
  "contacts": [
    {
      "input": "5511999999999",
      "wa_id": "5511999999999"
    }
  ],
  "messages": [
    {
      "id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABEYEjdGQjI0QzE4RTlBMDVENzQxAA==",
      "message_status": "accepted"
    }
  ]
}

Texto#

Até 4096 caracteres. Aceita a formatação do WhatsApp (*negrito*, _itálico_) e emojis. Com preview_url: true, o primeiro link do texto (que começa com http:// ou https://) mostra a prévia.

Resposta 200: a mesma de cima, com o id da mensagem.

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "5511999999999",
  "type": "text",
  "text": {
    "body": "Acompanhe a entrega em https://www.example.com/pedidos/42",
    "preview_url": true
  }
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "5511999999999",
    "type": "text",
    "text": {
      "body": "Acompanhe a entrega em https://www.example.com/pedidos/42",
      "preview_url": true
    }
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "recipient_type": "individual",
        "to": "5511999999999",
        "type": "text",
        "text": {
            "body": "Acompanhe a entrega em https://www.example.com/pedidos/42",
            "preview_url": True,
        },
    },
)
print(res.status_code, res.json())

Imagem#

JPEG ou PNG, até 5 MB. Informe id (de um upload, veja Mídia) ou link (URL pública), nunca os dois. A Meta recomenda o id: um link fora do ar faz o envio falhar depois de aceito. caption é a legenda, até 1024 caracteres.

Resposta 200: a mesma de cima, com o id da mensagem.

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "5511999999999",
  "type": "image",
  "image": {
    "link": "https://arquivos.example.com/produtos/tenis-azul.jpg",
    "caption": "Tênis azul, tamanhos 38 a 44"
  }
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "5511999999999",
    "type": "image",
    "image": {
      "link": "https://arquivos.example.com/produtos/tenis-azul.jpg",
      "caption": "Tênis azul, tamanhos 38 a 44"
    }
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "recipient_type": "individual",
        "to": "5511999999999",
        "type": "image",
        "image": {
            "link": "https://arquivos.example.com/produtos/tenis-azul.jpg",
            "caption": "Tênis azul, tamanhos 38 a 44",
        },
    },
)
print(res.status_code, res.json())

Áudio#

AAC, AMR, MP3, M4A ou OGG (só codec OPUS, mono), até 16 MB. Não aceita legenda. Com voice: true chega como mensagem de voz, que é OGG/OPUS.

Resposta 200: a mesma de cima, com o id da mensagem.

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "5511999999999",
  "type": "audio",
  "audio": {
    "id": "1166846181421424",
    "voice": true
  }
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "5511999999999",
    "type": "audio",
    "audio": {
      "id": "1166846181421424",
      "voice": true
    }
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "recipient_type": "individual",
        "to": "5511999999999",
        "type": "audio",
        "audio": {
            "id": "1166846181421424",
            "voice": True,
        },
    },
)
print(res.status_code, res.json())

Vídeo#

MP4 ou 3GPP, vídeo H.264 e áudio AAC (um só canal de áudio, ou nenhum), até 16 MB. Aceita caption.

Resposta 200: a mesma de cima, com o id da mensagem.

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "5511999999999",
  "type": "video",
  "video": {
    "link": "https://arquivos.example.com/videos/como-usar.mp4",
    "caption": "Veja como usar"
  }
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "5511999999999",
    "type": "video",
    "video": {
      "link": "https://arquivos.example.com/videos/como-usar.mp4",
      "caption": "Veja como usar"
    }
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "recipient_type": "individual",
        "to": "5511999999999",
        "type": "video",
        "video": {
            "link": "https://arquivos.example.com/videos/como-usar.mp4",
            "caption": "Veja como usar",
        },
    },
)
print(res.status_code, res.json())

Documento#

TXT, PDF, DOC/DOCX, XLS/XLSX ou PPT/PPTX. Na Meta vai até 100 MB; pelo upload da Synergy, até 16 MB (acima disso, envie por link). filename é o nome que o cliente vê (com a extensão) e caption a legenda.

Resposta 200: a mesma de cima, com o id da mensagem.

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "5511999999999",
  "type": "document",
  "document": {
    "link": "https://arquivos.example.com/boletos/42.pdf",
    "filename": "boleto-pedido-42.pdf",
    "caption": "Seu boleto vence dia 10"
  }
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "5511999999999",
    "type": "document",
    "document": {
      "link": "https://arquivos.example.com/boletos/42.pdf",
      "filename": "boleto-pedido-42.pdf",
      "caption": "Seu boleto vence dia 10"
    }
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "recipient_type": "individual",
        "to": "5511999999999",
        "type": "document",
        "document": {
            "link": "https://arquivos.example.com/boletos/42.pdf",
            "filename": "boleto-pedido-42.pdf",
            "caption": "Seu boleto vence dia 10",
        },
    },
)
print(res.status_code, res.json())

Figurinha (sticker)#

WEBP de 512 × 512 px: estática até 100 KB, animada até 500 KB. Não aceita legenda.

Resposta 200: a mesma de cima, com o id da mensagem.

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "5511999999999",
  "type": "sticker",
  "sticker": {
    "id": "1166846181421424"
  }
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "5511999999999",
    "type": "sticker",
    "sticker": {
      "id": "1166846181421424"
    }
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "recipient_type": "individual",
        "to": "5511999999999",
        "type": "sticker",
        "sticker": {
            "id": "1166846181421424",
        },
    },
)
print(res.status_code, res.json())

Localização#

latitude e longitude em graus decimais (texto ou número) são obrigatórios; name e address são opcionais.

Resposta 200: a mesma de cima, com o id da mensagem.

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "5511999999999",
  "type": "location",
  "location": {
    "latitude": "-23.561414",
    "longitude": "-46.655881",
    "name": "Loja Paulista",
    "address": "Av. Paulista, 1000 - São Paulo, SP"
  }
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "5511999999999",
    "type": "location",
    "location": {
      "latitude": "-23.561414",
      "longitude": "-46.655881",
      "name": "Loja Paulista",
      "address": "Av. Paulista, 1000 - São Paulo, SP"
    }
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "recipient_type": "individual",
        "to": "5511999999999",
        "type": "location",
        "location": {
            "latitude": "-23.561414",
            "longitude": "-46.655881",
            "name": "Loja Paulista",
            "address": "Av. Paulista, 1000 - São Paulo, SP",
        },
    },
)
print(res.status_code, res.json())

Contatos#

De 1 a 5 cartões. Cada um exige name.formatted_name; phones, emails, urls, addresses, org e birthday são opcionais. Com wa_id no telefone, o cartão mostra o botão de conversar.

Resposta 200: a mesma de cima, com o id da mensagem.

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "5511999999999",
  "type": "contacts",
  "contacts": [
    {
      "name": {
        "formatted_name": "Maria Souza",
        "first_name": "Maria",
        "last_name": "Souza"
      },
      "phones": [
        {
          "phone": "+55 11 98888-7777",
          "type": "WORK",
          "wa_id": "5511988887777"
        }
      ],
      "emails": [
        {
          "email": "maria@example.com",
          "type": "WORK"
        }
      ],
      "org": {
        "company": "Loja Exemplo",
        "title": "Atendimento"
      }
    }
  ]
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "5511999999999",
    "type": "contacts",
    "contacts": [
      {
        "name": {
          "formatted_name": "Maria Souza",
          "first_name": "Maria",
          "last_name": "Souza"
        },
        "phones": [
          {
            "phone": "+55 11 98888-7777",
            "type": "WORK",
            "wa_id": "5511988887777"
          }
        ],
        "emails": [
          {
            "email": "maria@example.com",
            "type": "WORK"
          }
        ],
        "org": {
          "company": "Loja Exemplo",
          "title": "Atendimento"
        }
      }
    ]
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "recipient_type": "individual",
        "to": "5511999999999",
        "type": "contacts",
        "contacts": [
            {
                "name": {
                    "formatted_name": "Maria Souza",
                    "first_name": "Maria",
                    "last_name": "Souza",
                },
                "phones": [
                    {
                        "phone": "+55 11 98888-7777",
                        "type": "WORK",
                        "wa_id": "5511988887777",
                    },
                ],
                "emails": [
                    {
                        "email": "maria@example.com",
                        "type": "WORK",
                    },
                ],
                "org": {
                    "company": "Loja Exemplo",
                    "title": "Atendimento",
                },
            },
        ],
    },
)
print(res.status_code, res.json())

Reação#

reaction.message_id é o wamid da mensagem que recebe o emoji (do cliente ou da empresa). Um emoji vazio ("") remove a reação. A reação não aceita context.

Resposta 200: a mesma de cima, com o id da mensagem.

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "5511999999999",
  "type": "reaction",
  "reaction": {
    "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA==",
    "emoji": "👍"
  }
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "5511999999999",
    "type": "reaction",
    "reaction": {
      "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA==",
      "emoji": "👍"
    }
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "recipient_type": "individual",
        "to": "5511999999999",
        "type": "reaction",
        "reaction": {
            "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA==",
            "emoji": "👍",
        },
    },
)
print(res.status_code, res.json())

Responder a uma mensagem#

context.message_id é o wamid da mensagem respondida: a nova aparece citando a anterior. Vale para os tipos acima, menos reação. Para responder a uma mensagem recebida, use o messages[].id do webhook.

Resposta 200: a mesma de cima, com o id da mensagem.

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "5511999999999",
  "context": {
    "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA=="
  },
  "type": "text",
  "text": {
    "body": "Sim, temos em azul e em verde."
  }
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "5511999999999",
    "context": {
      "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA=="
    },
    "type": "text",
    "text": {
      "body": "Sim, temos em azul e em verde."
    }
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "recipient_type": "individual",
        "to": "5511999999999",
        "context": {
            "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA==",
        },
        "type": "text",
        "text": {
            "body": "Sim, temos em azul e em verde.",
        },
    },
)
print(res.status_code, res.json())

Marcar como lida#

Marca uma mensagem recebida como lida (os dois tiques azuis para o cliente). Não tem to nem type, e não vira uma mensagem na conversa. Vai direto à Meta: não passa pela Idempotency-Key, mas conta no limite de taxa do número.

Resposta 200:

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "status": "read",
  "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA=="
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "status": "read",
    "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA=="
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "status": "read",
        "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA==",
    },
)
print(res.status_code, res.json())
JSON
{
  "success": true
}

Digitando…#

O indicador de digitação é a mesma chamada, com typing_indicator. Ele só existe junto da confirmação de leitura: a conversa mostra "digitando…" até a próxima mensagem da empresa, por no máximo 25 s. Use enquanto o seu sistema prepara a resposta.

Resposta 200:

Exemplo

curl

curl -X POST 'https://api.synergyconnect.com.br/v25.0/106540352242922/messages' \
  -H "Authorization: Bearer $SYNERGY_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "messaging_product": "whatsapp",
  "status": "read",
  "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA==",
  "typing_indicator": {
    "type": "text"
  }
}'

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "messaging_product": "whatsapp",
    "status": "read",
    "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA==",
    "typing_indicator": {
      "type": "text"
    }
  }),
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.post(
    "https://api.synergyconnect.com.br/v25.0/106540352242922/messages",
    headers={"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"},
    json={
        "messaging_product": "whatsapp",
        "status": "read",
        "message_id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNFQjBDNUE2RjQ3RjE4QjdBMzQ1AA==",
        "typing_indicator": {
            "type": "text",
        },
    },
)
print(res.status_code, res.json())
JSON
{
  "success": true
}

Erros#

O erro da Meta volta com o status e o corpo dela (por exemplo 400 com o código 131047, fora da janela de 24 h). Os erros da Synergy e o que fazer com cada um estão em Erros; os limites, em Limites de taxa. Um envio aceito (200) ainda pode falhar depois: o status failed do webhook traz o motivo em errors.

Os campos de cada tipo e todos os exemplos estão na referência da API (sendMessage). Mensagens com botões, lista e Flow estão em Mensagens interativas; modelos, em Modelos de mensagem (templates).

Ficou com dúvida? Escreva para suporte@synergyconnect.com.br.