Synergy Connect

Documentação

Listar as mensagens de uma conversa

GET/v1/numbers/{phone_number_id}/conversations/{conversation_id}/messages

As mensagens de uma conversa, da mais nova para a mais antiga, paginadas por before. Notas internas, reações e eventos de sistema não saem; mídia vem só com o id (a chave de leitura não baixa arquivos).

Requer#

Escopo da chave
read readComo os escopos funcionam
Recurso do plano
API e webhooks api e Inbox (fila da equipe) inboxVer os planos que incluem
Formato
Rota do Synergy. Erros no formato da Meta.

Parâmetros#

No caminho#

No caminho
NomeTipoObrigatórioDescrição
phone_number_idstringobrigatórioO phone_number_id do número na Meta (o mesmo da Cloud API). Precisa ser um número ativo da organização da chave.
conversation_idstringobrigatórioO id da conversa (de PublicConversation).

Na query#

Na query
NomeTipoObrigatórioDescrição
limitintegeropcionalItens por página: 1 a 50, padrão 20.
beforestringopcionalO paging.before da página anterior.

Cabeçalhos#

Cabeçalhos
NomeTipoObrigatórioDescrição
AuthorizationstringobrigatórioSua chave de API, no formato Bearer <chave>. Veja Autenticação.

Respostas#

Respostas
StatusCódigoQuando acontece
200—Duas mensagens
400100Cursor que não veio desta API (não é base64url de uma lista de inteiros, ou tem o tamanho errado)
400100Parâmetro fora da faixa (por exemplo limit acima de 50)
401190Sem Authorization: Bearer, chave malformada ou forjada, chave revogada, ou chave sem acesso a este número
403200A chave não tem o escopo read
4031390004O plano da organização não inclui a API
4031390011O plano da organização não inclui o Inbox (a leitura exige api e inbox)
4031390014O número foi congelado pela plataforma
404100O phone_number_id não é um número ativo desta organização (ou não tem de 5 a 20 dígitos)
404100A conversa não existe neste número
429130429Mais de 2000 requisições em 10 s com esta chave neste número (Retry-After: 10)
429130429O número acabou de recusar por vazão, ou está sobrecarregado: o 429 se repete por 200 ms (Retry-After: 1)
429130429Mais de 30 leituras em 60 s com esta chave neste número (Retry-After: 60)
4291390015O teto diário de páginas de leitura desta chave neste número acabou (Retry-After = segundos até 00:00 UTC)
5032Serviço temporariamente indisponível

Os erros no formato da Meta trazem o código em error.code. Ver todos os erros.

Corpo da resposta 200#

Campos da resposta 200
NomeTipoObrigatórioDescrição
dataobject[]obrigatório
data[].idstring | nullobrigatórioO wamid.
data[].directionstringobrigatórioValores: in, out.
data[].authorstringobrigatório
data[].timestampstringobrigatórioSegundos desde 1970, como texto.
data[].statusstring | nullobrigatórioSó em out. Valores: pending, sent, delivered, read, failed, null.
data[].typestringobrigatórioO type da Meta.
data[].messageobjectobrigatórioO objeto da mensagem como em messages[] do webhook.
data[].contextobject | nullobrigatório
pagingobjectobrigatório
paging.beforestring | nullobrigatórioCursor opaco das mensagens mais antigas; null = acabou.

Limites de taxa#

  • Borda: 2000 requisições a cada 10 s por chave × número (API_EDGE_LIMIT).
  • Leitura: 30 páginas a cada 60 s por chave × número (API_READ_LIMIT), além do limite de borda.
  • Teto diário: 1000 páginas por chave × número por dia UTC (um administrador da organização pode mudar entre 100 e 20.000 por chave em Configurações → Desenvolvedor). Passou: 429, código 1390015, até 00:00 UTC.

Notas#

  • Número: {phone_number_id} precisa ser um número de WhatsApp ativo que a chave alcança; qualquer outro (inclusive o id de uma conta do Instagram) responde 404 (código 100), sem acordar o número.
  • Plano: exige api e inbox, conferidos também pelo número a cada chamada: um downgrade recusa na chamada seguinte (403, código 1390011).
  • Tetos: cada chamada examina no máximo 500 conversas ou contatos (200 mensagens) e para; uma página curta com cursor não nulo quer dizer "continue". Cursores são opacos: um cursor inválido responde 400 (código 100), nunca 5xx.
  • Conteúdo de terceiro: nomes e textos que o contato controla saem como chegaram. Uma integração que passa isso a uma IA deve tratar como dado, não como instrução.
Requisição

curl

curl 'https://api.synergyconnect.com.br/v1/numbers/106540352242922/conversations/4182/messages?limit=20' \
  -H "Authorization: Bearer $SYNERGY_API_KEY"

JavaScript

const res = await fetch('https://api.synergyconnect.com.br/v1/numbers/106540352242922/conversations/4182/messages?limit=20', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`,
  },
});
console.log(res.status, await res.json());

Python

import os

import requests

res = requests.get(
    "https://api.synergyconnect.com.br/v1/numbers/106540352242922/conversations/4182/messages?limit=20",
    headers={
        "Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}",
    },
)
print(res.status_code, res.json())
Resposta

200

{
  "data": [
    {
      "id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABEYEjdGQjI0QzE4RTlBMDVENzQxAA==",
      "direction": "in",
      "author": "contact",
      "timestamp": "1767225600",
      "status": null,
      "type": "text",
      "message": {
        "from": "5511999999999",
        "id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABEYEjdGQjI0QzE4RTlBMDVENzQxAA==",
        "timestamp": "1767225600",
        "type": "text",
        "text": {
          "body": "Oi, meu pedido chegou?"
        },
        "referral": {
          "source_id": "120210000000000123",
          "source_type": "ad",
          "source_url": "https://fb.me/exemplo",
          "headline": "Frete grátis hoje",
          "body": "Peça pelo WhatsApp",
          "media_url": "https://scontent.xx.fbcdn.net/exemplo.jpg"
        }
      },
      "context": null
    },
    {
      "id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABEYEjI0QUY0QTk3QjI4QjE4MDBGNQA=",
      "direction": "out",
      "author": "api",
      "timestamp": "1767225590",
      "status": "read",
      "type": "template",
      "message": {
        "type": "template",
        "template": {
          "name": "pedido_enviado",
          "language": {
            "code": "pt_BR"
          }
        }
      },
      "context": null
    }
  ],
  "paging": {
    "before": "WzE3NjcyMjU1OTAwMDAsODEyXQ"
  }
}

400

{
  "error": {
    "message": "(#100) Invalid parameter.",
    "type": "OAuthException",
    "code": 100,
    "error_data": {
      "messaging_product": "whatsapp",
      "details": "Invalid cursor."
    },
    "fbtrace_id": "syn-3f9a1c0b"
  }
}

Há 2 casos com este status; veja a tabela de respostas.

401

{
  "error": {
    "message": "(#190) Invalid OAuth access token.",
    "type": "OAuthException",
    "code": 190,
    "fbtrace_id": "syn-3f9a1c0b"
  }
}

403

{
  "error": {
    "message": "(#200) Permissions error: this key does not have access to this resource.",
    "type": "OAuthException",
    "code": 200,
    "fbtrace_id": "syn-3f9a1c0b"
  }
}

Há 4 casos com este status; veja a tabela de respostas.

404

{
  "error": {
    "message": "(#100) Unsupported request: object does not exist or this key cannot reach it.",
    "type": "OAuthException",
    "code": 100,
    "fbtrace_id": "syn-3f9a1c0b"
  }
}

Há 2 casos com este status; veja a tabela de respostas.

429

{
  "error": {
    "message": "(#130429) Rate limit hit: the number's message throughput has been reached.",
    "type": "OAuthException",
    "code": 130429,
    "fbtrace_id": "syn-3f9a1c0b"
  }
}

Há 4 casos com este status; veja a tabela de respostas.

503

{
  "error": {
    "message": "(#2) Service temporarily unavailable.",
    "type": "OAuthException",
    "code": 2,
    "fbtrace_id": "syn-3f9a1c0b"
  }
}

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