Partners

Conecta a tus clientessin tocar sus credenciales.

Agencias y plataformas revenden mensajería sin convertirse en la mesa de ayuda del setup de Meta. Tú envías un link; tu cliente autoriza con Meta; el sender conectado aparece en tu proyecto, sobre la misma API que todo lo demás que envías.

  • Un link por cliente
  • Una sub-cuenta por cliente
  • Una factura, la tuya

Qué conecta un link

Dos rutas de entrada. Una por invitación.

connectionType decide qué diálogo ve tu cliente y qué campos acepta la invitación.

Cuenta de WhatsApp Business

whatsapp_waba

La opción por defecto. El signup embebido de Meta vincula una cuenta oficial de WhatsApp Business, y el sender se crea en tu proyecto cuando tu cliente termina.

  • Preasigna uno de tus números de Zavu con phoneNumberId, o déjalo en sus manos
  • Restringe de qué países puede venir su número con allowedPhoneCountries
  • Se completa con el ID del número de WhatsApp y su nombre verificado

Página de Facebook

messenger

Tu cliente autoriza con Facebook y elige una página que administre. La bandeja de Messenger de esa página — con chats de Marketplace incluidos — se enruta a Zavu.

  • Debe administrar al menos una página, o la invitación falla con meta_no_pages
  • phoneNumberId y allowedPhoneCountries se rechazan con 400: una página no tiene número
  • Se completa con el ID de la página de Facebook y su nombre

Una invitación conecta un canal. Para dejar a un cliente en WhatsApp y en Messenger, envía dos — cada una se completa en su propio sender.

Una página de Facebook solo puede estar conectada a un proyecto de Zavu a la vez. Si tu cliente elige una página que otro proyecto ya conectó, gana la conexión nueva y la anterior se desconecta.

La máquina de estados

Tú no vas a estar mirando. El webhook sí.

Tu cliente está dentro del diálogo de Meta; lo único que vuelve es invitation.status_changed. Recorre los pasos, bifurca el final y lee lo que realmente aterriza en tu endpoint.

connectionType
statuspending

POST /v1/invitations · 201

{
  "invitation": {
    "id": "inv_8ac31f",
    "url": "https://dashboard.zavu.dev/invite/9f2b7c1e",
    "connectionType": "whatsapp_waba",
    "status": "pending",
    "clientName": "Acme Corp",
    "clientEmail": "ops@acme.com",
    "expiresAt": "2026-03-01T10:00:00Z",
    "viewedAt": null,
    "startedAt": null,
    "senderId": null,
    "connectedAccount": null
  }
}

Campos tal como están documentados en la referencia de la API: Invitation, InvitationStatus, invitation.status_changed.

Toda la superficie

Seis llamadas y ya revendes.

Invitaciones y sub-cuentas están en el SDK. La ruta de Messenger se muestra por REST mientras los clientes generados se ponen al día.

invite.ts
npm add @zavudev/sdk
import Zavudev from "@zavudev/sdk"

const zavu = new Zavudev({ apiKey: process.env.ZAVU_API_KEY })

// One invitation connects one channel. Send a second one for Messenger.
const { invitation } = await zavu.invitations.create({
  clientName: "Acme Corp",
  clientEmail: "ops@acme.com",
  connectionType: "whatsapp_waba",
  allowedPhoneCountries: ["US", "MX"],
  expiresInDays: 14, // 1-30, defaults to 7
})

// Send this to your client. Nothing else is required of you.
console.log(invitation.url, invitation.status) // ... "pending"

El tope

Un cliente puede gastar tu dinero. Decide cuánto.

Los cargos de una sub-cuenta se facturan al balance de tu equipo. creditLimit es lo que separa el bucle desbocado de un cliente de tu factura — y va en centavos. Mueve el tope, gasta contra él y mira qué lado se detiene.

$100.00 · creditLimit: 10000

Se define en centavos en la API. 0 — u omitir el campo — significa sin límite.

Tu balance
$1200.00
totalSpent
$0.00
Margen
$100.00
Gasto del cliente

Gasto simulado sobre la API key del cliente. Los montos son ilustrativos.

Registro

  • Todavía no hay gasto.

GET /v1/sub-accounts/sub_2f91c4/balance · 200

{
  "balance": 120000,
  "currency": "usd",
  "creditLimit": 10000,
  "totalSpent": 0,
  "isSubAccount": true
}

La forma que devuelve GET /v1/sub-accounts/{id}/balance. balance es el de tu equipo, en centavos, porque todos los cargos se facturan al padre.

Qué es una sub-cuenta

Su proyecto. Tu cuenta.

Sus propias API keys

Emite keys live o test por cliente. La key completa se devuelve una vez, al crearla; cualquier lectura posterior te da solo el prefijo.

No puede administrar hermanas

Las keys de sub-cuenta responden 403 en todos los endpoints de sub-cuentas. Una key de cliente nunca puede enumerar, crear ni inspeccionar a otro cliente.

Un balance, el tuyo

Cada cargo aterriza en el balance del equipo padre. Lees el totalSpent y el creditLimit de un cliente sin darle ninguna forma de pasarse del tope.

Cerrar una es limpio

Desactivar una sub-cuenta devuelve su balance restante a tu equipo y revoca todas sus API keys, y te dice cuántas revocó.

Antes de revender sobre esto

  • Una invitación conecta un canal. Dos canales para el mismo cliente son dos invitaciones, cada una completándose en su propio sender.
  • phoneNumberId y allowedPhoneCountries son solo de WhatsApp. Enviar cualquiera con connectionType messenger devuelve 400, no se ignora.
  • Una página de Facebook solo puede estar conectada a un proyecto de Zavu a la vez. Gana la conexión nueva y la anterior se desconecta.
  • Una invitación expira en los días que definas — entre 1 y 30, por defecto 7. Si cancelas un link, deja de funcionar para siempre.
  • creditLimit va en centavos, y 0 significa sin límite. Un tope de 2500 es $25.00, no $2.500.
  • Las API keys de sub-cuenta reciben 403 en la administración de sub-cuentas. Esa superficie es de la key del proyecto padre.

Tus clientes, tu cuenta, tu factura.

Empieza gratis, sin tarjeta. Las invitaciones y las sub-cuentas están en todos los planes.

Empieza a construir
Partners | Conecta clientes bajo tu propia cuenta — Zavu | Zavu