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

# Paid and member libraries

> Make videos members-only, so only the people in your paid community, course or membership can search and ask on your member page, and watch in AI apps.

Run a paid community, course or membership? Put those videos in a members-only collection. Only the members you give access to can search them, ask questions about them and watch them. They do this on your AgentTV member page and in AI apps like Claude and ChatGPT over MCP.

Everyone else gets nothing from those videos, unless you let AI apps cite them free. Then a public answer can name a members-only video, and the person needs a membership to watch it.

## Get set up

Member access needs setup on your account. [Ask us to set it up](https://agenttv.com/support). Say if you use Kajabi.

Until it is on, **Settings, Members** in the [console](https://app.agentcdn.com/settings/members) shows **Member access is not on** with a **Request setup** button.

## How it fits together

| Piece | What it is |
| - | - |
| **Collection** | A members-only library of videos. Its videos leave your public pages, public search and public AI answers. |
| **Member** | A person, saved by email. A member sees nothing until you give them access. |
| **Access** | One member's access to one collection, with an optional end date. Members can hold access to several collections. |

Access is the only thing that opens a collection. It does not override the rights you set on each video: a member can search, cite and quote a video only where its rights allow it.

## Make a members-only collection

**1. Open Collections**

In the console, open **Settings, Members**. Under **Collections**, choose **Create collection**.

**2. Pick what goes in it**

Choose one:

* **Choose videos**: pick a public library, then pick up to 50 of its live public videos and name the collection.
* **Use a whole library**: pick a library and choose **Make library members only**. Every public video in it leaves public pages and discovery.

**3. Give a reason and confirm**

Every change asks for a reason. It goes in the activity log. Members do not see it.

You need a public library first. If you have none, import videos, then come back.

To change a collection later, choose **Manage** on its row:

* **Move videos out** returns chosen videos to a public library. Members lose access to those videos. Each video shows publicly again only where its own settings allow.
* **Delete collection** moves every video to a public library and ends all member access to it. Your default library cannot be deleted, but you can still move its videos out.

## Add members and give access

**1. Add a member**

Under **People**, choose **Add member**. Enter the member's name and email. To change a saved name, save the same email again.

**2. Give access to a collection**

Under **Who gets which**, choose **Grant access**. Pick the member and the collection. Set **Access ends** for a date, or leave it empty for no end date.

**3. Send them the sign-in link**

Saving a member sends no invitation. Under **People**, copy the **Sign-in link** and send it to the member yourself. It looks like `https://agenttv.com/members/your-brand/sign-in`. The link alone does not give access.

To take access away:

* **Revoke** on a row in **Who gets which** ends that one access. Other access the member holds still applies.
* **Disable** on a row in **People** ends all of that member's access and signs them out at once.

The **Status** column shows each access as **Active**, **Expired**, **Revoked** or **Member disabled**.

## Let AI apps cite members-only videos

Free citation means AI apps may name your members-only videos in public answers. Only members can watch them. A public search result for such a video carries the video and chapter titles and the time range. It carries no transcript text and no link to the video.

Turn it on for each collection:

1. In **Collections**, choose **Manage** on the collection.
2. Turn on **AI apps may mention this collection**.
3. Optional: add a **Join link**, the page where people can join. AI apps then offer a **Join to watch** action that opens it.
4. Optional: set **Free preview for non-members** to **30 s**, **1 min** or **2 min**. Non-members can then watch that much of a cited moment, never the full video.
5. Enter a reason and choose **Save**.

Each collection row shows **AI apps can mention it** or **Hidden from AI apps**. Turning it off stops AI apps from naming the videos and ends any free preview.

## What a member gets

> [tab] On your member page
>
> 1. The member opens your sign-in link and enters their email.
> 2. They get an email with a sign-in link. They open it and choose **Continue**.
> 3. They land on **Your member libraries**. They open a library to browse its videos and use **Ask the library** to get answers from those videos only.
>
> To watch a video, they ask for it in their AI app.

> [tab] In an AI app
>
> Members use your public MCP URL. MCP (Model Context Protocol) is how AI apps connect to outside tools.
>
> ```text theme={null}
> https://mcp.agentcdn.com/c/your-brand/mcp
> ```
>
> Add it in the app the same way as any public library. See [Library MCP](https://docs.agentcdn.com/guides/connect-mcp.md#library-mcp).
>
> When the member asks to watch a members-only video, the app asks them to sign in. The sign-in page asks for their email, then for a 6 digit code sent to it. It can also offer **Continue with Google**. The code expires in 10 minutes. The member must use the email you saved.
>
> After sign-in, search and answers include the collections the member has access to, and the member can play those videos in the chat. Nothing else changes: they still see your public videos as before.

## What a non-member sees

| Collection setting | In public answers | When they try to watch |
| - | - | - |
| Free citation off | Nothing. The videos do not appear. | Not offered. |
| Free citation on, no preview | The video named, with titles and time range only. | The app asks them to sign in as a member. **Join to watch** opens your join link, if you set one. |
| Free citation on, with preview | The same, plus the preview length. | They watch up to 30 s, 1 min or 2 min of the cited moment. |

Your public pages, public search and the public Ask never show members-only videos.

## Connect Kajabi

Connect Kajabi and people who buy your Kajabi offers become members on their own. Each offer feeds a members collection. Kajabi does not share lesson videos, so you upload each course video once, and it lands in the right collection.

> [!NOTE]
>
> Kajabi's API needs the Kajabi Pro plan. Kajabi has no app sign-in, so you paste a key.

### 1. Make a key in Kajabi

1. In Kajabi, open **Settings, Security, User API Keys**.
2. Make a key with read access to offers, products, courses, customers and purchases, and access to webhooks.
3. Copy the **Client ID** and the **Client secret**.

### 2. Connect it

1. In the console, open **Settings, Members**. Under **Membership platform**, choose **Connect Kajabi**.
2. Paste the **Client ID** and **Client secret**. Choose **Continue**.
3. AgentTV checks the key and shows the Kajabi site and how many offers it has. If the key reaches more than one site, pick one.
4. Choose **Connect**.

The secret is stored encrypted and never shown again. Each offer gets its own new members collection, named after the offer, and its buyers get access. The first sync starts at once.

### 3. Choose where each offer goes

Under **Offers**, each offer has a picker:

* **New collection "Offer name"**: the default.
* Any of your members collections. Several offers can share one.
* **Don't sync**: the offer's buyers get no access from the sync.

Moving an offer to another collection starts a sync. It ends the access the sync gave in the old collection. Access you gave by hand stays.

### 4. Upload your course videos

Under **Course videos**, you see the lessons of every course whose offer goes to a collection, in course order. Each lesson shows **No video**, **Processing** or **Ready**.

1. Choose **Choose files** and pick your lesson video files.
2. AgentTV matches each file to a lesson: by the file name, or by a close title and a length that fits. Check each match, or pick the lesson yourself.
3. Check how much of your allowance the upload uses, then choose **Upload**.
4. Keep the page open until every file has sent. Then choose **Done**.

Each video is members-only from the start, in the collection of its course. It never shows publicly. It gets the lesson's title, and its course becomes the series. A file that is already uploaded is not uploaded again.

A course whose offers go to different collections cannot take videos, because a video lives in one collection. Send those offers to the same collection first.

If a file did not arrive or failed, its lesson shows **Upload again**. A new file replaces it. A video that is ready is never replaced.

### How members stay in sync

| When | What happens |
| - | - |
| Someone buys an offer | Kajabi tells AgentTV, and they become a member within seconds. |
| Every hour | A full sync adds new buyers and ends access for purchases that ended. |
| You choose **Sync now** | The same full sync runs at once. |

Kajabi sends no event when a purchase ends, so access ends at the next hourly sync.

The sync never removes access you gave by hand, and never turns a disabled member back on. If Kajabi answers only in part, the sync removes nothing. **Last sync** shows when it ran and what it changed, such as `3 added, 1 removed`.

If **New buyers** says **Instant adds are off**, choose **Turn on instant adds** to register the purchase webhook again.

### Held for review

If a sync would end more than half of a collection's synced access at once, it holds those removals for you. The console shows who would lose access, with **See who**. Then pick one:

* **Remove** ends that access. Access you gave by hand stays.
* **Keep them** keeps their access. Later syncs do not hold or remove it again. If Kajabi shows a purchase for them again, the keep ends.

### Check and disconnect

* **Check again** tests the saved key. If Kajabi refuses the key, the status shows **Needs a new key**. Choose **Connect again** with a new key.
* **Disconnect** deletes the saved key, and AgentTV stops reading your Kajabi site. Members keep the access they have now. To stop the key working, delete it in Kajabi under **Settings, Security, User API Keys**.

## Do it with the API or MCP

Everything above also works through the [Account API](https://docs.agentcdn.com/api-reference/overview.md) and the [account MCP](https://docs.agentcdn.com/guides/connect-mcp.md#account-mcp). Changes return a preview first and run only after you confirm. See [Changes run in two calls](https://docs.agentcdn.com/api-keys.md#changes-run-in-two-calls).

### Members and collections

| MCP tool | API route | What it does |
| - | - | - |
| `list_members` | `GET /v1/members` | Lists members and their access. |
| `manage_member` | `POST /v1/members` | `add` a member by email, `grant` a collection (optional `expires_at`), `revoke_grant`, or `disable` a member. |
| `manage_member_collection` | `POST /v1/members/collections` | `create` a collection from public videos, `release` videos back to a public library, or `delete` a collection. |
| `manage_member_library` | `POST /v1/member-libraries/{library_id}` | `citation` sets free citation, `join_url` and `preview_seconds` (30, 60 or 120). `protect` makes a whole public library members-only. |

### Kajabi

Use `kajabi` as `{platform}`.

| MCP tool | API route | What it does |
| - | - | - |
| `connect_membership_platform` | `POST /v1/membership/{platform}` | Connects with `client_id` and `client_secret`. Add `account_id` when the key reaches several sites. |
| `get_membership_connection` | `GET /v1/membership/{platform}` | State, site, last sync, and how many removals are held. Never returns the secret. |
| `check_membership_connection` | `POST /v1/membership/{platform}/check` | Tests the saved key. No preview. |
| `list_membership_products` | `GET /v1/membership/{platform}/products` | Offers and where each one's buyers go, plus your members collections. |
| `map_membership_product` | `POST /v1/membership/{platform}/products/map` | Sends an offer to a `collection` (with `library_id`), to `skip`, or back to `default`. |
| `sync_membership_members` | `POST /v1/membership/{platform}/sync` | Syncs now. `approve_held_revokes` lets held removals through. |
| `list_membership_held` | `GET /v1/membership/{platform}/held` | Members whose removal is held for review. |
| `keep_membership_held` | `POST /v1/membership/{platform}/held/keep` | Keeps the held access. |
| `register_membership_webhooks` | `POST /v1/membership/{platform}/webhooks` | Registers the purchase webhook again. No preview. |
| `disconnect_membership_platform` | `POST /v1/membership/{platform}/disconnect` | Deletes the saved key. |
| `list_membership_lessons` | `GET /v1/membership/{platform}/lessons` | Lessons of the courses whose offers go to a collection, with each lesson's video state and the most files one upload takes. |
| `prepare_membership_lesson_uploads` | `POST /v1/membership/{platform}/lessons/uploads` | Send each file's name and size, or the `lesson_id`. The preview shows the matches and the allowance used. The confirmed call returns an `upload_url` for each file. |
| `complete_membership_lesson_uploads` | `POST /v1/membership/{platform}/lessons/uploads/complete` | After each file's `PUT` to its `upload_url` finishes, send its `upload_session_id`. Starts processing. No preview, and safe to call again. |

> [!WARNING]
>
> When you connect through an AI app, the key you paste stays in that chat's history. Make a key with only the access listed above, and delete it in Kajabi if it should not stay.


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