> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zavu.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Manage Senders with the Go SDK

> Create, update and list sender profiles via the Zavu Go SDK. Combine phone numbers, WhatsApp accounts and webhooks into routing identities.

Senders are phone numbers or identities used to send messages. Each project can have multiple senders with one designated as default.

## List Senders

```go theme={null}
result, err := client.Senders.List(context.TODO(), zavudev.SenderListParams{})
if err != nil {
	panic(err)
}

for _, sender := range result.Items {
	fmt.Println(sender.ID, sender.Name, sender.PhoneNumber)
	if sender.IsDefault {
		fmt.Println("(Default sender)")
	}
}

// With pagination
result, err := client.Senders.List(context.TODO(), zavudev.SenderListParams{
	Limit:  zavudev.Int(50),
	Cursor: zavudev.String("cursor_xxx"),
})
```

## Get Sender

```go theme={null}
result, err := client.Senders.Get(context.TODO(), "snd_abc123")
if err != nil {
	panic(err)
}

fmt.Println(result.ID)
fmt.Println(result.Name)
fmt.Println(result.PhoneNumber)
fmt.Println(result.IsDefault)
```

## Create Sender

```go theme={null}
result, err := client.Senders.Create(context.TODO(), zavudev.SenderCreateParams{
	Name:         zavudev.String("Marketing"),
	PhoneNumber:  zavudev.String("+15551234567"),
	SetAsDefault: zavudev.Bool(true),
})
if err != nil {
	panic(err)
}

fmt.Println(result.ID) // snd_xxx
```

### With Webhook

```go theme={null}
result, err := client.Senders.Create(context.TODO(), zavudev.SenderCreateParams{
	Name:        zavudev.String("Marketing"),
	PhoneNumber: zavudev.String("+15551234567"),
	WebhookURL:  zavudev.String("https://your-app.com/webhooks"),
	WebhookEvents: []string{
		"message.inbound",
		"message.delivered",
		"message.failed",
	},
})
if err != nil {
	panic(err)
}

// Webhook secret is only returned on create
if result.Webhook != nil && result.Webhook.Secret != "" {
	fmt.Println("Save this secret:", result.Webhook.Secret)
}
```

## Update Sender

```go theme={null}
result, err := client.Senders.Update(context.TODO(), "snd_abc123", zavudev.SenderUpdateParams{
	Name:         zavudev.String("Support"),
	SetAsDefault: zavudev.Bool(true),
})
```

### Update Webhook Configuration

```go theme={null}
result, err := client.Senders.Update(context.TODO(), "snd_abc123", zavudev.SenderUpdateParams{
	WebhookURL: zavudev.String("https://new-url.com/webhooks"),
	WebhookEvents: []string{
		"message.inbound",
	},
	WebhookActive: zavudev.Bool(true),
})
```

### Disable Webhook

```go theme={null}
result, err := client.Senders.Update(context.TODO(), "snd_abc123", zavudev.SenderUpdateParams{
	WebhookActive: zavudev.Bool(false),
})
```

### Remove Webhook

```go theme={null}
result, err := client.Senders.Update(context.TODO(), "snd_abc123", zavudev.SenderUpdateParams{
	WebhookURL: nil,
})
```

## Delete Sender

```go theme={null}
err := client.Senders.Delete(context.TODO(), "snd_abc123")
if err != nil {
	panic(err)
}
```

<Note>
  You cannot delete the default sender. Set another sender as default first.
</Note>

## Regenerate Webhook Secret

If your webhook secret is compromised, generate a new one:

```go theme={null}
result, err := client.Senders.RegenerateWebhookSecret(context.TODO(), "snd_abc123")
if err != nil {
	panic(err)
}

fmt.Println("New secret:", result.Secret)
```

<Warning>
  After regenerating the secret, update your webhook handler to use the new secret. The old secret will no longer work.
</Warning>

## WhatsApp Business Profile

Manage the WhatsApp Business Profile for senders with a connected WhatsApp Business Account.

### Get Profile

```go theme={null}
response, err := client.Senders.GetProfile(context.TODO(), "snd_abc123")
if err != nil {
	panic(err)
}

fmt.Println(response.Profile.About)
fmt.Println(response.Profile.Description)
fmt.Println(response.Profile.Address)
fmt.Println(response.Profile.Email)
fmt.Println(response.Profile.Websites)
fmt.Println(response.Profile.Vertical)
fmt.Println(response.Profile.ProfilePictureURL)
```

### Update Profile

```go theme={null}
response, err := client.Senders.UpdateProfile(context.TODO(), "snd_abc123", zavudev.WhatsAppBusinessProfileUpdateParams{
	About:       zavudev.String("Your trusted online store"),
	Description: zavudev.String("Best products at competitive prices"),
	Address:     zavudev.String("123 Main St, San Francisco, CA"),
	Email:       zavudev.String("support@example.com"),
	Websites:    []string{"https://example.com"},
	Vertical:    zavudev.String("RETAIL"),
})
```

### Upload Profile Picture

```go theme={null}
response, err := client.Senders.UploadProfilePicture(context.TODO(), "snd_abc123", zavudev.WhatsAppBusinessProfilePictureParams{
	ImageURL: zavudev.String("https://example.com/logo.png"),
	MimeType: zavudev.String("image/png"),
})
```

<Note>
  Profile methods are only available for senders with a WhatsApp Business Account connected.
</Note>

## Using Senders in Messages

Specify a sender when sending a message:

```go theme={null}
result, err := client.Messages.Send(context.TODO(), zavudev.MessageSendParams{
	To:         zavudev.String("+14155551234"),
	Text:       zavudev.String("Hello!"),
	ZavuSender: zavudev.String("snd_abc123"),
})
```

If no sender is specified, the default sender is used.
