Givebear Connect
How the Connect API works: read an organization's donation data and collect donations that settle to its own Stripe account.
Givebear Connect is a versioned REST API and OAuth provider. It lets your platform act on one organization's giving data. You read its donations, donors, campaigns, funds, and payouts. You collect new donations that settle into the organization's own Stripe account.
Think of it the way you think of Stripe Connect. The organization owns the data and the money. Your app acts on its behalf with a credential the organization controls and can revoke at any time.
v1 is read and collect only. You can read records and create donation payment intents. You cannot edit campaigns, funds, or donor records through the API.
What you can build
Connect covers two jobs.
- Read giving data. List and fetch donations, donors, and payouts. Read campaigns, funds, and the organization profile to resolve the ids that donations reference.
- Collect donations. Create a payment intent on the organization's behalf, then render Stripe Elements with the returned values. The donation settles to the organization's Stripe account exactly like a donation made on Givebear.
Common integrations include syncing donations into a CRM, building a custom donation form, or reconciling payouts in accounting software.
The credential model
Every request to /api/v1 carries a bearer credential. That credential is bound
to exactly one organization, so your code never passes an organization id. The
API derives it from the token.
There are two credential types, and they hit the same endpoints with the same scopes.
An organization admin mints a scoped key (gb_live_...) in their dashboard
and pastes it into your tool. This is best for a single organization's own
integration: a script, an automation, or your own backend.
You register one app, and many organizations authorize it. Each authorization
issues an access token (gba_...) scoped to just that organization's data.
This is best for a platform serving many nonprofits ("Connect with
Givebear").
Both are passed the same way, in any language (the quickstart shows this call in curl, JavaScript, Python, PHP, Ruby, and Go):
curl https://givebear.io/api/v1/donations \
-H "Authorization: Bearer gb_live_..."The key difference is attribution and reach. An API key sees the organization's direct resources. An OAuth token is also tagged with your app. Donations it creates and webhook endpoints it manages stay scoped to your app, not to other apps connected to the same organization.
See Authentication for the full token lifecycle, and the Quickstart to make your first call.
Scopes
A credential grants only the scopes it was issued. The authorizing admin can
never grant more than their own permissions allow. A request missing a scope gets
a 403 with type insufficient_scope.
| Scope | Grants |
|---|---|
donations:read | Read donation records, amounts, refunds, and dispute status. |
donors:read | Read donor contact records and giving history. |
payouts:read | Read payouts deposited to the organization's bank account. |
reference:read | Read campaigns, funds, and the organization profile. |
payments:write | Create donation payment intents on the organization's behalf. |
webhooks:write | Manage the credential's own webhook endpoints. |
There are no write scopes for campaigns, funds, or donors in v1. They are intentionally absent until read and collect are proven.
How money settles
When you collect a donation, money never touches your platform balance. It settles to the organization's own Stripe connected account, the same path a donation made directly on Givebear takes.
The flow keeps you out of PCI scope (SAQ-A):
Call POST /api/v1/payment-intents with payments:write. You send
amount_cents, fund_id, donor_email, and donor_name.
The response returns client_secret, payment_intent_id,
publishable_key, and stripe_account_id.
Render Stripe Elements with those values. Card data goes straight from the donor's browser to Stripe, never through your server.
The donation is attributed to your credential, so the organization can see which app collected it. Platform fees follow the organization's current plan: see pricing for the rates.
Staying in sync with webhooks
Polling the read API works, but webhooks tell you the moment something changes.
You register an endpoint (with webhooks:write), pick events, and Givebear
delivers a signed POST when each one fires.
Payloads are deliberately thin. An event carries its type and the affected record's id, not the record itself:
{
"id": "8f3c2b1a-6d4e-4a90-9b2c-1f0e7d5c4b3a",
"type": "donation.created",
"created": "2026-06-30T12:00:00.000Z",
"data": { "id": "don_123" }
}You verify the x-givebear-signature header, then fetch the full record from the
read API with data.id. This keeps donor data out of the delivery pipe. See
Webhooks for the event list and signature
verification.
The official client
The @givebear/connect package wraps the
API with typed methods, cursor pagination, and a webhook verifier. It is
dependency-free and runs anywhere with fetch and Web Crypto. Not on
JavaScript? Every guide shows the same calls in Python, PHP, Ruby, and Go, and
the API reference generates samples per
endpoint in those and more.
import { GivebearConnect } from "@givebear/connect";
const gb = new GivebearConnect({ token: process.env.GIVEBEAR_TOKEN! });
const { data } = await gb.donations.list({ limit: 50 });
for await (const donation of gb.donations.listAll()) {
console.log(donation.amount_cents);
}If you want to embed a donation form on a marketing site instead of calling the API server-side, the browser SDK may be a better fit.
Where to go next
Quickstart
Mint a key and make your first authenticated request.
Authentication
API keys, OAuth, scopes, and token lifecycles.
Webhooks
Subscribe to events and verify signatures.
API reference
Every endpoint, field, and status code.
Versioning
How the API evolves without breaking you.
Changelog
What changed and when.