Partners
Conecte seus clientessem tocar nas credenciais deles.
Agências e plataformas revendem mensageria sem virar o suporte do setup da Meta. Você envia um link; seu cliente autoriza com a Meta; o sender conectado aparece no seu projeto, na mesma API de todo o resto que você entrega.
- Um link por cliente
- Uma sub-conta por cliente
- Uma fatura, a sua
O que um link conecta
Duas rotas de entrada. Uma por convite.
connectionType decide qual diálogo seu cliente vê e quais campos o convite aceita.
Conta do WhatsApp Business
whatsapp_wabaO padrão. O signup embutido da Meta vincula uma conta oficial do WhatsApp Business, e o sender é criado no seu projeto quando seu cliente termina.
- Pré-atribua um dos seus números Zavu com phoneNumberId, ou deixe por conta dele
- Restrinja de quais países o número dele pode vir com allowedPhoneCountries
- Conclui com o ID do número de WhatsApp e o nome verificado
Página do Facebook
messengerSeu cliente autoriza com o Facebook e escolhe uma página que administra. A caixa do Messenger dessa página — com chats do Marketplace — é roteada para a Zavu.
- Ele precisa administrar ao menos uma página, ou o convite falha com meta_no_pages
- phoneNumberId e allowedPhoneCountries são recusados com 400: uma página não tem número
- Conclui com o ID da página do Facebook e o nome da página
Um convite conecta um canal. Para deixar um cliente no WhatsApp e no Messenger, envie dois — cada um se completa no próprio sender.
Uma página do Facebook só pode estar conectada a um projeto Zavu por vez. Se seu cliente escolher uma página que outro projeto já conectou, a conexão nova vence e a anterior é desconectada.
A máquina de estados
Você não vai estar olhando. O webhook vai.
Seu cliente está dentro do diálogo da Meta; o que volta é invitation.status_changed. Percorra os passos, bifurque o final e leia o que de fato cai no seu 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 como documentados na referência da API: Invitation, InvitationStatus, invitation.status_changed.
A superfície inteira
Seis chamadas e você revende.
Convites e sub-contas estão no SDK. A rota do Messenger aparece via REST enquanto os clientes gerados alcançam ela.
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"O limite
Um cliente pode gastar seu dinheiro. Decida quanto.
As cobranças de uma sub-conta vão para o saldo do seu time. creditLimit é o que separa o loop descontrolado de um cliente da sua fatura — e vai em centavos. Mova o limite, gaste contra ele e veja qual lado para.
Definido em centavos na API. 0 — ou omitir o campo — significa sem limite algum.
- Seu saldo
- $1200.00
- totalSpent
- $0.00
- Folga
- $100.00
Uso simulado na API key do cliente. Os valores são ilustrativos.
Registro
- Nada gasto ainda.
GET /v1/sub-accounts/sub_2f91c4/balance · 200
{
"balance": 120000,
"currency": "usd",
"creditLimit": 10000,
"totalSpent": 0,
"isSubAccount": true
}O formato devolvido por GET /v1/sub-accounts/{id}/balance. balance é o do seu time, em centavos, porque toda cobrança é faturada ao pai.
O que é uma sub-conta
O projeto deles. A sua conta.
As próprias API keys
Emita keys live ou test por cliente. A key completa volta uma vez, na criação; qualquer leitura posterior devolve só o prefixo.
Não administra irmãs
Keys de sub-conta respondem 403 em todos os endpoints de sub-contas. Uma key de cliente nunca lista, cria nem inspeciona outro cliente.
Um saldo, o seu
Toda cobrança cai no saldo do time pai. Você lê o totalSpent e o creditLimit de um cliente sem dar a ele nenhum jeito de passar do limite.
Encerrar é limpo
Desativar uma sub-conta devolve o saldo restante ao seu time e revoga todas as API keys dela, e informa quantas revogou.
Antes de revender em cima disso
- Um convite conecta um canal. Dois canais para o mesmo cliente são dois convites, cada um se completando no próprio sender.
- phoneNumberId e allowedPhoneCountries são só do WhatsApp. Enviar qualquer um com connectionType messenger devolve 400, não é ignorado.
- Uma página do Facebook só pode estar conectada a um projeto Zavu por vez. A conexão nova vence e a anterior é desconectada.
- Um convite expira nos dias que você definir — entre 1 e 30, padrão 7. Cancelar um link o encerra de vez.
- creditLimit vai em centavos, e 0 significa sem limite. Um limite de 2500 é $25.00, não $2.500.
- API keys de sub-conta recebem 403 na administração de sub-contas. Essa superfície é da key do projeto pai.
Seus clientes, sua conta, sua fatura.
Comece grátis, sem cartão. Convites e sub-contas estão em todos os planos.