canonical: https://jentic.com/apis/openfundraise.org/openfundraise

# OpenFundraise Public API

The OpenFundraise Public API takes one-time charitable donations to active campaigns and gives a nonprofit tenant read access to its donations and supporters. A donor or agent lists active campaigns with their exact amount constraints and designation ids, creates a pending donation intent for an exact amount_cents with a Stripe payment method or Shared Payment Token, and confirms it to charge exactly the stored total. With a tenant API key, the API lists and filters donations by status, frequency, campaign, and date, lists supporters, adds internal or private CRM notes, and exposes polling triggers for new donations, new recurring donations, and new or updated supporters.

## For AI agents

List active donation campaigns, create and confirm exact-amount one-time donations via Stripe, and read a nonprofit's donations and supporters with filters and polling triggers.

## Scope

Does not create recurring donations, issue refunds, or edit campaigns. Use for one-time donations and reading an OpenFundraise tenant's donations and supporters only.

## Capabilities

- List active public donation campaigns with their exact amount constraints and designation ids
- Create a pending one-time donation intent for an exact amount_cents, with a Stripe payment method or Shared Payment Token and an idempotency_key
- Confirm a donation intent to charge exactly the stored exact_total_cents, with retries returning the original receipt
- Filter a tenant's donations by status, frequency, campaign_id, designation_id, and date range
- Search supporters by name or email, ordered by latest donation activity
- Add an internal or private CRM note to a supporter, optionally pinned
- Poll triggers for new donations, new recurring donations, and new or updated supporters

## Use cases

### AI agent making a donation a person approved

An AI agent acting for a donor through Jentic lists campaigns with GET /campaigns, then creates a donation intent with POST /donation-intents carrying the campaign_id, the human-approved amount_cents, the donor's first_name, last_name, and email, an idempotency_key, and a Stripe payment method. The API applies no upsell, round-up, or recurring conversion, and POST `/donation-intents/{id}/confirm` charges exactly the stored total, so the amount the person approved is the amount charged.

Example prompt: Call GET /campaigns, pick the campaign_id the donor named, POST /donation-intents with amount_cents 2500, the donor details, an idempotency_key, and stripe_payment_method, then POST `/donation-intents/{id}/confirm`

### Donation reporting for a nonprofit

Development staff want regular figures without exporting spreadsheets. GET /donations accepts status values such as completed, refunded, and failed, a frequency such as monthly or yearly, campaign and designation filters, and a date window, so an agent can assemble a report of what came in for a campaign over a period and break it down by gift frequency.

Example prompt: Call GET /donations with campaign_id, status=completed, and start_date and end_date for last month, then total the amounts by frequency

### Supporter stewardship notes

After a call or event, a fundraiser wants the conversation on the supporter record. GET /supporters finds the person by email or search text, and POST `/supporters/{id}/notes` adds a note body with visibility internal or private and an optional pinned flag. The tenant CRM module must be enabled for notes to be accepted.

Example prompt: Call GET /supporters with email set to the donor's address, then POST `/supporters/{id}/notes` with body 'Thanked by phone after gala', visibility internal, pinned true

### Polling new gifts into other tools

Automation clients can poll GET `/triggers/new-donation`, GET `/triggers/new-recurring-donation`, and GET `/triggers/new-updated-supporter` with a since timestamp to pick up fresh records, then post thank-you messages or sync supporters into another system.

Example prompt: Poll GET `/triggers/new-recurring-donation` with since set to the last run time and send each new recurring donor's email to the welcome sequence

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| GET | `/campaigns` | List active donation campaigns |
| POST | `/donation-intents` | Create an exact donation intent |
| POST | `/donation-intents/{id}/confirm` | Confirm and charge a donation intent |
| GET | `/donations` | List donations with filters |
| GET | `/supporters` | List supporters |
| POST | `/supporters/{id}/notes` | Add a supporter note |
| GET | `/triggers/new-donation` | Poll new donations |

## Key resources

- **Campaigns** — Active organizations and campaigns with exact integer amount constraints and designation ids
- **Donation intents** — Pending one-time Stripe donations created for an exact amount and confirmed to charge the stored total
- **Donations** — Tenant donations filterable by status, frequency, campaign, designation, source, and date
- **Supporters** — Aggregated donors searchable by text or email, with internal or private CRM notes
- **Triggers** — Polling feeds for new donations, new recurring donations, and new or updated supporters

## AI readiness

This API is usable in Jentic One now. Its AI-readiness score against Jentic's framework shows where it stands today and where improvements would make it even easier for agents to use.

- **Score:** 66 / 100
- **Maturity:** AI-Aware
- **Dimensions:**
  - Foundational Compliance: 100 / 100
  - Developer Experience & Jentic Compatibility: 68 / 100
  - AI-Readiness & Agent Experience: 47 / 100
  - Agent Usability: 94 / 100
  - Security: 55 / 100
  - AI Discoverability: 74 / 100
- **View full report:** https://jentic.com/apis/openfundraise.org/openfundraise/scorecard
- **How the score is calculated:** https://docs.jentic.com/reference/api-readiness-framework/overview/
- **More about the dimensions:** https://docs.jentic.com/reference/api-readiness-framework/specification/#dimensional-model-overview

### Score it yourself

Every API in the directory is allowlisted, so you can re-score it with no key required.

- **Score your own API:** https://jentic.com/scorecard.md
- **Scoring CLI agent skill:** https://github.com/jentic/jentic-api-scorecard/blob/main/skills/jentic-api-scorecard/SKILL.md

```sh
npx @jentic/api-scorecard-cli score <openapi-url>
```

## Why Jentic

- **Setup:** Wiring OpenFundraise by hand means picking between the bearer header and X-OpenFundraise-API-Key, generating idempotency keys, handling the Stripe payment method or Shared Payment Token, and backing off on retryAfter. Through Jentic you install once, import OpenFundraise from the API Directory, store the key once, and your agent calls it.
- **Permission scoping:** Rules bound OpenFundraise by operation: the amount and campaign travel in the POST /donation-intents body, so a rule decides whether your agent may create or confirm donations, not for how much. You choose the operations it may call, so the charging step POST `/donation-intents/{id}/confirm` and supporter note writes are not included unless you add them.
- **Credential handling:** Your OpenFundraise tenant key is stored once, encrypted, by your own Jentic One instance and injected at execution time. It never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'donate to a campaign' or 'list refunded donations', and Jentic returns the matching OpenFundraise operation with its input schema, including campaign_id, amount_cents, and idempotency_key, so the agent calls it correctly.

## Related APIs

- **Donorbox API** — Donation forms, campaigns, and donor records for nonprofits
- **Bloomerang API** — Donor management CRM with constituents, transactions, and interactions
- **Stripe API** — The payment processor behind OpenFundraise donation intents

## FAQ

### What authentication does the OpenFundraise Public API use?

Per its OpenAPI spec, tenant operations accept the full tenant API key either as a bearer token in the Authorization header or in the X-OpenFundraise-API-Key header. Three operations are public and need no key: GET /campaigns, POST /donation-intents, and POST `/donation-intents/{id}/confirm.` GET `/auth/test` validates a key and returns tenant and key metadata. Through Jentic the key is stored by your own instance and attached at call time.

### Can the OpenFundraise Public API change the donation amount after I approve it?

No. POST /donation-intents records an exact amount_cents and applies no upsell, round-up, or recurring conversion, and fee coverage defaults off unless cover_fees is set. POST `/donation-intents/{id}/confirm` accepts no amount or fee fields and charges exactly the stored exact_total_cents; retrying a completed intent returns the original receipt.

### What are the rate limits for the OpenFundraise Public API?

The OpenAPI spec does not publish a numeric limit. It documents a 429 response with the code RATE_LIMIT_EXCEEDED and a retryAfter value, so an agent should wait that long before retrying. Contact support@openfundraise.org for the limit on your tenant.

### Is there an OpenFundraise MCP server?

You don't need an MCP server to give your agent OpenFundraise. Jentic connects it directly from the API Directory: import it, store your credential once, and your agent calls the campaign, donation, and supporter operations on demand without loading another server's tool definitions into its context.

### How do I list a campaign's donations through Jentic?

Search Jentic for 'list donations for a campaign', load the GET /donations operation, and execute it with campaign_id and an optional status such as completed or refunded. Page with limit and offset. To run it on your own infrastructure, install Jentic One from its GitHub repo.

### Can I limit what my agent is allowed to do with the OpenFundraise Public API?

Yes. For a reporting assistant, write a rule that allows GET /donations and GET /supporters only, and the agent can read gifts and donors but cannot create or confirm a donation or write notes. For a giving assistant, allow GET /campaigns and POST /donation-intents and keep the confirm operation for a human step, and every call the agent makes is logged.
