What's new, 21 October 2026: A customer who sends several messages before the bot's first reply no longer gets the opening sequence of a Chat Flow twice
WASync · Developers

Sua primeira mensagem

Envie um texto pelo WhatsApp, leia a conversa de volta e deixe o cliente com os dois tiques azuis.

Enviar um texto

POST /messages
curl -X POST https://developers.wasync.app/api/v1/messages \
  -H "Authorization: Bearer $WASYNC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"connectionId":"conn_8f3a21","to":"40700000000","text":"Hi from my app 👋"}'
200 response
{
  "messageId": "cmqj3k2ab0001xyz",
  "waMessageId": "[email protected]_3EB0A1B2C3",
  "status": "sent"
}

to aceita apenas dígitos no formato internacional, sem + — por exemplo, 40700000000. text tem no máximo 4096 caracteres. Para mídia, envie media em vez de text: { filename, mimetype, data (base64, ≤ 16 MB), caption? } — exatamente um dos dois. Notas de voz usam mimetype: audio/ogg e um nome de arquivo voice-*.ogg. Usa whatsapp.send.

Defina o timeout HTTP para pelo menos 180 segundos

Um envio qr normalmente leva de 1 a 7 s, até cerca de 20 s para textos longos, e o caminho de autorrecuperação pode levar ~2,5 minutos. Um envio cloud_api leva cerca de 1 s. Um envio lento não é uma falha — um cliente que desiste aos 30 s e tenta de novo envia a mensagem duas vezes ao cliente final. Passe sempre um idempotencyKey (um UUID por envio lógico) e tente de novo com o mesmo.

Dois ids — use o certo para relacionar

A resposta traz dois identificadores, e eles não são intercambiáveis.

IdOnde aparecePara que usar
messageId (um cuid)messageId no POST, id no GET, message.id nos dois webhooksO único id para relacionar registros. Guarde-o ao enviar, use-o para deduplicar e para casar os eventos message.status.
waMessageIdwaMessageId (REST), wa_id (webhooks), wa_message_id (envio de mídia)Chamados de suporte e depuração. Pode ser null — nunca use para relacionar nem deduplicar.

Vale tratar um caso degradado no código: { "messageId": null, "waMessageId": "…", "status": …, "persisted": false } com HTTP 200 significa que a mensagem foi entregue, mas não foi persistida. Não tente de novo.

Ler a conversa de volta

GET /messages
curl "https://developers.wasync.app/api/v1/messages?connectionId=conn_8f3a21&limit=20" \
  -H "Authorization: Bearer $WASYNC_API_KEY"
200 response
{
  "messages": [
    {
      "id": "cmqj3k2ab0001xyz",
      "waMessageId": "[email protected]_3EB0A1B2C3",
      "connectionId": "conn_8f3a21",
      "direction": "outgoing",
      "text": "Hi from my app 👋",
      "mediaUrl": null,
      "mediaType": null,
      "status": "delivered",
      "errorMessage": null,
      "createdAt": "2026-07-22T10:00:00.000Z"
    }
  ],
  "nextCursor": "cmqj3k2ab0001xyz",
  "hasMore": true
}

As mais recentes vêm primeiro, com paginação por cursor: limit vai de 1 a 100 (padrão 20), e cursor recebe o nextCursor da resposta anterior. Usa whatsapp.read.

Deixe o cliente com os tiques azuis

POST /messages/read
curl -X POST https://developers.wasync.app/api/v1/messages/read \
  -H "Authorization: Bearer $WASYNC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"connectionId":"conn_8f3a21","phone":"40700000000"}'

Chame este endpoint quando um operador abrir a conversa na sua interface — caso contrário, ninguém abre o chat no WhatsApp, as mensagens do cliente continuam com dois tiques cinza e a conversa parece ignorada. O corpo é { connectionId, phone?, messageId? }, com pelo menos um entre phone / messageId (o cuid de uma mensagem recebida; messageId prevalece quando os dois são informados). Usa whatsapp.send, e não whatsapp.read, porque transmite um recibo de leitura ao cliente. É idempotente, sem chave e sem limite de requisições. Retorna { "ok": true, "marked": 3 }.

Próximos passos

  • Seja avisado sobre mensagens recebidas em vez de fazer polling: Webhooks.
  • Monte tudo sem código: n8n ou MCP.
  • Gere um cliente a partir do contrato: npx @openapitools/openapi-generator-cli generate -i https://developers.wasync.app/openapi.json -g typescript-fetch -o ./wasync-client
Esta página foi útil?

On this page