SDK · Python

Build on Bequest, in Python.

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

Install

pip install bequest

Runtime

Python 3.10+

Auth

Bearer token via BQ_KEY env var.

1. Initialize

Authenticate once.

import os
from bequest import Bequest

bq = Bequest(api_key=os.environ["BQ_KEY"])
2. Send a gift

One call. One dollar.

gift = bq.gifts.create(
    from_="usr_8f3...",
    to="org_a91...",
    amount_cents=2500,
    memo="Spring drive",
    idempotency_key=request_id,
)
print(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",
)
print(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=35000)
5. Listen for webhooks

Signed payloads, replay-safe.

from flask import Flask, request, jsonify
import os, bequest

app = Flask(__name__)
secret = os.environ["BQ_WEBHOOK_SECRET"]

@app.post("/webhooks/bequest")
def hook():
    event = bequest.webhooks.construct_event(
        payload=request.get_data(),
        signature=request.headers["bq-signature"],
        secret=secret,
    )
    if event.type == "gift.settled":
        ledger.write(event.data)
    return jsonify(received=True)
6. Handle errors

Typed by category.

from bequest import IdempotencyError, RateLimitError, AuthError

try:
    bq.gifts.create(...)
except IdempotencyError:
    pass            # reuse existing gift
except RateLimitError as e:
    sleep(e.retry_after)
except AuthError:
    # Rotate key
    raise
Reference

Full API docs.

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

Open the API reference