Cómo enviar un video por la API de Waspy (MP4, 16 MB, sin convertir un .mov)
POST /api/v2/messages con type video y un link https. La API pública no convierte un .mov a MP4. El tope al bajar el archivo es 16 MB. Fuera de la ventana, 403.
Respuesta corta: para mandar un video por la API pública de Waspy hacés POST https://api.waspytech.com/api/v2/messages con type: "video", video.link (un https público) o video.id (un media id de Meta, no un UUID de Waspy) y el scope messages:write. El phoneNumberId es el UUID de GET /api/v2/channels. Si la ventana de 24 horas está cerrada, la API responde 403 SERVICE_WINDOW_EXPIRED y no encola nada.
La referencia está en messages. Foto, PDF y audio, que comparten este POST, están en enviar foto, PDF y audio. Esta nota se queda en el video: formato, tope y qué camino convierte un .mov.
La clave está en Scale (US$150 por mes) y Enterprise. Starter y Growth no la incluyen. Los planes están en Planes y el módulo, en la API.
El pedido
curl -sS -X POST https://api.waspytech.com/api/v2/messages \
-H "Authorization: Bearer $WASPY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: vestido-azul-video-2026-11-11" \
-d '{
"phoneNumberId": "UUID-DEL-CANAL",
"to": "+5491155554444",
"type": "video",
"video": {
"link": "https://cdn.mitienda.com.ar/vestido-azul.mp4",
"caption": "Vestido azul, talle M, en movimiento."
},
"clientRef": "pedido-1847-video"
}'
Un celular argentino va como +549 más el código de área sin 0 y el número sin el 15. caption es opcional. El objeto video no tiene filename: ese campo es de document.
El 201 trae data.id, data.status: "queued" y data.waMessageId: null. El wamid llega después, en el webhook message.status_changed o en GET /api/v2/messages/:id. clientRef (máximo 256 caracteres) vuelve igual en ese webhook.
| Header o campo | Qué hace |
|---|---|
Idempotency-Key | Si la misma clave ya terminó, Waspy repite el 201 guardado durante 24 horas y manda Idempotency-Replayed: true. Si todavía está en curso, 409 IDEMPOTENCY_CONFLICT |
video.id | Media id de Meta. Se reenvía tal cual, sin bajar el archivo |
video.link | Tiene que ser https. http, localhost o una IP privada no se bajan |
Sin id ni link | Meta responde 132018 (Either one of media ID or link must be present) |
id y no baja el link.
16 MB, 60 segundos, y el .mov que no se convierte
El worker baja el link antes de subir los bytes a Meta. El tope de ese tipo está en el código como 16 1024 1024 bytes. El tiempo de la bajada es 60 segundos. Sigue hasta 5 redirects, y valida cada salto antes de pedirlo. Si la URL responde una página HTML (un login o el aviso de Google Drive) y no viene como adjunto, no la sube.
Si la bajada falla —se pasa del tope, se corta el tiempo, o el host no responde— el worker le pasa a Meta el link original. El POST ya había respondido 201: el tamaño no se rechaza en el momento del curl. Si Meta tampoco puede usar el archivo, el mensaje queda failed.
La Cloud API documenta video en MP4 o 3GPP. La página de media está en la referencia de Meta. Un .mov (QuickTime del iPhone) no se convierte en este camino. El worker sube el mime que devolvió el servidor del link.
La conversión existe, pero en otro lado: la subida del panel (/media/upload de la app, no de /api/v2). Ahí, si el mime es video/ y no es video/mp4 ni video/3gpp, Waspy intenta un remux a MP4 y, si el codec no entra, reencodea a H.264 y AAC. Esa función no corre cuando el video entra por video.link de la API pública.
Para un video grabado en un iPhone, exportalo a MP4 (H.264 y AAC) y publicalo en un https que no pida login. Un link de Drive “cualquiera con el enlace” suele devolver HTML: no sirve.
No hay POST /api/v2/media. El límite está escrito en limitaciones. Bajar el video que te mandó el cliente es otro pedido, con mediaKey y GET /api/v2/media/by-key: descargar media entrante.
La ventana, y lo que no manda el conector
Un video no es una plantilla. dispatchOutboundMessage exige la ventana de 24 horas para todo lo que no sea template. Si serviceWindowExpiresAt ya pasó, o el chat es nuevo y ese campo está vacío, la respuesta es 403 SERVICE_WINDOW_EXPIRED. La fecha se lee con GET /api/v2/conversations/:id. La regla está en la ventana de 24 horas.
El conector MCP (https://api.waspytech.com/mcp) tiene send_message, y esa herramienta pide conversationId y text. No acepta un video. send_template manda una plantilla ya aprobada, también sin archivo suelto. Claude, ChatGPT, Cursor, Codex o Grok pueden armar el JSON del POST si una persona lo revisa; el envío del video es esta llamada REST, no la herramienta de texto. Cómo se conecta el MCP está en Claude, ChatGPT y Cursor.
El mismo body entra en un nodo HTTP de n8n, Make o Zapier. El armado del nodo está en conectar n8n, Make y Zapier.
Google Apps Script
La planilla no sube el archivo. Publicá el MP4 en un https y llamá al mismo POST. La key va en las propiedades del script, no en la celda.
function enviarVideoWhatsApp() {
var key = PropertiesService.getScriptProperties().getProperty('WASPY_API_KEY');
var res = UrlFetchApp.fetch('https://api.waspytech.com/api/v2/messages', {
method: 'post',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + key },
muteHttpExceptions: true,
payload: JSON.stringify({
phoneNumberId: 'UUID-DEL-CANAL',
to: '+5491155554444',
type: 'video',
video: {
link: 'https://cdn.mitienda.com.ar/vestido-azul.mp4',
caption: 'Vestido azul, talle M.'
},
clientRef: 'sheet-video-1'
})
});
Logger.log(res.getResponseCode() + ' ' + res.getContentText());
}
Un 201 no significa que la persona ya vio el video. El texto de otras celdas (plantillas, no video) está en enviar desde Google Sheets.
Cuánto sale, y contra qué API compararlo
En Argentina, desde el 1 de octubre de 2026, un video entregado dentro de la ventana es servicio: 1.000 por número y por mes sin cargo y, desde el 1.001, alrededor de ARS 37,68 (~US$0,026). Waspy no agrega un porcentaje. La fuente es la rate card. El desglose está en cuánto cuesta la API.
| Camino | Cómo sale el video |
|---|---|
| API de Waspy | link https o id de Meta en POST /api/v2/messages. Sin upload público. El equipo lo ve en la bandeja |
| Cloud API directa | Subís el binario a /{phone-number-id}/media y después mandás el id. Referencia |
| Twilio o 360dialog | La API de ese proveedor, encima de la Cloud API |
| Z-API | Sesión tipo WhatsApp Web. No es la API oficial |
/api/v2/messages/batch, hasta 100 ítems, con el mismo objeto video. El lote está en mensajes en batch. Cada video entregado cuenta como un mensaje.
La clave se crea en Configuración → Claves de API. Diez días de prueba, sin tarjeta, en waspytech.com.
