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

result, err := client.SubAccounts.Create(context.TODO(), zavudev.SubAccountCreateParams{
	Name:        zavudev.String("Client ABC"),
	ExternalID:  zavudev.String("client_123"),
	CreditLimit: zavudev.Int(100000), // $1,000.00 in cents
	Metadata: map[string]interface{}{
		"plan":   "enterprise",
		"region": "us-east",
	},
})
if err != nil {
	panic(err)
}

// Save this — only shown once
fmt.Println(result.SubAccount.APIKey)
fmt.Println(result.SubAccount.ID)
fmt.Println(result.SubAccount.Status) // active
The APIKey field is only included in the creation response. Store it securely.

Get Sub-Account

result, err := client.SubAccounts.Get(context.TODO(), "jx7abc123def456")
if err != nil {
	panic(err)
}

fmt.Println(result.SubAccount.Name)
fmt.Println(result.SubAccount.Status)
fmt.Println(result.SubAccount.TotalSpent)
fmt.Println(result.SubAccount.CreditLimit)

List Sub-Accounts

result, err := client.SubAccounts.List(context.TODO(), zavudev.SubAccountListParams{
	Limit: zavudev.Int(50),
})
if err != nil {
	panic(err)
}

for _, sub := range result.Items {
	fmt.Printf("%s: $%.2f spent\n", sub.Name, float64(sub.TotalSpent)/100)
}

// Paginate
nextPage, err := client.SubAccounts.List(context.TODO(), zavudev.SubAccountListParams{
	Limit:  zavudev.Int(50),
	Cursor: result.NextCursor,
})

Update Sub-Account

result, err := client.SubAccounts.Update(context.TODO(), "jx7abc123def456", zavudev.SubAccountUpdateParams{
	CreditLimit: zavudev.Int(200000), // Increase to $2,000
	Metadata: map[string]interface{}{
		"plan": "enterprise-plus",
	},
})
if err != nil {
	panic(err)
}

fmt.Println(result.SubAccount.CreditLimit) // 200000

Suspend a Sub-Account

client.SubAccounts.Update(context.TODO(), "jx7abc123def456", zavudev.SubAccountUpdateParams{
	Status: zavudev.String("inactive"),
})

// Re-activate later
client.SubAccounts.Update(context.TODO(), "jx7abc123def456", zavudev.SubAccountUpdateParams{
	Status: zavudev.String("active"),
})

Get Sub-Account Balance

balance, err := client.SubAccounts.GetBalance(context.TODO(), "jx7abc123def456")
if err != nil {
	panic(err)
}

fmt.Printf("Team balance: $%.2f\n", float64(balance.Balance)/100)
fmt.Printf("Sub-account spent: $%.2f\n", float64(balance.TotalSpent)/100)
fmt.Printf("Credit limit: $%.2f\n", float64(balance.CreditLimit)/100)
fmt.Println(balance.IsSubAccount) // true

Deactivate Sub-Account

result, err := client.SubAccounts.Deactivate(context.TODO(), "jx7abc123def456")
if err != nil {
	panic(err)
}

fmt.Printf("Keys revoked: %d\n", result.KeysRevoked)

API Keys

List API Keys

result, err := client.SubAccounts.APIKeys.List(context.TODO(), "jx7abc123def456")
if err != nil {
	panic(err)
}

for _, key := range result.Items {
	fmt.Printf("%s (%s...): %s\n", key.Name, key.KeyPrefix, key.Environment)
}

Create API Key

result, err := client.SubAccounts.APIKeys.Create(context.TODO(), "jx7abc123def456", zavudev.SubAccountAPIKeyCreateParams{
	Name:        zavudev.String("Production Key"),
	Environment: zavudev.String("live"),
})
if err != nil {
	panic(err)
}

// Save this — only shown once
fmt.Println(result.APIKey.Key)

Revoke API Key

err := client.SubAccounts.APIKeys.Revoke(context.TODO(), "jx7abc123def456", "key_id_here")
if err != nil {
	panic(err)
}