Idiomatic client for the Bequest API. Same endpoints as REST, same idempotency, native error types.
go get github.com/bequest/bequest-go
Go 1.21+
Bearer token via BQ_KEY env var.
package main
import (
"os"
"github.com/bequest/bequest-go"
)
var bq = bequest.NewClient(os.Getenv("BQ_KEY"))
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"
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)
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,
})
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})
})
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
}
The complete reference covers every resource, every parameter, every status code.
Open the API reference