Enviar mensaje de texto libre
Envía un mensaje por WhatsApp en nombre del business — texto libre, archivo multimedia, o ambos (texto como caption del archivo). La conversación debe estar dentro de la ventana de 24h (último mensaje del cliente < 24h atrás); si está cerrada, la respuesta es WINDOW_CLOSED (422) y el cliente debe enviar un template primero para reabrirla.
Variantes según body:
bodysinfile_uuid→ texto libre puro (max 4096 chars).file_uuidsinbody→ archivo solo (imagen/video/audio/documento).body+file_uuid→ archivo con caption (max 1024 chars). Excepción audio: WhatsApp no soporta captions en audio — si elfile_categoryresuelto esaudioy vienebody, la API respondeINVALID_REQUEST(400) con mensaje explícito. Envía el audio sinbody, o manda texto libre en un request separado.
Flujo para enviar con adjunto:
- Sube el archivo con
POST /files/request-upload→ obténupload_urlyfile_uuid. - Haz
PUTdel binario alupload_urldirecto a Supabase Storage (no pasa por este server). - Confirma con
POST /files/confirm→ el archivo quedaupload_status='confirmed'. - Llama a este endpoint con ese
file_uuid. Elfile_categorydel archivo determina el tipo de mensaje WhatsApp (image / video / audio / document).
El file_uuid solo puede usarse una vez “lógicamente” — nada impide reusarlo en múltiples mensajes (el archivo en Storage es el mismo), pero cada envío genera un message_uuid y wamid distintos.
Guards aplicados:
- Ventana 24h (siempre, texto y media).
- Wallet de visión (solo si
file_uuid) — si el business no tiene tokens de visión, el AI no podría procesar respuestas que referencien el multimedia y la API rechaza upfront conVISION_WALLET_BLOCKED(402).
Autorizaciones
API token emitido desde Settings → API Token del dashboard 1TO1 AI. Enviar en header Authorization: Bearer sk_1to1_...
Parámetros de ruta
Slug del business, case-insensitive. Debe coincidir con el business del token.
"acme"
Cuerpo
Identificador de la conversación — exactamente UNO de los cuatro campos debe venir. Orden de resolución: uuid > whatsapp_user_id > username > phone. El lookup filtra por el business del token (defense in depth cross-tenant). Resolver por phone o username puede devolver 409 (PHONE_NUMBER_AMBIGUOUS / USERNAME_AMBIGUOUS) cuando varios contactos comparten el identificador — aplica a cualquier endpoint que acepte esta referencia.
Contenido del mensaje. Sin file_uuid es texto libre (max 4096 chars). Con file_uuid actúa como caption del adjunto (max 1024 chars). Opcional solo si file_uuid viene — al menos uno de los dos es obligatorio.
1 - 4096"Hola! Gracias por tu compra."
UUID de un archivo ya confirmado via POST /files/confirm. El archivo debe pertenecer al mismo business del token y estar en estado confirmed. El file_category determina el tipo de mensaje (image, video, audio, document). Los stickers (image/webp) no se soportan por esta ruta.
UUID de un mensaje previo para citar (reply). Opcional — se ignora si el mensaje referenciado no pertenece a la conversación o no existe.
Respuesta
Mensaje creado y enviado a Meta. wamid es el id asignado.