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 mainimport "github.com/sevk-io/sevk-go"func main() {client := sevk.New("sevk_full_xxxxxxxx")_ = client}
Send Email
HTML body
package mainimport ("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{Subject: "Welcome",HTML: "<h1>Welcome</h1><p>Thanks for signing up.</p>",Text: &text,})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{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 := 50page, _ := 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 mainimport ("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.Errorif errors.As(err, &sevkErr) {fmt.Println(sevkErr.StatusCode, sevkErr.Code, sevkErr.Message)} else if err != nil {log.Fatal(err)}