POST /v1/messages con type: "text". Devuelve 202 (aceptado, NO enviado): se encola y se drena a ritmo controlado. El header Idempotency-Key (UUID) es obligatorio — reintentar con la misma key devuelve el mismo registro (200) en vez de duplicar. Identificá el número emisor con connectionId (conn_…) o 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 dónde salen esos dos: el conn_… es el campo id de GET /v1/connections (y está copiable en la ficha del número, en el panel); el phoneNumberId es el campo phoneNumberId de esa misma respuesta. Uno de los dos es obligatorio, aunque tengas un solo número (si no mandás ninguno: CONNECTION_REQUIRED).
to va en formato E.164 (solo dígitos, 8–15). En el ejemplo va tu propio número para que puedas probar contra vos mismo.
Vista previa de un enlace: agregá preview_url: true dentro de text y WhatsApp intenta renderizar la tarjeta del primer enlace del cuerpo. La arma Meta con los metadatos de esa página: si no los tiene, el mensaje sale igual sin vista previa — no es un error. Es opcional; sin el campo, todo funciona como siempre.
Respuesta: { id: "msg_…", status: "queued" } (o held con un reason). El estado se sigue con GET /v1/messages/:id.