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