POST /v1/messages com type: "text". Devolve 202 (aceito, NÃO enviado): entra na fila e é drenado em ritmo controlado. O header Idempotency-Key (UUID) é obrigatório — repetir com a mesma key devolve o mesmo registro (200) em vez de duplicar. Identifique o número emissor com connectionId (conn_…) ou from (phoneNumberId).
curl -X POST https://api.waiaconnect.com/v1/messages \
-H "Authorization: Bearer wc_live_YOUR_API_KEY" \
-H "Idempotency-Key: REPLACE-WITH-A-UNIQUE-ID" \
-H "Content-Type: application/json" \
-d '{"connectionId":"conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","to":"5493511234567","type":"text","text":{"body":"Hello from WAIA Connect"}}'De onde saem esses dois: o conn_… é o campo id de GET /v1/connections (e pode ser copiado na ficha do número, no painel); o phoneNumberId é o campo phoneNumberId dessa mesma resposta. Um dos dois é obrigatório, mesmo que você tenha um só número (se não mandar nenhum: CONNECTION_REQUIRED).
to vai no formato E.164 (só dígitos, 8–15). No exemplo vai o seu próprio número, para você poder testar contra si mesmo.
Pré-visualização de um link: acrescente preview_url: true dentro de text e o WhatsApp tenta mostrar o cartão do primeiro link do corpo. Quem o monta é a Meta, com os metadados dessa página: se ela não os tiver, a mensagem sai igual, sem pré-visualização — não é um erro. É opcional; sem o campo, tudo funciona como sempre.
Resposta: { id: "msg_…", status: "queued" } (ou held com um reason). O estado é acompanhado com GET /v1/messages/:id.