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_wabaLa 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
messengerTu 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.
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.
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.
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 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.