SDK · Go

Build on Bequest, in Go.

Idiomatic client for the Bequest API. Same endpoints as REST, same idempotency, native error types.

Install

go get github.com/bequest/bequest-go

Runtime

Go 1.21+

Auth

Bearer token via BQ_KEY env var.

1. Initialize

Authenticate once.

package main

import (
    "os"
    "github.com/bequest/bequest-go"
)

var bq = bequest.NewClient(os.Getenv("BQ_KEY"))
2. Send a gift

One call. One dollar.

gift, err := bq.Gifts.Create(ctx, &bequest.GiftCreate{
    From:        "usr_8f3...",
    To:          "org_a91...",
    AmountCents: 2500,
    Memo:        "Spring drive",
}, bequest.WithIdempotencyKey(reqID))
if err != nil { return err }

log.Println(gift.Status) // "settling"
3. Open a campaign

Hosted page in one POST.

campaign, err := bq.Campaigns.Create(ctx, &bequest.CampaignCreate{
    Name:      "Spring Build-a-Well Drive",
    GoalCents: 7_500_000,
    Story:     "We are building 12 wells in...",
    Status:    "live",
})
if err != nil { return err }
log.Println(campaign.URL)
4. Open a pool

Standing commitments, batched annually.

pool, err := bq.Pools.Create(ctx, &bequest.PoolCreate{
    Name:                  "Cedar Block Mutual Aid",
    Flavor:                "community",
    LegalStructure:        "mutual_aid",
    DistributionMechanism: "threshold",
})
if err != nil { return err }

_, _ = bq.Pools.Disburse(ctx, pool.ID, &bequest.PoolDisburse{
    To: "usr_77...", AmountCents: 35000,
})
5. Listen for webhooks

Signed payloads, replay-safe.

http.HandleFunc("/webhooks/bequest", func(w http.ResponseWriter, r *http.Request) {
    body, _ := io.ReadAll(r.Body)
    event, err := bequest.Webhooks.ConstructEvent(
        body,
        r.Header.Get("Bq-Signature"),
        os.Getenv("BQ_WEBHOOK_SECRET"),
    )
    if err != nil { http.Error(w, "bad sig", 400); return }

    if event.Type == "gift.settled" {
        ledger.Write(event.Data)
    }
    json.NewEncoder(w).Encode(map[string]bool{"received": true})
})
6. Handle errors

Typed by category.

gift, err := bq.Gifts.Create(ctx, /* ... */)
switch {
case errors.Is(err, bequest.ErrIdempotency):
    // reuse existing
case errors.Is(err, bequest.ErrRateLimit):
    var rle *bequest.RateLimitError
    if errors.As(err, &rle) {
        time.Sleep(rle.RetryAfter)
    }
case errors.Is(err, bequest.ErrAuth):
    // rotate key
default:
    return err
}
Reference

Full API docs.

The complete reference covers every resource, every parameter, every status code.

Open the API reference