> ## Documentation Index
> Fetch the complete documentation index at: https://docs.corsair.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Raisely plugin

> Charity fundraising with Raisely - read campaigns, donations, fundraising profiles and designations, record a donation, and update a fundraising profile through the Raisely API.

Use **Raisely** through Corsair: one client, typed API calls.

Generate an API key in Raisely under **Settings → API**. Send it as `Authorization: Bearer <key>`. Things to know before you call:

* **This plugin always sends a key.** Raisely itself answers some public reads without one, but the plugin raises `AuthMissingError` when no key is set, so connect a key first. `private: true` returns the private fields the key can see.
* **Two routes are not on the plain REST shape.** `/donations` POST takes its record under `data`, and `/profiles` requires a `campaign` query parameter. Both are enforced by the schemas here rather than left to a 422.
* **Offsets, not pages.** Every collection answers `{ data, pagination }` with `total`, `offset` and `limit`, and the plugin returns `next_offset` for the next call. Do not add `limit` to the offset: the response already reports both.
* **A sort without an order is ignored.** Raisely applies `sort` only when `order` is also present, so the plugin sends the pair together or neither.
* **Donation types.** `type` takes `ONLINE` or `OFFLINE`, but Raisely stores a donation recorded through `donations.create` as `OFFLINE` either way; `mode` takes `LIVE` or `TEST`. An unknown value is rejected before the request is sent.
* **Amounts are integers in the smallest currency unit.** A `$25.00` donation arrives as `2500`, and `donations.create` expects the same.
* **Errors are RFC 7807 problem documents.** `detail` is the summary, `errors` names each field at fault, and `code` is the machine-readable reason. `instance` is the id Raisely support asks for; all four are exposed on `RaiselyAPIError`.
* **`410 Gone` is not a 404.** A soft-deleted campaign or donation answers `410`; both are reported as not-found, since no retry recovers either.
* **Retries.** A 429 is retried three times and honours the documented `Retry-After`. A `5xx` is retried only for a call the plugin declared read-only, never for a donation.

**What you get:**

* 9 typed API operations

## Setup

**1. Install**

```bash npm theme={null}
npm install corsair @corsair-dev/raisely better-sqlite3
npm install --save-dev @types/better-sqlite3
```

```bash yarn theme={null}
yarn add corsair @corsair-dev/raisely better-sqlite3
yarn add --dev @types/better-sqlite3
```

```bash pnpm theme={null}
pnpm install corsair @corsair-dev/raisely better-sqlite3
pnpm install --save-dev @types/better-sqlite3
```

```bash bun theme={null}
bun add corsair @corsair-dev/raisely better-sqlite3
bun add --dev @types/better-sqlite3
```

**2. Add the plugin**

```ts corsair.ts theme={null}
import Database from 'better-sqlite3';
import { createCorsair } from 'corsair';
import { raisely } from '@corsair-dev/raisely';

export const corsair = createCorsair({
	plugins: [
		raisely(),
	],
	database: new Database('corsair.db'),
	kek: process.env.CORSAIR_KEK!,
	multiTenancy: true,
	hub: {
		projectApiKey: process.env.CORSAIR_API_KEY!,
		signingSecret: process.env.CORSAIR_SIGNING_SECRET!,
	},
});
```

With `multiTenancy: true`, scope calls with `corsair.withTenant(id)`. See [Quick start](https://docs.corsair.dev/quick-start.md) for KEK + Hub keys, and [Multi-tenancy](https://docs.corsair.dev/concepts/multi-tenancy.md) for account isolation.

**3. Choose authentication**

> [tab] API Key (Recommended)
>
> No setup required yet. When you make your first request as a tenant, Corsair prompts for the API key.
>
> ```ts theme={null}
> raisely()
> ```
>
> More: [API Key](https://docs.corsair.dev/concepts/api-key)

**4. Connect a tenant**

Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see [Connect / OAuth](https://docs.corsair.dev/management/connect).

```ts theme={null}
const { connectUrl } = await corsair.manage.connect.createLink({
	plugin: 'raisely',
	tenantId: 'acme',
});
// redirect the user's browser to connectUrl
```

## Example API calls

**List active campaigns**

```ts theme={null}
const tenant = corsair.withTenant('acme');
await tenant.raisely.api.campaigns.list({ status: 'ACTIVE', limit: 100 });
```

**Raise a fundraiser's goal**

```ts theme={null}
const tenant = corsair.withTenant('acme');
await tenant.raisely.api.profiles.update({ profile_path: 'jordan-lee', goal: 6000 });
```

See the full list on the [API](https://docs.corsair.dev/plugins/raisely/api.md) page.

## What's next

> [card] [API reference](https://docs.corsair.dev/plugins/raisely/api.md)
>
> Every `raisely.api.*` operation with input and output types.

> [card] [Connect / OAuth](https://docs.corsair.dev/management/connect)
>
> createLink, Hub delivery, and tenant connect flows.

> [card] [Use with agents](https://docs.corsair.dev/mcp-adapters/mcp-adapters)
>
> Expose this plugin's operations as MCP tools.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.