Skip to content

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

sh
go get github.com/volara-asia/volara-go
go
import 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.

go
client, err := volara.NewClient("sk_live_...")   // eksplisit
client, err := volara.NewClient("")              // membaca VOLARA_API_KEY

Kunci 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

go
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:

go
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

go
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)

go
contact, err := client.Contacts.Create(ctx, volara.CreateContactParams{
	Name:        "Budi",
	PhoneNumber: "+6281234567890",
	Source:      "website",
})

Broadcasts

go
bc, err := client.Broadcasts.Create(ctx, volara.CreateBroadcastParams{
	Title:          "Promo akhir pekan",
	MessageContent: "Diskon 20% akhir pekan ini!",
})

Knowledge base & metrics

go
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

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

go
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:

go
_, 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