Go

Idiomatic Go client. Methods on each resource (Client.Emails, Client.Contacts, ...) talk directly to the JSON API.

Install

go get github.com/sevk-io/sevk-go

Initialize

sevk.New creates a client from your API key.

package main
import "github.com/sevk-io/sevk-go"
func main() {
client := sevk.New("sevk_full_xxxxxxxx")
_ = client
}

Send Email

HTML body

package main
import (
"fmt"
"log"
"github.com/sevk-io/sevk-go"
)
func main() {
client := sevk.New("sevk_full_xxxxxxxx")
text := "Thanks for signing up."
result, err := client.Emails.Send(sevk.SendEmailParams{
From: "sevk <[email protected]>",
To: sevk.StringOrList{"[email protected]"},
Subject: "Welcome",
HTML: "<h1>Welcome</h1><p>Thanks for signing up.</p>",
Text: &text,
ReplyTo: sevk.StringOrList{"[email protected]"},
})
if err != nil {
log.Fatal(err)
}
switch response := result.(type) {
case sevk.SendEmailIDResponse:
fmt.Println(response.ID)
case sevk.SendEmailIDsResponse:
fmt.Println(response.IDs)
}
}

With attachments

result, err := client.Emails.Send(sevk.SendEmailParams{
From: "sevk <[email protected]>",
To: sevk.StringOrList{"[email protected]"},
Subject: "Your invoice",
HTML: "<p>Invoice attached.</p>",
Attachments: []sevk.EmailAttachment{
{
Filename: "invoice.pdf",
Content: base64Pdf,
ContentType: "application/pdf",
},
},
})

Send Bulk

result, err := client.Emails.SendBulk([]sevk.SendBulkEmailParams{
{From: "sevk <[email protected]>", To: "[email protected]", Subject: "Welcome", HTML: "<p>Hi 1</p>"},
{From: "sevk <[email protected]>", To: "[email protected]", Subject: "Welcome", HTML: "<p>Hi 2</p>"},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("ok=%d failed=%d\n", result.Success, result.Failed)

Contacts

contact, err := client.Contacts.Create(sevk.CreateContactParams{
Data: map[string]interface{}{"firstName": "John", "plan": "pro"},
})
if err != nil { log.Fatal(err) }
_, _ = client.Contacts.Get(contact.ID)
_, _ = client.Contacts.Update(contact.ID, sevk.UpdateContactParams{
Data: sevk.NewNullable(map[string]interface{}{"plan": "enterprise"}),
})
limit := 50
page, _ := client.Contacts.List(&sevk.ListContactsParams{Limit: &limit})
for _, c := range page.Items {
fmt.Println(c.Email)
}
_, _ = client.Contacts.Delete(contact.ID)

Clear Fields

Some update fields distinguish between leaving a value unchanged and clearing it with JSON null. These fields use *sevk.Nullable[T]: leave them nil to keep the current value, use sevk.NewNullable(v) to set a value, or sevk.Null[T]() to send null.

client.Contacts.Update(contactID, sevk.UpdateContactParams{
Data: sevk.NewNullable(map[string]interface{}{"plan": "pro"}),
})
client.Contacts.Update(contactID, sevk.UpdateContactParams{
Data: sevk.Null[map[string]interface{}](),
})
client.Broadcasts.Update(broadcastID, sevk.UpdateBroadcastParams{
ReplyTo: sevk.Null[string](),
ScheduledAt: sevk.Null[string](),
OpenTracking: sevk.Null[bool](),
ClickTracking: sevk.Null[bool](),
Variants: sevk.Null[[]sevk.VariantInput](),
})

For broadcasts, null clears ReplyTo and ScheduledAt, resets OpenTracking and ClickTracking to the domain default, and removes A/B test variants. BulkUpdateContact.Data works the same way as UpdateContactParams.Data.

Audiences

audience, _ := client.Audiences.Create(sevk.CreateAudienceParams{
Name: "Newsletter",
})
_, _ = client.Audiences.AddContacts(audience.ID, []string{
"b2c3d4e5-f678-4901-abcd-ef1234567890",
"b2c3d4e5-f678-4901-abcd-ef1234567891",
})
page, _ := client.Audiences.ListContacts(audience.ID, nil)
for _, c := range page.Items {
fmt.Println(c.Email)
}

Render Markup

package main
import (
"fmt"
"github.com/sevk-io/sevk-go/markup"
)
func main() {
html := markup.Render(`
<section padding="32px">
<heading level="1">Hello</heading>
<paragraph>Rendered locally.</paragraph>
</section>
`)
fmt.Println(html)
}

Error Handling

SDK errors flow through *sevk.Error. Use errors.As to inspect the API status, code, message, fields, details, response body, and retry delay.

import "errors"
_, err := client.Emails.Send(sevk.SendEmailParams{
To: sevk.StringOrList{"not-an-email"},
Subject: "Test",
HTML: "Hi",
})
var sevkErr *sevk.Error
if errors.As(err, &sevkErr) {
fmt.Println(sevkErr.StatusCode, sevkErr.Code, sevkErr.Message)
} else if err != nil {
log.Fatal(err)
}