Idiomatic client for the Bequest API. Same endpoints as REST, same idempotency, native error types.
composer require bequest/bequest
PHP 8.1+
Bearer token via BQ_KEY env var.
<?php
use Bequest\Client;
$bq = new Client(api_key: getenv('BQ_KEY'));
$gift = $bq->gifts->create([
'from' => 'usr_8f3...',
'to' => 'org_a91...',
'amount_cents' => 2500,
'memo' => 'Spring drive',
], idempotencyKey: $requestId);
echo $gift->status; // 'settling'
$campaign = $bq->campaigns->create([
'name' => 'Spring Build-a-Well Drive',
'goal_cents' => 7_500_000,
'story' => 'We are building 12 wells in...',
'status' => 'live',
]);
echo $campaign->url;
$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,
]);
<?php
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_BQ_SIGNATURE'] ?? '';
$event = Bequest\Webhooks::constructEvent(
payload: $payload,
signature: $signature,
secret: getenv('BQ_WEBHOOK_SECRET'),
);
if ($event->type === 'gift.settled') {
Ledger::write($event->data);
}
http_response_code(200);
echo json_encode(['received' => true]);
use Bequest\Exception\{IdempotencyError, RateLimitError, AuthError};
try {
$bq->gifts->create(/* ... */);
} catch (IdempotencyError $e) {
// reuse existing gift
} catch (RateLimitError $e) {
usleep($e->retryAfter * 1_000_000);
} catch (AuthError $e) {
// rotate key
}
The complete reference covers every resource, every parameter, every status code.
Open the API reference