Volver al blog
Desarrolladores

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.

· 12 min
Cómo enviar un video por la API de Waspy (MP4, 16 MB, sin convertir un .mov)

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 campoQué hace
Idempotency-KeySi 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.idMedia id de Meta. Se reenvía tal cual, sin bajar el archivo
video.linkTiene que ser https. http, localhost o una IP privada no se bajan
Sin id ni linkMeta responde 132018 (Either one of media ID or link must be present)
Si mandás los dos, el worker usa el 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.

CaminoCómo sale el video
API de Waspylink https o id de Meta en POST /api/v2/messages. Sin upload público. El equipo lo ve en la bandeja
Cloud API directaSubís el binario a /{phone-number-id}/media y después mandás el id. Referencia
Twilio o 360dialogLa API de ese proveedor, encima de la Cloud API
Z-APISesión tipo WhatsApp Web. No es la API oficial
Varios videos en un solo POST van en /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.

Tu equipo atendiendo por WhatsApp en minutos

CRM facil pero potente. En 10 minutos tenes a tu equipo trabajando — no necesitas hablar con nadie.