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

# Messages

> Send and manage messages with the Go SDK

## Send a Message

```go theme={null}
result, err := client.Messages.Send(context.TODO(), zavudev.MessageSendParams{
	To:      zavudev.String("+14155551234"),
	Text:    zavudev.String("Your verification code is 123456"),
	Channel: zavudev.String("sms"), // optional: sms, whatsapp, email
	Metadata: map[string]string{
		"userId": "user_123",
	},
	IdempotencyKey: zavudev.String("unique-key"), // optional: prevent duplicates
})
if err != nil {
	panic(err)
}

fmt.Println(result.Message.ID)     // msg_xxx
fmt.Println(result.Message.Status) // queued
```

## Send with Sender

Specify which sender profile to use:

```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"),
})
```

## Send with Template

Send a WhatsApp template message:

```go theme={null}
result, err := client.Messages.Send(context.TODO(), zavudev.MessageSendParams{
	To:          zavudev.String("+14155551234"),
	MessageType: zavudev.String("template"),
	Content: &zavudev.MessageContent{
		TemplateID: zavudev.String("tpl_abc123"),
		TemplateVariables: map[string]string{
			"1": "John",
			"2": "12345",
		},
	},
})
```

## Send WhatsApp Media

### Image

```go theme={null}
result, err := client.Messages.Send(context.TODO(), zavudev.MessageSendParams{
	To:          zavudev.String("+14155551234"),
	MessageType: zavudev.String("image"),
	Text:        zavudev.String("Check out this product!"),
	Content: &zavudev.MessageContent{
		MediaURL: zavudev.String("https://example.com/image.jpg"),
	},
})
```

### Document

```go theme={null}
result, err := client.Messages.Send(context.TODO(), zavudev.MessageSendParams{
	To:          zavudev.String("+14155551234"),
	MessageType: zavudev.String("document"),
	Content: &zavudev.MessageContent{
		MediaURL: zavudev.String("https://example.com/invoice.pdf"),
		Filename: zavudev.String("invoice.pdf"),
	},
})
```

### Video

```go theme={null}
result, err := client.Messages.Send(context.TODO(), zavudev.MessageSendParams{
	To:          zavudev.String("+14155551234"),
	MessageType: zavudev.String("video"),
	Text:        zavudev.String("Watch this!"),
	Content: &zavudev.MessageContent{
		MediaURL: zavudev.String("https://example.com/video.mp4"),
	},
})
```

## Send Interactive Messages

### Buttons

```go theme={null}
result, err := client.Messages.Send(context.TODO(), zavudev.MessageSendParams{
	To:          zavudev.String("+14155551234"),
	MessageType: zavudev.String("buttons"),
	Text:        zavudev.String("How would you rate your experience?"),
	Content: &zavudev.MessageContent{
		Buttons: []zavudev.InteractiveButton{
			{ID: "great", Title: "Great!"},
			{ID: "okay", Title: "It was okay"},
			{ID: "poor", Title: "Not good"},
		},
	},
})
```

### List

```go theme={null}
result, err := client.Messages.Send(context.TODO(), zavudev.MessageSendParams{
	To:          zavudev.String("+14155551234"),
	MessageType: zavudev.String("list"),
	Text:        zavudev.String("Select an option:"),
	Content: &zavudev.MessageContent{
		ListButton: zavudev.String("View Options"),
		Sections: []zavudev.ListSection{
			{
				Title: "Products",
				Rows: []zavudev.ListRow{
					{ID: "prod_1", Title: "Product A", Description: zavudev.String("$10.00")},
					{ID: "prod_2", Title: "Product B", Description: zavudev.String("$20.00")},
				},
			},
		},
	},
})
```

## Send Email

```go theme={null}
result, err := client.Messages.Send(context.TODO(), zavudev.MessageSendParams{
	To:       zavudev.String("user@example.com"),
	Channel:  zavudev.String("email"),
	Subject:  zavudev.String("Your order has shipped"),
	Text:     zavudev.String("Hi John, your order #12345 has shipped."),
	HTMLBody: zavudev.String("<h1>Order Shipped</h1><p>Your order #12345 has shipped.</p>"),
	ReplyTo:  zavudev.String("support@example.com"),
})
```

## Send Email with Attachments

```go theme={null}
import (
	"encoding/base64"
	"os"
)

data, _ := os.ReadFile("invoice.pdf")
content := base64.StdEncoding.EncodeToString(data)

result, err := client.Messages.Send(context.TODO(), zavudev.MessageSendParams{
	To:      zavudev.String("user@example.com"),
	Channel: zavudev.String("email"),
	Subject: zavudev.String("Your invoice"),
	Text:    zavudev.String("Please find your invoice attached."),
	Attachments: []zavudev.EmailAttachmentInput{
		{
			Filename:    "invoice.pdf",
			Content:     zavudev.String(content),
			ContentType: zavudev.String("application/pdf"),
		},
	},
})
```

### Attachment from URL

```go theme={null}
result, err := client.Messages.Send(context.TODO(), zavudev.MessageSendParams{
	To:      zavudev.String("user@example.com"),
	Channel: zavudev.String("email"),
	Subject: zavudev.String("Your report"),
	Text:    zavudev.String("Report attached."),
	Attachments: []zavudev.EmailAttachmentInput{
		{
			Filename: "report.pdf",
			Path:     zavudev.String("https://your-server.com/reports/report.pdf"),
		},
	},
})
```

## Get Message Status

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

fmt.Println(result.Message.Status) // queued, sending, sent, delivered, failed
```

## List Messages

```go theme={null}
// List all messages
result, err := client.Messages.List(context.TODO(), zavudev.MessageListParams{})

// With filters
result, err := client.Messages.List(context.TODO(), zavudev.MessageListParams{
	Status:  zavudev.String("delivered"),
	Channel: zavudev.String("sms"),
	Limit:   zavudev.Int(100),
})

// Pagination
var cursor *string
for {
	result, err := client.Messages.List(context.TODO(), zavudev.MessageListParams{
		Cursor: cursor,
		Limit:  zavudev.Int(50),
	})
	if err != nil {
		panic(err)
	}

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

	if result.NextCursor == nil {
		break
	}
	cursor = result.NextCursor
}
```

## Send Reaction

React to a WhatsApp message:

```go theme={null}
result, err := client.Messages.React(context.TODO(), "msg_abc123", zavudev.ReactionParams{
	Emoji: zavudev.String("\U0001F44D"),
})
```
