Go SDK

Official Caibo SDK for Go 1.18+.

gogithub.com/caibopay/caibopay-go

Installation

shell
go get github.com/caibopay/caibopay-go

Quick Start

main.go
package main

import (
    "fmt"
    "os"

    "github.com/caibopay/caibopay-go"
)

func main() {
    // Initialize the client
    client := caibopay.New(os.Getenv("CAIBOPAY_API_KEY"))

    // Create a transfer
    transfer, err := client.Transfers.Create(&caibopay.TransferParams{
        Amount:              100000,
        SourceCurrency:      "CAD",
        DestinationCurrency: "COP",
        Destination: &caibopay.Destination{
            Type:          "bank_account",
            Country:       "CO",
            AccountHolder: "Maria Garcia",
            AccountNumber: "12345678901234",
        },
    })

    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }

    fmt.Printf("Transfer created: %s\n", transfer.ID)
}

Configuration

config.go
client := caibopay.New(
    os.Getenv("CAIBOPAY_API_KEY"),
    caibopay.WithAPIVersion("2026-03-01"),
    caibopay.WithTimeout(30 * time.Second),
    caibopay.WithMaxRetries(3),
)

Error Handling

errors.go
transfer, err := client.Transfers.Create(params)

if err != nil {
    var caiboErr *caibopay.Error
    if errors.As(err, &caiboErr) {
        switch caiboErr.Type {
        case caibopay.ErrorTypeInvalidRequest:
            fmt.Printf("Invalid request: %s\n", caiboErr.Message)
            fmt.Printf("Parameter: %s\n", caiboErr.Param)
        case caibopay.ErrorTypeAuthentication:
            fmt.Println("Check your API key")
        case caibopay.ErrorTypeRateLimit:
            fmt.Printf("Rate limited. Retry after: %d\n", caiboErr.RetryAfter)
        default:
            fmt.Printf("API error: %s\n", caiboErr.Message)
        }
    }
    return
}

Pagination

pagination.go
// Using iterator
iter := client.Transfers.List(&caibopay.ListParams{Limit: 10})

for iter.Next() {
    transfer := iter.Transfer()
    fmt.Printf("Transfer: %s\n", transfer.ID)
}

if err := iter.Err(); err != nil {
    fmt.Printf("Error: %v\n", err)
}

// Manual pagination
params := &caibopay.ListParams{Limit: 10}
for {
    transfers, err := client.Transfers.List(params)
    if err != nil {
        break
    }

    for _, t := range transfers.Data {
        fmt.Println(t.ID)
    }

    if !transfers.HasMore {
        break
    }
    params.StartingAfter = transfers.Data[len(transfers.Data)-1].ID
}

Webhooks

webhooks.go
package main

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

    "github.com/caibopay/caibopay-go"
    "github.com/caibopay/caibopay-go/webhook"
)

func main() {
    http.HandleFunc("/webhooks", handleWebhook)
    http.ListenAndServe(":8080", nil)
}

func handleWebhook(w http.ResponseWriter, r *http.Request) {
    payload, _ := io.ReadAll(r.Body)
    signature := r.Header.Get("Caibo-Signature")

    event, err := webhook.ConstructEvent(
        payload,
        signature,
        os.Getenv("WEBHOOK_SECRET"),
    )

    if err != nil {
        w.WriteHeader(http.StatusBadRequest)
        return
    }

    switch event.Type {
    case "transfer.completed":
        var transfer caibopay.Transfer
        json.Unmarshal(event.Data.Raw, &transfer)
        fmt.Printf("Transfer completed: %s\n", transfer.ID)
    }

    w.WriteHeader(http.StatusOK)
    w.Write([]byte(`{"received": true}`))
}