Skip to main content
Sub-accounts let you provision isolated messaging environments for your customers with independent API keys and spending controls.

Create Sub-Account

const { subAccount } = await client.subAccounts.create({
  name: "Client ABC",
  externalId: "client_123",
  creditLimit: 100000, // $1,000.00 in cents
  metadata: {
    plan: "enterprise",
    region: "us-east",
  },
});

// Save this — only shown once
console.log(subAccount.apiKey);
console.log(subAccount.id);
console.log(subAccount.status); // active
The apiKey field is only included in the creation response. Store it securely.

Get Sub-Account

const { subAccount } = await client.subAccounts.get({
  id: "jx7abc123def456",
});

console.log(subAccount.name);
console.log(subAccount.status);
console.log(subAccount.totalSpent);
console.log(subAccount.creditLimit);

List Sub-Accounts

const { items, nextCursor } = await client.subAccounts.list({
  limit: 50,
});

for (const sub of items) {
  console.log(`${sub.name}: $${(sub.totalSpent / 100).toFixed(2)} spent`);
}

// Paginate
const nextPage = await client.subAccounts.list({
  limit: 50,
  cursor: nextCursor,
});

Update Sub-Account

const { subAccount } = await client.subAccounts.update("jx7abc123def456", {
  creditLimit: 200000, // Increase to $2,000
  metadata: { plan: "enterprise-plus" },
});

console.log(subAccount.creditLimit); // 200000

Suspend a Sub-Account

const { subAccount } = await client.subAccounts.update("jx7abc123def456", {
  status: "inactive",
});

// Re-activate later
const { subAccount: reactivated } = await client.subAccounts.update("jx7abc123def456", {
  status: "active",
});

Get Sub-Account Balance

const balance = await client.subAccounts.getBalance("jx7abc123def456");

console.log(`Team balance: $${(balance.balance / 100).toFixed(2)}`);
console.log(`Sub-account spent: $${(balance.totalSpent / 100).toFixed(2)}`);
console.log(`Credit limit: $${(balance.creditLimit / 100).toFixed(2)}`);
console.log(balance.isSubAccount); // true

Deactivate Sub-Account

const result = await client.subAccounts.deactivate("jx7abc123def456");
console.log(`Keys revoked: ${result.keysRevoked}`);

API Keys

List API Keys

const { items } = await client.subAccounts.listApiKeys("jx7abc123def456");

for (const key of items) {
  console.log(`${key.name} (${key.keyPrefix}...): ${key.environment}`);
}

Create API Key

const { apiKey } = await client.subAccounts.createApiKey("jx7abc123def456", {
  name: "Production Key",
  environment: "live",
});

// Save this — only shown once
console.log(apiKey.key);

Revoke API Key

await client.subAccounts.revokeApiKey("jx7abc123def456", "key_id_here");

Check Balance (Sub-Account Perspective)

When a sub-account uses its own API key, GET /v1/balance returns its spending data:
// Using a sub-account API key
const subClient = new Zavu({ apiKey: "zv_live_sub_xxxxxxxxxxxx" });
const balance = await subClient.balance.get();

console.log(balance.balance);      // team balance
console.log(balance.totalSpent);   // sub-account spending
console.log(balance.creditLimit);  // spending cap
console.log(balance.isSubAccount); // true