Go server SDK for Apinator — trigger real-time events, authenticate channels.
- Trigger events to one or more channels
- Authenticate private and presence channel subscriptions
- Verify incoming webhook signatures
- Query channel state and subscription counts
- HMAC-SHA256 request signing
- Zero external dependencies (stdlib only)
- Go 1.21+
go get github.com/apinator-io/sdk-gopackage main
import (
"context"
"log"
apinator "github.com/apinator-io/sdk-go"
)
func main() {
client := apinator.NewClient(
"your-app-id",
"your-key",
"your-secret",
"eu", // cluster
)
err := client.Trigger(context.Background(), apinator.TriggerParams{
Name: "my-event",
Channel: "my-channel",
Data: `{"message": "hello world"}`,
})
if err != nil {
log.Fatal(err)
}
}Authenticate private and presence channel subscriptions from your server:
package main
import (
"encoding/json"
"net/http"
apinator "github.com/apinator-io/sdk-go"
)
func main() {
client := apinator.NewClient("app-id", "key", "secret", "eu")
http.HandleFunc("/realtime/auth", func(w http.ResponseWriter, r *http.Request) {
if err := r.ParseForm(); err != nil {
http.Error(w, "bad request", http.StatusBadRequest)
return
}
socketID := r.FormValue("socket_id")
channelName := r.FormValue("channel_name")
auth := client.AuthenticateChannel(socketID, channelName, nil)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(auth)
})
http.ListenAndServe(":8080", nil)
}For presence channels, include channel_data:
channelData := `{"user_id": "123", "user_info": {"name": "Alice"}}`
auth := client.AuthenticateChannel(socketID, channelName, &channelData)Verify that incoming webhooks are authentic:
package main
import (
"io"
"net/http"
"time"
apinator "github.com/apinator-io/sdk-go"
)
func main() {
client := apinator.NewClient("app-id", "key", "secret", "eu")
http.HandleFunc("/webhooks", func(w http.ResponseWriter, r *http.Request) {
body, err := io.ReadAll(r.Body)
if err != nil {
http.Error(w, "bad request", http.StatusBadRequest)
return
}
if !client.VerifyWebhook(r.Header, body, 5*time.Minute) {
http.Error(w, "invalid signature", http.StatusUnauthorized)
return
}
// Process the webhook payload...
w.WriteHeader(http.StatusOK)
})
http.ListenAndServe(":8080", nil)
}Query active channels and their subscription counts:
// List all channels
channels, err := client.GetChannels(ctx, "")
// Filter by prefix
channels, err := client.GetChannels(ctx, "presence-")
// Get a specific channel
channel, err := client.GetChannel(ctx, "my-channel")
if channel != nil {
fmt.Printf("Channel: %s, Subscribers: %d\n", channel.Name, channel.SubscriptionCount)
}// Use a custom HTTP client
client := apinator.NewClient("app-id", "key", "secret", "eu",
apinator.WithHTTPClient(&http.Client{
Timeout: 10 * time.Second,
}),
)