Volver al blog
Desarrolladores

API de WhatsApp: Waspy vs Twilio para desarrolladores en Argentina

Waspy autentica con Bearer wspy_ contra /api/v2. Twilio usa HTTP Basic y manda plantillas con ContentSid. El fee publicado de Twilio es US$0,005 por mensaje. Meta se cobra aparte.

· 13 min
API de WhatsApp: Waspy vs Twilio para desarrolladores en Argentina

Respuesta corta: si tu sistema manda WhatsApp, Waspy y Twilio no se llaman igual. Waspy es POST https://api.waspytech.com/api/v2/messages con Authorization: Bearer wspy_.... Twilio, en la guía de plantillas, es POST https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Messages.json con HTTP Basic y un ContentSid. El inbox del equipo ya está en Waspy. En Twilio hay que construirlo, o sumar otro producto.

La ficha corta, de octubre, está en Waspy vs Twilio. La guía de intención está en alternativa a Twilio. Esta nota es el contrato, con lo que el código y las dos documentaciones dicen el 5 de noviembre de 2026.

Auth, base y qué se manda

WaspyTwilio, según su doc del 5/11
AuthAuthorization: Bearer wspy_.... La key se crea en el panel. AutenticaciónHTTP Basic. La guía de plantillas usa -u $TWILIO_API_KEY:$TWILIO_API_SECRET y aclara que, para probar en local, también sirven Account SID y Auth Token
Basehttps://api.waspytech.com/api/v2https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/Messages.json
Textotype: "text", text.body. Solo con ventana de 24 h abiertaLa guía que leí manda plantillas, no un body de sesión. No invento el campo
Plantillatype: "template", template.name + language.code + componentsContentSid (empieza con HX) y ContentVariables en el recurso Messages. El alta de la plantilla es el Content Template Builder
Mediatype image, video, audio o document, con link https o id de Meta. No hay POST /api/v2/mediaEsa guía no muestra el campo de media. No lo afirmo
WebhooksAlta en /api/v2/webhooks. Eventos: message.received, message.status_changed, conversation.created, contact.createdEl tutorial no documenta el callback. La ficha de octubre apunta a la doc de WhatsApp de Twilio
IdempotenciaHeader Idempotency-Key, máx. 256 caracteres, 24 h. Replay: Idempotency-Replayed: true. Choque: 409 IDEMPOTENCY_CONFLICTNo comparo un header de Twilio: no está en la página que leí
Scopesmessages:write para enviar, messages:read para GET /messages/:id, webhooks:write para suscribir. Lista vacía en la key = acceso completoLa guía no publica una tabla de scopes de Waspy. Twilio autoriza la cuenta
Tope de la API120 requests por minuto por cuenta en /api/v2No fijo un número. No está en la página de precios ni en el tutorial de plantillas
El phoneNumberId de Waspy es el UUID del canal (GET /api/v2/channels), no el id de Meta. to va en E.164, por ejemplo +5491126032641, el número de los ejemplos de la doc.

Texto y plantilla en Waspy

Esto es el contrato de messages y de apps/api/src/routes/v2/messages.ts. El texto libre, si la ventana cerró, no se encola.

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: pedido-1847-texto" \
  -d '{
    "phoneNumberId": "UUID-DEL-CANAL",
    "to": "+5491126032641",
    "type": "text",
    "text": { "body": "Hola. Tu pedido 1847 ya salió." }
  }'

La plantilla tiene que estar approved. Crearlas por POST /api/v2/templates no existe: se crean en el panel o con la herramienta MCP create_template. El envío sí es REST.

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: pedido-1847-confirmacion" \
  -d '{
    "phoneNumberId": "UUID-DEL-CANAL",
    "to": "+5491126032641",
    "type": "template",
    "template": {
      "name": "confirmacion_pedido",
      "language": { "code": "es_AR" },
      "components": [
        {
          "type": "body",
          "parameters": [
            { "type": "text", "text": "María" },
            { "type": "text", "text": "1847" }
          ]
        }
      ]
    }
  }'

El 201 trae data.status: "queued" y waMessageId: null. El id de Meta llega después, en el webhook message.status_changed o en GET /api/v2/messages/:id. Una foto es el mismo POST con type: "image" y image.link. El lote es POST /api/v2/messages/batch (hasta 100, 202). El detalle de cada ruta está en la API para desarrolladores y en enviar una plantilla.

El mismo envío de plantilla, en fetch:

const res = await fetch("https://api.waspytech.com/api/v2/messages", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.WASPY_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": "pedido-1847-confirmacion",
  },
  body: JSON.stringify({
    phoneNumberId: process.env.WASPY_CHANNEL_ID,
    to: "+5491126032641",
    type: "template",
    template: {
      name: "confirmacion_pedido",
      language: { code: "es_AR" },
      components: [
        {
          type: "body",
          parameters: [
            { type: "text", text: "María" },
            { type: "text", text: "1847" },
          ],
        },
      ],
    },
  }),
});

Si repetís el POST con la misma Idempotency-Key dentro de las 24 horas, vuelve la respuesta cacheada y el header Idempotency-Replayed: true. Si la primera todavía está en curso, 409. Los scopes de cada ruta están en idempotencia y scopes y en scopes.

La plantilla del lado de Twilio

La guía oficial crea la plantilla en Messaging → Content Template Builder, la manda a aprobación de WhatsApp y después la envía con ContentSid. El nombre solo admite minúsculas, números y guion bajo. Una plantilla ya enviada a revisión no se edita: hay que crear otra. El curl que publica esa página es este, recortado a los campos que muestra:

curl -X POST "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Messages.json" \
  --data-urlencode "ContentSid=HXXXXXXXXX" \
  --data-urlencode "To=whatsapp:+18551234567" \
  --data-urlencode "From=whatsapp:+15005550006" \
  --data-urlencode "ContentVariables={\"1\":\"Name\"}" \
  --data-urlencode "MessagingServiceSid=MGXXXXXXXX" \
  -u $TWILIO_API_KEY:$TWILIO_API_SECRET

From y To llevan el prefijo whatsapp:. El Messaging Service figura como requerido en la tabla de esa guía. No traduzco ese ejemplo a un número argentino: los teléfonos son los del tutorial.

Precios: Meta, Waspy y el fee de Twilio

En Argentina, rate card de Meta vigente desde el 1 de octubre de 2026:

CategoríaPesosDólares
MarketingARS 89,56US$0,0618
UtilidadARS 37,68US$0,026
AutenticaciónARS 37,68US$0,026
Servicio1.000 por número y por mes; después ARS 37,68Después US$0,026
Fuentes: rate card para desarrolladores y precios de la plataforma. El desglose está en precios de la API.

Waspy no agrega un fee por mensaje. Meta te factura directo. La plataforma arranca en US$70 por mes. La clave wspy_ entra en Scale (US$150) y Enterprise. Diez días sin tarjeta, en el registro. Los planes están en Planes y el producto, en la API.

Twilio, leída el 5 de noviembre de 2026, publica US$0,005 por mensaje, entrante o saliente, y dice que además traslada las tarifas de Meta. No copio un número de marketing argentino desde esa página porque no está en el texto. Un ejemplo de la misma página sigue diciendo que, dentro de la ventana de atención, el fee de Meta no se cobra, y un FAQ dice que la utilidad dentro de esa ventana no paga el fee de Meta. Eso no coincide con la rate card del 1 de octubre de 2026: la utilidad se cobra también con la ventana abierta, y el servicio tiene tope de 1.000. Para presupuestar Argentina, manda la rate card, no ese ejemplo.

120 por minuto, y quién responde el chat

Rate limits describe 120 req/min. El servidor, en app.ts, aplica max: 120 con clave v2: + el id de la cuenta. Todas las keys comparten el cupo. El 429 es RATE_LIMITED, con Retry-After. El reintento está en rate limits y reintentos.

La API no reemplaza la bandeja. Quien atiende el “¿salió?” es el equipo, en el inbox. Un chatbot de pasos puede mandar un menú y derivar; no contesta esa pregunta ni inicia el chat. Si conectás un modelo de afuera, es tu integración, por esta API o por MCP, y el mensaje al cliente lo confirma una persona o lo manda tu sistema con la plantilla que ya aprobaste.

La referencia completa está en docs.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.