To install the Go SDK, simply execute the following command on a terminal:
go get github.com/resend/resend-go/v4
First, you need to get an API key, which is available in the Resend Dashboard.
package main
import (
"fmt"
"github.com/resend/resend-go/v4"
)
func main() {
apiKey := "re_123"
client := resend.NewClient(apiKey)
params := &resend.SendEmailRequest{
To: []string{"to@example.com", "you@example.com"},
From: "me@example.com",
Text: "hello world",
Subject: "Hello from Golang",
Cc: []string{"cc@example.com"},
Bcc: []string{"bcc@example.com"},
ReplyTo: "replyto@example.com",
}
sent, err := client.Emails.Send(params)
if err != nil {
panic(err)
}
fmt.Println(sent.Id)
}Replace the placeholder API key and email addresses before sending. Use a verified domain for the From address.
You can view all the examples in the examples folder
Use errors.As from the standard library's errors package to inspect typed
API errors. HTTP 429 responses return *resend.RateLimitError; other HTTP error
responses return *resend.ResendError. Handle other failures, such as network
errors or canceled requests, separately:
_, err := client.Emails.Get("email-id")
if err != nil {
var rateLimit *resend.RateLimitError
var apiError *resend.ResendError
switch {
case errors.As(err, &rateLimit):
fmt.Printf("Rate limited: %s (Retry-After: %s)\n",
rateLimit.Message, rateLimit.RetryAfter)
case errors.As(err, &apiError):
fmt.Printf("Status: %d, name: %s, message: %s\n",
apiError.StatusCode, apiError.Name, apiError.Message)
default:
fmt.Printf("Request failed: %v\n", err)
}
}ResendError.StatusCode comes from the HTTP response. If the error body cannot
be read as JSON, Name is empty and Message falls back to the HTTP status.
RateLimitError includes rate-limit metadata such as RetryAfter when the
corresponding response headers are present. You can also detect rate limits
with errors.Is(err, resend.ErrRateLimit).
The SDK does not automatically retry requests. The application decides whether and when to retry.