Skip to content

loops-so/loops-go

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

loops-go

Go Reference

Go SDK for the Loops API.

Install

go get github.com/loops-so/loops-go

Quickstart

package main

import (
    "log"

    loops "github.com/loops-so/loops-go"
)

func main() {
    client := loops.NewClient("YOUR_API_KEY")

    err := client.SendEvent(loops.SendEventRequest{
        Email:     "user@example.com",
        EventName: "signup",
        EventProperties: map[string]any{
            "plan": "pro",
        },
    })
    if err != nil {
        log.Fatal(err)
    }
}

Client options

client := loops.NewClient("YOUR_API_KEY",
    loops.WithBaseURL("https://app.loops.so/api/v1"),
    loops.WithHTTPClient(myHTTPClient),
    loops.WithUserAgent("my-app/1.0"),
    loops.WithLogger(os.Stderr), // verbose request/response logging
)

Supported endpoints

  • API key — GetAPIKey
  • Contacts — CreateContact, UpdateContact, DeleteContact, FindContacts, CheckContactSuppression, RemoveContactSuppression
  • Contact properties — ListContactProperties, CreateContactProperty
  • Mailing lists — ListMailingLists
  • Events — SendEvent
  • Transactional — SendTransactional, ListTransactional
  • Email messages — GetEmailMessage, UpdateEmailMessage
  • Campaigns — CreateCampaign, UpdateCampaign, GetCampaign, ListCampaigns
  • Components — GetComponent, ListComponents
  • Themes — GetTheme, ListThemes
  • Uploads — Upload, CreateUpload, CompleteUpload

Full reference: pkg.go.dev/github.com/loops-so/loops-go.

Errors

API errors are returned as *loops.APIError with StatusCode and Message:

if err := client.SendEvent(req); err != nil {
    var apiErr *loops.APIError
    if errors.As(err, &apiErr) {
        log.Printf("loops api error %d: %s", apiErr.StatusCode, apiErr.Message)
    }
    return err
}

Retries

Requests are automatically retried with exponential backoff and jitter on 429 and 5xx responses (up to 2 retries).

Idempotency

SendEvent and SendTransactional accept an IdempotencyKey field, which is sent as the Idempotency-Key header.

Pagination

ListTransactional and ListCampaigns return a single page of results along with a *Pagination value. Pass a PaginationParams to control page size and cursor:

items, page, err := client.ListTransactional(loops.PaginationParams{PerPage: "50"})
if err != nil {
    log.Fatal(err)
}
// page.NextCursor is "" when there are no more pages.

To fetch every page, use the generic Paginate helper:

all, err := loops.Paginate(func(cursor string) ([]loops.TransactionalEmail, *loops.Pagination, error) {
    return client.ListTransactional(loops.PaginationParams{Cursor: cursor})
})

Uploads

Upload is a one-call helper that requests a presigned URL, uploads the bytes, and finalizes the asset. Supported content types are image/jpeg, image/png, image/gif and image/webp, up to 4 MB.

f, err := os.Open("hero.png")
if err != nil {
    log.Fatal(err)
}
defer f.Close()
stat, err := f.Stat()
if err != nil {
    log.Fatal(err)
}

asset, err := client.Upload(loops.UploadRequest{
    EmailMessageID: "em_abc123",
    ContentType:    "image/png",
    ContentLength:  stat.Size(),
    Body:           f,
})
if err != nil {
    log.Fatal(err)
}
// asset.FinalURL is the public URL to reference in your email LMX.

For finer control, call CreateUpload and CompleteUpload directly and do the PUT to the presigned URL yourself.

License

MIT

About

Loops SDK for Go

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages