Sign inGet Started

Go SDK

github.com/messagebird/bird-sdk-go (पैकेज bird) Bird API के लिए आधिकारिक Go SDK है। यह पेज इंस्टॉलेशन, कॉन्फ़िगरेशन, त्रुटियाँ, फिर से प्रयास, पेजिनेशन, और वेबहुक कवर करता है। SDK से ईमेल भेजने के लिए Go ईमेल क्विकस्टार्ट से शुरू करें।

इंस्टॉल करें

कोड उदाहरण
go get github.com/messagebird/bird-sdk-go
Go 1.24+ आवश्यक है। pkg.go.dev पर प्रत्येक सिंबल के अंतर्गत चलाने योग्य प्रति-मेथड उदाहरण रेंडर होते हैं।

क्लाइंट बनाएँ

bird.NewClient option पैकेज से फ़ंक्शनल ऑप्शन लेता है। केवल API कुंजी आवश्यक है। कुंजी का bk_{region}_… प्रीफ़िक्स बेस URL चुनता है:
कोड उदाहरण
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	bird "github.com/messagebird/bird-sdk-go"
	"github.com/messagebird/bird-sdk-go/option"
)

func main() {
	client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
	if err != nil {
		log.Fatal(err)
	}
	msg, err := client.Email.Send(context.Background(), bird.EmailSendParams{
		From:    "onboarding@messagebird.dev",
		To:      []string{"delivered@messagebird.dev"},
		Subject: "Hello from Bird",
		HTML:    "<p>My first Bird email.</p>",
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(msg.Id, *msg.Status)
}
प्रत्येक API मेथड context-first है और (T, error) लौटाता है। रद्दीकरण को context.Canceled या context.DeadlineExceeded के रूप में प्रसारित करने के लिए अपने अनुरोध का context पास करें, इसे SDK त्रुटि में लपेटे बिना।

ऑप्शन

ऑप्शन क्रम में लागू होते हैं (बाद वाला ऑप्शन जीतता है)। चार केवल-निर्माण हैं और किसी एकल कॉल में पास करने पर त्रुटि लौटाते हैं: WithAPIKey, WithBaseURL, WithRegion, और WithHTTPClient। बाकी सब निर्माण (क्लाइंट-व्यापी डिफ़ॉल्ट) और प्रति कॉल (उस एक अनुरोध के लिए ओवरराइड) दोनों में काम करते हैं:
कोड उदाहरण
client, err := bird.NewClient(
  option.WithAPIKey(os.Getenv("BIRD_API_KEY")),
  option.WithTimeout(10*time.Second), // per-attempt; each retry gets a fresh budget
)

// This send does not retry transient failures.
msg, err := client.Email.Send(ctx, params, option.WithMaxRetries(0))
ऑप्शनस्कोपक्या करता है
WithAPIKey, WithBaseURL, WithRegion, WithHTTPClientकेवल निर्माणक्रेडेंशियल, एंडपॉइंट रिज़ॉल्यूशन, और अंतर्निहित *http.Client।
WithTimeout, WithMaxRetriesनिर्माण या प्रति कॉलप्रति-प्रयास टाइमआउट और क्षणिक विफलताओं के लिए फिर से प्रयास बजट।
WithIdempotencyKeyप्रति कॉलएक म्यूटेटिंग कॉल के लिए idempotency कुंजी पिन करें (अन्यथा एक स्वचालित रूप से जनरेट होती है)।
WithHeaderनिर्माण या प्रति कॉलअतिरिक्त अनुरोध हेडर। SDK-स्वामित्व वाले हेडर (Authorization, Idempotency-Key, …) प्राथमिक रहते हैं।
WithEmailDefaults, WithWebhookSecret, WithResponseIntoनिर्माण या प्रति कॉलचैनल-व्यापी भेजने के डिफ़ॉल्ट, वेबहुक साइनिंग सीक्रेट, और रॉ ट्रांसपोर्ट-मेटाडेटा कैप्चर।

यह कैसे बना है

वायर टाइप और लो-लेवल क्लाइंट Bird की OpenAPI स्पेसिफ़िकेशन से जनरेट होते हैं। हाथ से लिखा bird पैकेज क्यूरेटेड रिसोर्स सरफ़ेस (client.Email, client.Webhooks) और Go टाइप जैसे []string और time.Time के साथ पैरामीटर स्ट्रक्ट प्रदान करता है। इसके रिस्पॉन्स टाइप वायर फ़ॉर्मेट के साथ संरेखित रहने के लिए जनरेटेड मॉडल को एलियास करते हैं। कोर प्रत्येक रिसोर्स के लिए फिर से प्रयास, टाइमआउट, और idempotency प्रबंधित करता है। पूरे मॉडल के लिए SDK concepts देखें।

त्रुटियाँ

प्रत्येक सर्वर विफलता एक *bird.APIError है जो StatusCode, Type (मोटी त्रुटि श्रेणी), Code (स्थिर E##### कोड), Message, और सपोर्ट सहसंबंध के लिए RequestID रखता है। दो वैरिएंट अतिरिक्त डेटा रखते हैं: *bird.RateLimitError (एक 429, RetryAfter के साथ) और *bird.ValidationError (एक 422, प्रति-फ़ील्ड Details के साथ)। दोनों *APIError में अनरैप होते हैं, इसलिए एक अकेला errors.As(err, &apiErr) हर सर्वर रिस्पॉन्स पकड़ता है। errors.As से ब्रांच करें:
कोड उदाहरण
package main

import (
	"context"
	"errors"
	"fmt"
	"log"
	"os"

	bird "github.com/messagebird/bird-sdk-go"
	"github.com/messagebird/bird-sdk-go/option"
)

func main() {
	client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
	if err != nil {
		log.Fatal(err)
	}
	_, err = client.Email.Send(context.Background(), bird.EmailSendParams{
		From: "onboarding@messagebird.dev", To: []string{"delivered@messagebird.dev"}, Subject: "Hello from Bird", HTML: "<p>My first Bird email.</p>",
	})
	if err != nil {
		var rle *bird.RateLimitError
		var ve *bird.ValidationError
		var ae *bird.APIError
		switch {
		case errors.As(err, &rle):
			fmt.Println("rate limited; retry after", rle.RetryAfter)
		case errors.As(err, &ve):
			for _, d := range ve.Details {
				fmt.Printf("%s: %s\n", d.Param, d.Message)
			}
		case errors.As(err, &ae):
			fmt.Printf("API error %s (status %d, request %s)\n", ae.Code, ae.StatusCode, ae.RequestID)
		default:
			log.Print(err) // transport: *bird.ConnectionError or *bird.TimeoutError
		}
	}
}
बिना HTTP रिस्पॉन्स वाली विफलताएँ अलग टाइप हैं: *bird.ConnectionError (DNS, कनेक्शन अस्वीकृत) और *bird.TimeoutError (एक अकेला प्रयास अपने टाइमआउट से अधिक हो गया)। ख़राब वेबहुक सिग्नेचर *bird.WebhookVerificationError है।

सुरक्षित फिर से प्रयास

क्षणिक विफलताएँ, जिनमें टाइमआउट, 429 रिस्पॉन्स, और 5xx रिस्पॉन्स शामिल हैं, स्वचालित रूप से फिर से प्रयास होती हैं। डिफ़ॉल्ट बजट दो फिर से प्रयास है; इसे WithMaxRetries से ट्यून करें, या फिर से प्रयास अक्षम करने के लिए शून्य दें। म्यूटेटिंग कॉल के लिए, SDK प्रति लॉजिकल कॉल एक idempotency कुंजी जनरेट करता है और हर प्रयास में उसे पुन: उपयोग करता है। अपनी कुंजी सेट करने और एप्लिकेशन-स्तरीय फिर से प्रयास सुरक्षित बनाने के लिए option.WithIdempotencyKey पास करें।

पेजिनेशन

List मेथड एक iter.Seq2[*T, error] लौटाते हैं, एक lazy range-over-func इटरेटर जो आपके उपभोग करने पर पेज फ़ेच करता है:
कोड उदाहरण
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	bird "github.com/messagebird/bird-sdk-go"
	"github.com/messagebird/bird-sdk-go/option"
)

func main() {
	client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
	if err != nil {
		log.Fatal(err)
	}
	for msg, err := range client.Email.List(context.Background(), bird.EmailListParams{Status: bird.EmailStatusBounced}) {
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(msg.Id)
	}
	page, err := client.Email.ListPage(context.Background(), bird.EmailListParams{}, "")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(len(page.Data)) // page.NextCursor carries the next starting_after
}
लूप से बाहर निकलने पर फ़ेचिंग रुक जाती है; फ़ेच त्रुटि एक बार यील्ड होती है और अनुक्रम समाप्त कर देती है। मैन्युअल कर्सर नियंत्रण के लिए, ListPage एक पेज और अगला कर्सर लौटाता है।

वेबहुक

client.Webhooks.Unwrap रॉ अनुरोध बॉडी पर एक Standard Webhooks सिग्नेचर सत्यापित करता है और एक टाइप्ड इवेंट लौटाता है। साइनिंग सीक्रेट को क्लाइंट पर या प्रति कॉल option.WithWebhookSecret से कॉन्फ़िगर करें। Unwrap को ठीक वही बाइट्स पास करें जो आपने प्राप्त किए, क्योंकि उन्हें पार्स और री-सीरियलाइज़ करने से सिग्नेचर टूट जाता है:
कोड उदाहरण
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"os"

	bird "github.com/messagebird/bird-sdk-go"
	"github.com/messagebird/bird-sdk-go/option"
)

func main() {
	client, err := bird.NewClient(
		option.WithAPIKey(os.Getenv("BIRD_API_KEY")),
		option.WithWebhookSecret(os.Getenv("BIRD_WEBHOOK_SECRET")),
	)
	if err != nil {
		log.Fatal(err)
	}
	http.HandleFunc("/webhooks/bird", func(w http.ResponseWriter, r *http.Request) {
		body, _ := io.ReadAll(r.Body)
		event, err := client.Webhooks.Unwrap(body, r.Header)
		if err != nil {
			http.Error(w, "invalid signature", http.StatusBadRequest)
			return
		}
		w.WriteHeader(http.StatusNoContent) // ack fast, then process

		payload, _ := event.AsAny()
		switch p := payload.(type) {
		case bird.EmailDeliveredEvent:
			fmt.Println("delivered:", p.Data.EmailId, p.Data.Recipient)
		case bird.EmailBouncedEvent:
			fmt.Println("bounced:", p.Type)
		}
	})
}
डिस्क्रिमिनेंट के लिए event.Type() पर या ठोस पेलोड के लिए AsAny() पर स्विच करें। कोई अज्ञात भविष्य का इवेंट टाइप पैनिक के बजाय त्रुटि लौटाता है, इसलिए पुराना SDK नए सर्वर के साथ काम करता रहता है।

एस्केप हैच

टाइप्ड सरफ़ेस पर अभी उपलब्ध न होने वाले एंडपॉइंट client.Get / Post / Put / Patch / Delete के माध्यम से पहुँच योग्य हैं, उसी auth, फिर से प्रयास, और idempotency हैंडलिंग के साथ:
कोड उदाहरण
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	bird "github.com/messagebird/bird-sdk-go"
	"github.com/messagebird/bird-sdk-go/option"
)

func main() {
	client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
	if err != nil {
		log.Fatal(err)
	}
	var out struct {
		Data []struct {
			Recipient string `json:"recipient"`
		} `json:"data"`
	}
	if err := client.Get(context.Background(), "/v1/email/suppressions", &out); err != nil {
		log.Fatal(err)
	}
	fmt.Println(len(out.Data))
}
पाथ API reference में खोजें।

अगले कदम

  • Go ईमेल क्विकस्टार्ट: अपना पहला संदेश भेजें और Send, Get, और List का उपयोग करें।
  • SDK concepts: त्रुटियों, idempotency, पेजिनेशन, और वेबहुक के लिए क्रॉस-SDK मॉडल सीखें।
  • API reference: अंतर्निहित HTTP कॉन्ट्रैक्ट देखें।

संबंधित संसाधन

इस विषय के लिए डॉक्यूमेंटेशन, गाइड और उदाहरणों के साथ आगे बढ़ें। संसाधन अंग्रेज़ी में हैं।

इम्प्लीमेंटेशन ब्रीफ़ पाएँ