SDK Go
Klien resmi Go untuk Volara: messaging, conversations, CRM contacts, broadcast, knowledge, metrics, dan agency white-label.
Dibangun hanya di atas standard library Go — tanpa dependensi pihak ketiga. Go 1.21+.
Kode sumber: github.com/volara-asia/volara-go.
Install
go get github.com/volara-asia/volara-goimport volara "github.com/volara-asia/volara-go"Autentikasi
Ambil API key dari dashboard Volara (Settings → API Keys). Berikan ke NewClient, atau kosongkan argumen dan set env VOLARA_API_KEY.
client, err := volara.NewClient("sk_live_...") // eksplisit
client, err := volara.NewClient("") // membaca VOLARA_API_KEYKunci dikirim sebagai Authorization: Bearer sekaligus x-api-key. SDK tidak pernah mencatatnya.
Jaga kerahasiaan API key
API key memberi akses penuh ke data tenant. Pakai hanya dari server, jangan menaruhnya di repo publik.
Quickstart — kirim pesan pertama
client, _ := volara.NewClient("") // VOLARA_API_KEY
ctx := context.Background()
msg, err := client.Messages.Send(ctx, "conv_123", volara.SendMessageParams{
Text: "Halo dari Volara Go SDK!",
})Setiap method menerima context.Context lebih dulu, jadi Anda mengontrol cancellation dan deadline per panggilan.
Konfigurasi
NewClient menerima functional option:
client, err := volara.NewClient(
"sk_live_...",
volara.WithBaseURL("https://api.volara.chat"), // self-host atau region
volara.WithTimeout(15*time.Second), // timeout per-permintaan
volara.WithMaxRetries(3), // budget retry
volara.WithHTTPClient(myHTTPClient), // transport/proxy kustom
volara.WithHeader("X-Trace", "abc"), // header di setiap permintaan
)Operasi tulis mendapat Idempotency-Key otomatis agar create yang di-retry tidak menggandakan data. Retry berjalan pada 408/425/429/5xx dan error jaringan, dengan exponential backoff yang menghormati Retry-After.
Contoh resource
Conversations
page, err := client.Conversations.List(ctx, volara.ListConversationsParams{
Status: "open",
PerPage: 25,
})
for _, conv := range page.Data {
fmt.Println(conv["id"])
}Contacts (CRM, telepon dalam E.164)
contact, err := client.Contacts.Create(ctx, volara.CreateContactParams{
Name: "Budi",
PhoneNumber: "+6281234567890",
Source: "website",
})Broadcasts
bc, err := client.Broadcasts.Create(ctx, volara.CreateBroadcastParams{
Title: "Promo akhir pekan",
MessageContent: "Diskon 20% akhir pekan ini!",
})Knowledge base & metrics
res, err := client.Knowledge.Search(ctx, "refund policy", volara.KnowledgeScopeSources)
faqs, err := client.Knowledge.FAQs(ctx, "pengiriman")
stats, err := client.Metrics.Dashboard(ctx)Escape hatch
tickets, err := client.Request(ctx, "GET", "/tickets", map[string]string{"status": "open"}, nil)Verifikasi webhook
Selalu verifikasi tanda tangan sebelum mempercayai webhook. Pakai body mentah, bukan struct yang sudah di-encode ulang.
func handler(w http.ResponseWriter, r *http.Request) {
raw, _ := io.ReadAll(r.Body)
if !volara.VerifyWebhook(raw, r.Header.Get("x-volara-signature"), webhookSecret) {
http.Error(w, "invalid signature", http.StatusUnauthorized)
return
}
// terpercaya: parse raw ke tipe event Anda
}Perbandingannya constant-time, dan awalan sha256= pada header tetap diterima.
Error handling
Respons non-2xx, timeout, dan kegagalan jaringan semua mengembalikan *volara.Error:
_, err := client.Conversations.Get(ctx, "missing")
if vErr, ok := volara.AsError(err); ok {
log.Printf("status=%d code=%s request_id=%s", vErr.Status, vErr.Code, vErr.RequestID)
}RequestID (dari x-request-id / cf-ray) adalah nilai yang dikutip saat menghubungi support. errors.As(err, &vErr) dan errors.Is juga bekerja, karena error membungkus penyebab transport di bawahnya.
Bentuk hasil
API Volara sedang diformalkan ke spesifikasi OpenAPI 3.1 yang dibekukan. Sampai itu rampung, objek tunggal kembali sebagai volara.Resource (map[string]any) dan list sebagai *volara.List (Data plus Total/Page/Limit). Struct hasil bertipe akan hadir setelah spec v1 dibekukan; signature method dan parameter struct sudah stabil.
Langkah selanjutnya
- Lihat SDK & Integrasi lainnya.
- Pahami Autentikasi, Errors, dan Webhooks.
- Coba endpoint di Referensi API interaktif.