Skip to main content

Go SDK

The official Orbit Go SDK provides an idiomatic Go client for the Orbit API with context support, structured errors, and automatic retries.

Installation

go get github.com/devotel/orbit-go

Quick Start

package main

import (
	"fmt"
	"log"

	devotel "github.com/devotel/orbit-go"
)

func main() {
	client := devotel.New("dv_live_sk_your_key_here")

	message, err := client.Messages.Send("+14155552671", "Hello from Orbit!", "sms")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(message["data"]) // msg_abc123
}

Messaging

// Send WhatsApp message
waMessage, err := client.Messages.SendWhatsApp("+14155552671", "Hello from Orbit on WhatsApp!")
if err != nil {
	log.Fatal(err)
}

// Send Email
email, err := client.Messages.SendEmail("user@example.com", "Welcome!", "<h1>Welcome to Acme</h1>")
if err != nil {
	log.Fatal(err)
}

Voice

// Make an outbound call
call, err := client.Voice.CreateCall("+14155552671", "+18005551234")
if err != nil {
	log.Fatal(err)
}

// Retrieve call details
callDetails, err := client.Voice.GetCall(call["data"].(map[string]any)["id"].(string))
if err != nil {
	log.Fatal(err)
}

Verify

// Send OTP
verification, err := client.Verify.Send("+14155552671", "sms")
if err != nil {
	log.Fatal(err)
}

// Check OTP
result, err := client.Verify.Check(
	verification["data"].(map[string]any)["verification_id"].(string),
	"482901",
)
if err != nil {
	log.Fatal(err)
}

fmt.Println(result["data"]) // "approved"

Webhooks

import "github.com/devotel/orbit-go/webhook"

func handleWebhook(w http.ResponseWriter, r *http.Request) {
	payload, err := io.ReadAll(r.Body)
	if err != nil {
		http.Error(w, "Bad request", http.StatusBadRequest)
		return
	}

	signature := r.Header.Get("X-Devotel-Signature")
	if !webhook.Verify(payload, signature, "whsec_your_secret") {
		http.Error(w, "Invalid signature", http.StatusUnauthorized)
		return
	}

	event, err := webhook.ParseEvent(payload)
	if err != nil {
		http.Error(w, "Bad payload", http.StatusBadRequest)
		return
	}

	switch event.Type {
	case "message.delivered":
		// Handle delivery
	case "call.completed":
		// Handle call
	}

	w.WriteHeader(http.StatusOK)
	w.Write([]byte(`{"received": true}`))
}

Error Handling

_, err := client.Messages.Send("invalid", "Hi", "sms")
if err != nil {
	var orbitErr *devotel.OrbitError
	if errors.As(err, &orbitErr) {
		fmt.Println(orbitErr.Code)       // "INVALID_PHONE_NUMBER"
		fmt.Println(orbitErr.StatusCode) // 422
		fmt.Println(orbitErr.Message)    // "The to field must be a valid E.164 phone number"
	}
}

Configuration

client := devotel.New("dv_live_sk_your_key_here",
	devotel.WithBaseURL("https://orbit-api.devotel.io/api/v1"),
)
OptionTypeDefaultDescription
WithBaseURLstringhttps://orbit-api.devotel.io/api/v1API base URL

Requirements

  • Go 1.21 or later