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

# Broadcasts

> Send bulk messages with the Go SDK

Broadcasts allow you to send messages to multiple recipients in a single campaign.

## Create Broadcast

```go theme={null}
result, err := client.Broadcasts.Create(context.TODO(), zavudev.BroadcastCreateParams{
	Name:    zavudev.String("Black Friday Sale"),
	Channel: zavudev.String("sms"),
	Text:    zavudev.String("Hi {{name}}, check out our Black Friday deals! Use code FRIDAY20 for 20% off."),
})
if err != nil {
	panic(err)
}

fmt.Println(result.Broadcast.ID)     // brd_xxx
fmt.Println(result.Broadcast.Status) // draft
```

### WhatsApp Template Broadcast

```go theme={null}
result, err := client.Broadcasts.Create(context.TODO(), zavudev.BroadcastCreateParams{
	Name:        zavudev.String("Order Confirmation Campaign"),
	Channel:     zavudev.String("whatsapp"),
	MessageType: zavudev.String("template"),
	Content: &zavudev.BroadcastContent{
		TemplateID: zavudev.String("tpl_abc123"),
	},
})
```

### Email Broadcast

```go theme={null}
result, err := client.Broadcasts.Create(context.TODO(), zavudev.BroadcastCreateParams{
	Name:         zavudev.String("Newsletter"),
	Channel:      zavudev.String("email"),
	EmailSubject: zavudev.String("Your Weekly Update"),
	Text:         zavudev.String("Hi {{name}}, here's what's new this week..."),
})
```

## Get Broadcast

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

fmt.Println(result.Broadcast.Name)
fmt.Println(result.Broadcast.Status)
fmt.Println(result.Broadcast.TotalContacts)
```

## List Broadcasts

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

for _, broadcast := range result.Items {
	fmt.Println(broadcast.ID, broadcast.Name, broadcast.Status)
}

// Filter by status
result, err := client.Broadcasts.List(context.TODO(), zavudev.BroadcastListParams{
	Status: zavudev.String("completed"),
	Limit:  zavudev.Int(50),
})
```

## Update Broadcast

Update a broadcast in draft status:

```go theme={null}
result, err := client.Broadcasts.Update(context.TODO(), "brd_abc123", zavudev.BroadcastUpdateParams{
	Name: zavudev.String("Updated Campaign Name"),
	Text: zavudev.String("New message content with {{name}}"),
})
```

## Add Contacts

Add contacts to a broadcast (max 1000 per request):

```go theme={null}
result, err := client.Broadcasts.Contacts.Add(context.TODO(), "brd_abc123", zavudev.BroadcastContactsAddParams{
	Contacts: []zavudev.BroadcastContactInput{
		{
			Recipient: "+14155551234",
			TemplateVariables: map[string]string{
				"name":     "John",
				"order_id": "ORD-001",
			},
		},
		{
			Recipient: "+14155555678",
			TemplateVariables: map[string]string{
				"name":     "Jane",
				"order_id": "ORD-002",
			},
		},
	},
})
if err != nil {
	panic(err)
}

fmt.Println(result.Added)      // 2
fmt.Println(result.Duplicates) // 0
fmt.Println(result.Invalid)    // 0
```

## List Broadcast Contacts

```go theme={null}
result, err := client.Broadcasts.Contacts.List(context.TODO(), "brd_abc123", zavudev.BroadcastContactsListParams{
	Status: zavudev.String("pending"),
	Limit:  zavudev.Int(100),
})
if err != nil {
	panic(err)
}

for _, contact := range result.Items {
	fmt.Println(contact.Recipient, contact.Status)
}
```

## Remove Contact

```go theme={null}
err := client.Broadcasts.Contacts.Remove(context.TODO(), "brd_abc123", "bcon_xyz789")
if err != nil {
	panic(err)
}
```

## Send Broadcast

Start sending immediately:

```go theme={null}
result, err := client.Broadcasts.Send(context.TODO(), "brd_abc123", zavudev.BroadcastSendParams{})
if err != nil {
	panic(err)
}

fmt.Println(result.Broadcast.Status) // sending
```

Schedule for later:

```go theme={null}
result, err := client.Broadcasts.Send(context.TODO(), "brd_abc123", zavudev.BroadcastSendParams{
	ScheduledAt: zavudev.String("2024-01-15T10:00:00Z"),
})
if err != nil {
	panic(err)
}

fmt.Println(result.Broadcast.Status) // scheduled
```

## Reschedule Broadcast

Change the scheduled time for a broadcast in `scheduled` status:

```go theme={null}
result, err := client.Broadcasts.Reschedule(context.TODO(), "brd_abc123", zavudev.BroadcastRescheduleParams{
	ScheduledAt: zavudev.String("2024-01-16T14:00:00Z"),
})
if err != nil {
	panic(err)
}

fmt.Println(result.Broadcast.ScheduledAt) // 2024-01-16T14:00:00.000Z
```

<Note>
  You can only reschedule broadcasts that are in `scheduled` status. The new time must be in the future.
</Note>

## Get Progress

Monitor broadcast progress in real-time:

```go theme={null}
result, err := client.Broadcasts.Progress(context.TODO(), "brd_abc123")
if err != nil {
	panic(err)
}

fmt.Println(result.Status)               // sending
fmt.Println(result.Total)                // 5000
fmt.Println(result.Delivered)            // 2350
fmt.Println(result.Failed)              // 50
fmt.Println(result.PercentComplete)      // 48.0
fmt.Println(result.EstimatedCompletionAt)
```

## Cancel Broadcast

```go theme={null}
result, err := client.Broadcasts.Cancel(context.TODO(), "brd_abc123")
if err != nil {
	panic(err)
}

fmt.Println(result.Broadcast.Status) // cancelled
```

<Warning>
  Cancelling a broadcast will skip pending contacts, but messages already queued may still be delivered.
</Warning>

## Delete Broadcast

Delete a broadcast in draft status:

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