← Dashboard

WhatsApp Hub API

API REST para enviar mensajes de WhatsApp y gestionar conexiones multi-tenant. Permite que tus aplicaciones envíen notificaciones, alertas y mensajes a través de WhatsApp sin que el usuario final necesite configurar nada con Meta.

Base URL: https://wa.pocus.com.ar

Dos canales disponibles

CanalDescripciónCuándo usarlo
evolutionQR de WhatsApp (no oficial)Onboarding simple, notificaciones internas, clientes sin Meta App
metaMeta Cloud API (oficial)Bots, flujos Typebot, volúmenes altos, cumplimiento total

Autenticación

Todos los endpoints de la Tenant API requieren una API key en el header x-api-key. Los endpoints Admin requieren el token de administrador en x-admin-token.

HeaderDescripciónEndpoints
x-api-keyAPI key del tenantTenant API
x-admin-tokenToken de administradorAdmin API
# Ejemplo con curl
curl -X POST https://wa.pocus.com.ar/api/v1/send \
  -H "x-api-key: pk_tu_api_key_aqui" \
  -H "Content-Type: application/json" \
  -d '{"to": "5491112345678", "message": "Hola!"}'
Rate limit: 100 requests por minuto por API key. Superarlo devuelve HTTP 429.

Errores

CódigoDescripción
400Parámetros faltantes o inválidos
401API key inválida o ausente
404Recurso no encontrado
429Rate limit excedido
500Error interno (ver campo error en la respuesta)
{
  "ok": false,
  "error": "Descripción del error"
}

Conectar WhatsApp

POST /api/v1/connect Tenant API

Inicia el proceso de conexión. Si el número no está conectado, devuelve un QR en base64 para escanear con el celular. Si ya está conectado, devuelve already_connected.

Respuesta exitosa — QR listo

{
  "ok": true,
  "status": "qr_ready",
  "qr": {
    "base64": "data:image/png;base64,...",
    "code": "2@xxx..."
  }
}

Respuesta — ya conectado

{
  "ok": true,
  "status": "already_connected",
  "message": "Ya conectado"
}
Para mostrar el QR: <img src="${qr.base64}">

Estado de conexión

GET /api/v1/status Tenant API

Devuelve el estado actual de la conexión WhatsApp.

{
  "ok": true,
  "status": "open",  // "open" | "close" | "connecting" | "disconnected"
  "connected": true
}

Enviar mensaje

POST /api/v1/send Tenant API

Envía un mensaje de WhatsApp a un número de teléfono.

Body

CampoTipoRequeridoDescripción
tostringREQUERIDONúmero en formato internacional sin + (ej: 5491112345678)
messagestringREQUERIDOTexto del mensaje
typestringopcionaltext (default)
{
  "to": "5491112345678",
  "message": "Tu pedido #1234 fue confirmado. Total: $5.000"
}

Respuesta exitosa

{
  "ok": true,
  "result": { "key": { "id": "ABC123..." } }
}

Desconectar

POST /api/v1/disconnect Tenant API

Desconecta el WhatsApp asociado al tenant. El QR se invalida y hay que volver a escanear para reconectar.

{ "ok": true }

Listar tenants

GET /api/admin/tenants Admin

Devuelve todos los tenants con stats de uso. La API key aparece truncada (pk_xxxxxx...).

Crear tenant

POST /api/admin/tenants Admin
CampoTipoRequeridoDescripción
namestringREQUERIDONombre del cliente
descriptionstringopcionalDescripción del uso
channelstringopcionalevolution (default) o meta
phoneNumberstringopcionalNúmero de teléfono asociado

Respuesta

{
  "ok": true,
  "tenant": {
    "id": "uuid",
    "name": "Univet",
    "apiKey": "pk_abc123...",   // guardar ahora, no se vuelve a mostrar completa
    "channel": "evolution",
    "active": true,
    "createdAt": "2026-03-24T..."
  }
}

Actualizar tenant

PATCH /api/admin/tenants/:id Admin

Actualiza campos del tenant. También podés desactivarlo temporalmente con active: false.

{
  "active": false   // suspende el acceso sin eliminar
}

Eliminar tenant

DELETE /api/admin/tenants/:id Admin

Elimina el tenant y desconecta su instancia de WhatsApp. Irreversible.

Ver logs de uso

GET /api/admin/tenants/:id/logs Admin

Devuelve los últimos eventos del tenant. Query param ?limit=N (default 50, max 500).

[
  { "ts": "2026-03-24T12:00:00Z", "action": "message_sent", "to": "5491112345678" },
  { "ts": "2026-03-24T11:55:00Z", "action": "connect_qr_requested" }
]

Regenerar API key

POST /api/admin/tenants/:id/regenerate-key Admin

Genera una nueva API key. La anterior deja de funcionar inmediatamente.

{ "ok": true, "apiKey": "pk_nueva_key..." }

Guía: Flujo QR completo

Para conectar el WhatsApp de tu usuario y luego enviarle mensajes:

Paso 1 — Obtener QR

// En tu backend
const res = await fetch('https://wa.pocus.com.ar/api/v1/connect', {
  method: 'POST',
  headers: { 'x-api-key': 'pk_tu_key' }
})
const data = await res.json()
// data.qr.base64 → mostrar como imagen al usuario

Paso 2 — Mostrar QR al usuario

<!-- En tu frontend -->
<img src="${data.qr.base64}" alt="Escaneá con WhatsApp" />
<p>Abrí WhatsApp → Dispositivos vinculados → Vincular dispositivo</p>

Paso 3 — Verificar conexión

const status = await fetch('https://wa.pocus.com.ar/api/v1/status', {
  headers: { 'x-api-key': 'pk_tu_key' }
})
const { connected } = await status.json()
if (connected) console.log('✅ WhatsApp conectado')

Paso 4 — Enviar notificaciones

await fetch('https://wa.pocus.com.ar/api/v1/send', {
  method: 'POST',
  headers: { 'x-api-key': 'pk_tu_key', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    to: '5491112345678',
    message: 'Tu pedido #1234 fue confirmado 🎉'
  })
})

Guía: Notificaciones WooCommerce

Enviá una notificación automática cuando se genera un pedido nuevo.

// functions.php de tu tema o plugin custom
add_action('woocommerce_checkout_order_processed', function($order_id) {
  $order = wc_get_order($order_id);
  $phone = $order->get_billing_phone();
  $phone = preg_replace('/[^0-9]/', '', $phone); // limpiar formato
  $msg = "Hola {$order->get_billing_first_name()}! Tu pedido #{$order_id} fue recibido. Total: $" . $order->get_total();

  wp_remote_post('https://wa.pocus.com.ar/api/v1/send', [
    'headers' => [
      'x-api-key'    => 'pk_tu_key_aqui',
      'Content-Type' => 'application/json',
    ],
    'body' => json_encode(['to' => $phone, 'message' => $msg]),
  ]);
});
Asegurate de que el campo de teléfono en el checkout de WooCommerce sea obligatorio y que el cliente ingrese el número con código de país (ej: +54 9 11...).