SDK · Ruby

Build on Bequest, in Ruby.

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

Install

gem install bequest

Runtime

Ruby 3.0+

Auth

Bearer token via BQ_KEY env var.

1. Initialize

Authenticate once.

require "bequest"

bq = Bequest::Client.new(api_key: ENV.fetch("BQ_KEY"))
2. Send a gift

One call. One dollar.

gift = bq.gifts.create(
  from: "usr_8f3...",
  to: "org_a91...",
  amount_cents: 2_500,
  memo: "Spring drive",
  idempotency_key: request_id
)
gift.status # => "settling"
3. Open a campaign

Hosted page in one POST.

campaign = bq.campaigns.create(
  name: "Spring Build-a-Well Drive",
  goal_cents: 7_500_000,
  story: "We are building 12 wells in...",
  status: "live"
)
campaign.url
4. Open a pool

Standing commitments, batched annually.

pool = bq.pools.create(
  name: "Cedar Block Mutual Aid",
  flavor: "community",
  legal_structure: "mutual_aid",
  distribution_mechanism: "threshold"
)

bq.pools.disburse(pool.id, to: "usr_77...", amount_cents: 35_000)
5. Listen for webhooks

Signed payloads, replay-safe.

require "sinatra"

post "/webhooks/bequest" do
  body = request.body.read
  event = Bequest::Webhooks.construct_event(
    payload: body,
    signature: request.env["HTTP_BQ_SIGNATURE"],
    secret: ENV.fetch("BQ_WEBHOOK_SECRET")
  )
  Ledger.write(event.data) if event.type == "gift.settled"
  { received: true }.to_json
end
6. Handle errors

Typed by category.

begin
  bq.gifts.create(...)
rescue Bequest::IdempotencyError
  # reuse existing
rescue Bequest::RateLimitError => e
  sleep(e.retry_after)
rescue Bequest::AuthError
  # rotate key
end
Reference

Full API docs.

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

Open the API reference