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_waba

O 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

messenger

Seu 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.

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

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"

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.

$100.00 · creditLimit: 10000

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 do cliente

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.

Comece a construir
Partners | Conecte clientes na sua própria conta — Zavu | Zavu