Go SDK
Official HueChat SDK for Go applications.
Installation
go get github.com/huechat/go-sdk
Requirements: Go 1.21+
Quick Start
package main
import (
"context"
"fmt"
"os"
"github.com/huechat/go-sdk"
)
func main() {
client := huechat.NewClient(
huechat.WithAPIKey(os.Getenv("HUECHAT_API_KEY")),
)
ctx := context.Background()
// Create a contact
contact, err := client.Contacts.Create(ctx, &huechat.CreateContactRequest{
Phone: "+1234567890",
FirstName: "John",
LastName: "Doe",
})
if err != nil {
panic(err)
}
// Send a message
message, err := client.Messages.Send(ctx, contact.ID, &huechat.SendMessageRequest{
Channel: "whatsapp",
MessageType: "text",
Content: "Hello from HueChat!",
})
if err != nil {
panic(err)
}
fmt.Printf("Message sent: %s\n", message.ID)
}
Configuration
Basic Setup
client := huechat.NewClient(
huechat.WithAPIKey("sk_live_your_key"),
)
With Options
client := huechat.NewClient(
huechat.WithAPIKey(os.Getenv("HUECHAT_API_KEY")),
huechat.WithBaseURL("https://api.huechat.ai/v2"),
huechat.WithTimeout(30*time.Second),
huechat.WithRetries(3),
huechat.WithDebug(true),
)
Custom HTTP Client
httpClient := &http.Client{
Timeout: 60 * time.Second,
Transport: &http.Transport{
MaxIdleConns: 10,
IdleConnTimeout: 30 * time.Second,
},
}
client := huechat.NewClient(
huechat.WithAPIKey(os.Getenv("HUECHAT_API_KEY")),
huechat.WithHTTPClient(httpClient),
)
Contacts
Create Contact
contact, err := client.Contacts.Create(ctx, &huechat.CreateContactRequest{
Phone: "+1234567890",
Email: "john@example.com",
FirstName: "John",
LastName: "Doe",
PreferredChannel: "whatsapp",
Metadata: map[string]interface{}{
"customer_id": "cust_123",
"plan": "premium",
},
})
Get Contact
// By ID
contact, err := client.Contacts.Get(ctx, "cnt_abc123")
// By phone
contact, err := client.Contacts.Get(ctx, "+1234567890")
// By email
contact, err := client.Contacts.Get(ctx, "john@example.com")
Update Contact
updated, err := client.Contacts.Update(ctx, "cnt_abc123", &huechat.UpdateContactRequest{
FirstName: "Johnny",
Metadata: map[string]interface{}{
"plan": "enterprise",
},
})
Delete Contact
err := client.Contacts.Delete(ctx, "cnt_abc123")
Get Contact Conversations
conversations, err := client.Contacts.Conversations(ctx, "cnt_abc123", &huechat.ListConversationsParams{
Status: "open",
Limit: 20,
})
for _, conv := range conversations.Data {
fmt.Printf("%s: %s\n", conv.Contact.FullName, conv.LastMessagePreview)
}
Messages
Send Text Message
message, err := client.Messages.Send(ctx, "cnt_abc123", &huechat.SendMessageRequest{
Channel: "whatsapp",
MessageType: "text",
Content: "Hello! How can I help you today?",
})
Send Template Message
message, err := client.Messages.Send(ctx, "cnt_abc123", &huechat.SendMessageRequest{
Channel: "whatsapp",
MessageType: "template",
TemplateName: "order_confirmation",
TemplateParameters: map[string]string{
"order_id": "ORD-12345",
"total": "$99.99",
"delivery_date": "January 27",
},
})
Send Media Message
// Image
message, err := client.Messages.Send(ctx, "cnt_abc123", &huechat.SendMessageRequest{
Channel: "whatsapp",
MessageType: "image",
MediaURL: "https://example.com/image.jpg",
Content: "Check out this product!",
})
// Document
message, err := client.Messages.Send(ctx, "cnt_abc123", &huechat.SendMessageRequest{
Channel: "whatsapp",
MessageType: "document",
MediaURL: "https://example.com/invoice.pdf",
Content: "Here is your invoice",
})
Conversations
List Conversations
conversations, err := client.Conversations.List(ctx, &huechat.ListConversationsParams{
Status: "open",
Channel: "whatsapp",
Limit: 50,
})
for _, conv := range conversations.Data {
fmt.Printf("%s: %s\n", conv.Contact.FullName, conv.LastMessagePreview)
}
Get Conversation
conversation, err := client.Conversations.Get(ctx, "conv_xyz789")
Get Messages
messages, err := client.Conversations.Messages(ctx, "conv_xyz789", &huechat.ListMessagesParams{
Limit: 100,
Sort: "created_at:asc",
})
Send Message in Conversation
message, err := client.Conversations.SendMessage(ctx, "conv_xyz789", &huechat.SendMessageRequest{
MessageType: "text",
Content: "Thanks for your patience!",
})
Assign Conversation
err := client.Conversations.Assign(ctx, "conv_xyz789", &huechat.AssignConversationRequest{
AssignedTo: "usr_agent1",
InternalNote: "Please handle this VIP customer",
})
Add Labels
err := client.Conversations.AddLabels(ctx, "conv_xyz789", []string{"urgent", "billing"})
Resolve Conversation
err := client.Conversations.Resolve(ctx, "conv_xyz789", &huechat.ResolveConversationRequest{
ResolutionReason: "issue_resolved",
InternalNote: "Refund processed",
SendSatisfactionSurvey: true,
})
Webhooks
Create Webhook
webhook, err := client.Webhooks.Create(ctx, &huechat.CreateWebhookRequest{
URL: "https://your-server.com/webhooks/huechat",
Events: []string{"message.received", "conversation.created"},
})
// Save the signing secret!
fmt.Printf("Signing secret: %s\n", webhook.SigningSecret)
Verify Signature
import "github.com/huechat/go-sdk/webhook"
func WebhookHandler(w http.ResponseWriter, r *http.Request) {
payload, _ := io.ReadAll(r.Body)
signature := r.Header.Get("X-HueChat-Signature")
timestamp := r.Header.Get("X-HueChat-Timestamp")
if !webhook.Verify(payload, signature, timestamp, os.Getenv("HUECHAT_WEBHOOK_SECRET")) {
w.WriteHeader(http.StatusUnauthorized)
return
}
var event huechat.WebhookEvent
json.Unmarshal(payload, &event)
switch event.Type {
case "message.received":
// Handle new message
case "conversation.created":
// Handle new conversation
}
w.WriteHeader(http.StatusOK)
}
Error Handling
contact, err := client.Contacts.Create(ctx, &huechat.CreateContactRequest{
Phone: "invalid-phone",
})
if err != nil {
switch e := err.(type) {
case *huechat.BadRequestError:
fmt.Printf("Validation error: %s\n", e.Message)
fmt.Printf("Details: %v\n", e.Details)
case *huechat.UnauthorizedError:
fmt.Println("Invalid API key")
case *huechat.NotFoundError:
fmt.Println("Resource not found")
case *huechat.RateLimitError:
fmt.Printf("Rate limited, retry after: %d seconds\n", e.RetryAfter)
default:
fmt.Printf("Error: %v\n", err)
}
}
Gin Integration
package main
import (
"os"
"github.com/gin-gonic/gin"
"github.com/huechat/go-sdk"
"github.com/huechat/go-sdk/webhook"
)
var client = huechat.NewClient(
huechat.WithAPIKey(os.Getenv("HUECHAT_API_KEY")),
)
func main() {
r := gin.Default()
r.POST("/webhooks/huechat", func(c *gin.Context) {
payload, _ := c.GetRawData()
signature := c.GetHeader("X-HueChat-Signature")
timestamp := c.GetHeader("X-HueChat-Timestamp")
if !webhook.Verify(payload, signature, timestamp, os.Getenv("HUECHAT_WEBHOOK_SECRET")) {
c.JSON(401, gin.H{"error": "Invalid signature"})
return
}
var event huechat.WebhookEvent
if err := c.ShouldBindJSON(&event); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
// Handle event
switch event.Type {
case "message.received":
handleNewMessage(event.Data)
}
c.Status(200)
})
r.Run(":8080")
}
Echo Integration
package main
import (
"io"
"os"
"github.com/labstack/echo/v4"
"github.com/huechat/go-sdk"
"github.com/huechat/go-sdk/webhook"
)
func main() {
e := echo.New()
e.POST("/webhooks/huechat", func(c echo.Context) error {
payload, _ := io.ReadAll(c.Request().Body)
signature := c.Request().Header.Get("X-HueChat-Signature")
timestamp := c.Request().Header.Get("X-HueChat-Timestamp")
if !webhook.Verify(payload, signature, timestamp, os.Getenv("HUECHAT_WEBHOOK_SECRET")) {
return c.JSON(401, map[string]string{"error": "Invalid signature"})
}
// Process event...
return c.NoContent(200)
})
e.Start(":8080")
}