> ## 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.

# Overview

> Real-estate CRM with Follow Up Boss - manage people, deals, appointments, calls, texts, notes and tasks, push lead events into its routing, read smart lists and automations data, manage webhook subscriptions, and read delivered webhook events by ID.

Use **Follow Up Boss** through Corsair: one client, typed API calls.

Create a key in Follow Up Boss under Admin, API. Things to know before you call:

* **Basic auth, not Bearer.** The API key is the username and the password is empty; the plugin builds the documented `Authorization: Basic` header. Bearer is only for OAuth integrations.
* **Lead intake runs through `events.create`.** FUB's docs advise pushing leads via `POST /events`: it creates or matches the person and runs their action plans. `people.create` only writes the contact without routing.
* **Identification headers.** Every request carries `X-System` (defaults to `corsair`) and, when you set `systemKey`, `X-System-Key` from your system registration. Registered systems get the higher rate limits (global 250 per 10s instead of 125).
* **Rate limits are per 10-second window** per context (events GET 20, notes 10, PUT /people 25, global 250). FUB answers 429 with `Retry-After`; the plugin waits that long and retries up to five times.
* **Paging.** Lists take `limit` (max 100) and `offset`; responses carry a `_metadata` block whose `next` keyset cursor FUB enforces for deep pagination.
* **Deleting.** Most deletes answer 200 (the plugin returns the echoed resource when FUB sends one). `appointments.delete` and `people.ignoreUnclaimed` answer 204. Deleting an appointment type requires `assignTypeId`: the type its existing appointments move to.
* **`people.claim` and `people.ignoreUnclaimed`** work on unclaimed leads only, and a claim of a lead that is no longer unclaimed answers 409.
* **Text messages are logged, not sent.** `textMessages.create` records a message on a person; FUB does not send SMS through the API.
* **Webhooks.** The plugin manages webhook subscriptions (`/webhooks`) and reads a webhook's delivered events by ID with `webhookEvents.get`; it does not receive webhook deliveries.

**What you get:**

* 156 typed API operations

## Setup

**1. Install**

```bash npm theme={null}
npm install corsair @corsair-dev/followupboss
```

```bash yarn theme={null}
yarn add corsair @corsair-dev/followupboss
```

```bash pnpm theme={null}
pnpm install corsair @corsair-dev/followupboss
```

```bash bun theme={null}
bun add corsair @corsair-dev/followupboss
```

**2. Add the plugin**

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

export const corsair = createCorsair({
	plugins: [
		followupboss(),
	],
	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}
> followupboss()
> ```
>
> 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: 'followupboss',
	tenantId: 'acme',
});
// redirect the user's browser to connectUrl
```

## Example API calls

**List the newest people**

```ts theme={null}
const tenant = corsair.withTenant('acme');
await tenant.followupboss.api.people.list({ limit: 10 });
```

**Push a registration lead into FUB routing**

```ts theme={null}
const tenant = corsair.withTenant('acme');
await tenant.followupboss.api.events.create({
	source: 'Zillow',
	system: 'corsair',
	type: 'Registration',
	person: {
		firstName: 'Jordan',
		lastName: 'Rivera',
		emails: [{ value: 'jordan@acme-logistics.com', type: 'home' }],
		phones: [{ value: '888-555-0123', type: 'mobile' }],
	},
});
```

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

## What's next

> [card] [API reference](https://docs.corsair.dev/plugins/followupboss/api.md)
>
> Every `followupboss.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.