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

> ## Agent Instructions
> You are reading OnlyX Help: the OnlyX Help Center and the OnlyX developer documentation. OnlyX is an AI chatting and CRM platform for OnlyFans agencies. Its AI chatter is called Hugo in the app.
> Pages at the site root (for example /inbox/..., /hugo/..., /billing/...) are Help Center articles for agency owners, admins, chatters and creators who use the app at app.onlyx.ai. Words in bold are the exact button, menu and label names the app shows; keep them exactly as written. When these pages do not answer a question, the person can email support at support@onlyx.ai.
> Pages under /developers are the developer documentation. REST API base URL: https://api.onlyx.ai/v1 (authenticate with `Authorization: Bearer <API key>`; keys start with onx_sk_ and are created in app.onlyx.ai under Settings > API & MCP). MCP server: https://mcp.onlyx.ai/mcp (OAuth, or a Bearer API key). In the API the AI chatter is `ai` on the wire. Money is integer US cents in fields ending in Cents; timestamps are UTC ISO-8601.
> Rules for assistants acting on a user's behalf: discover ids with list calls and never invent them; before any call that reaches a real fan or the live OnlyFans account (sending a message, releasing a chat to the AI, turning AI on for a chat, resolving a hand-off, turning review mode off, changing the welcome message, creating a tracking link) show the user the exact content and get explicit confirmation; send every POST with an Idempotency-Key and reuse it on retry; never resend a message whose delivery status is unconfirmed; never ask a creator for her OnlyFans password or codes - she signs in herself through a connect link and the OnlyX Login app.

# AI content

> Ladders, levels, free openers and aftercare, price floors in cents, preview versus paid media, and how the AI decides what to offer.

**AI content** is the catalogue the AI chatter sells from, for one creator. You take media from her OnlyFans vault, group it into priced **levels**, and put the levels in **ladders** that the AI climbs with each fan. Nothing here is posted anywhere: it only tells the AI what exists, what it costs at minimum, and in what order to offer it.

Read it with `GET /v1/creators/{creatorId}/ai-content` (`ai:read`); build it with the calls in [Build the AI content ladder](/developers/guides/ai-content) (`ai:write`).

## The building blocks

```mermaid theme={"system"}
flowchart LR
  F["Folder: Main"] --> L1["Ladder: Bedroom tease (sequential)"]
  F --> L2["Ladder: Gym (standard)"]
  L1 --> A["Level 1: Opener (free)"]
  L1 --> B["Level 2: Lace set (floor 1200 cents)"]
  L1 --> C["Level 3: Shower video (floor 2500 cents)"]
  L1 --> D["Level 4: Thank-you (free aftercare)"]
  B --> P1["Preview: 1 photo, sent free"]
  B --> P2["Paid: 8 photos, locked behind the price"]
```

| Block | API name | Id | What it is |
| - | - | - | - |
| **Folder** | `folders` | `fld_...` | Optional organization for ladders. The AI ignores folders. |
| **Ladder** | `collections` | `col_...` | A themed series of levels, such as "Bedroom tease" or "Gym". Has a `mode` and an `active` switch. |
| **Level** | `levels` | `set_...` | One sellable bundle: some preview media, some paid media, and a floor price. |
| **Media** | `preview` / `paid` on a level | vault id (digits) | Items from the creator's vault. Each item sits on at most one level. |

## Levels and prices

Every level has a `priceCents`:

* **`priceCents` greater than 0** is a **floor**: the AI may sell the level for more, never for less. `1200` means at least \$12.00. The price also stays inside OnlyFans' own limits for paid messages on that account; a floor below OnlyFans' minimum is raised to it.
* **`priceCents: 0`** makes a **free level** (`free: true`). Everything on it is sent free, as preview, and the AI uses it as a gift rather than a sale.

A priced level needs at least one **paid** media item before the AI can sell it. A free level needs at least one item of any kind.

### Preview versus paid media

Each media item on a level has a role:

| Role | What the fan gets |
| - | - |
| `preview` | Sent **free** with the offer, unlocked, to tease what the price buys. Usually one or two items. |
| `paid` | **Locked** behind the price. The fan sees a blurred placeholder until they pay. |

On a free level every item is a preview. Adding media to a free level always stores it as preview.

### Free opener and free aftercare

Two free levels are common in a sequential ladder:

* A **free opener** as level 1: a small free gift that starts the ladder and makes the first paid offer feel natural.
* A **free aftercare** level as the last level: a warm thank-you after the fan bought the top level, which closes the ladder kindly instead of pushing for more.

<Warning>
  A level with `priceCents: 0` gives its media away. Always set `priceCents` deliberately, and check `free` in the response. A paid set created at 0 by mistake is sent free to every fan who reaches it.
</Warning>

## Ladder modes: sequential or standard

| `mode` | How the AI uses the ladder |
| - | - |
| `sequential` (default) | The AI offers **only the next level this fan has not bought yet**, in `position` order. It never skips ahead. Use it for an escalating story: tease, then more, then the best. |
| `standard` | The AI may offer **any** level of the ladder whenever it fits the conversation. Use it for a menu of independent sets. |

Reorder levels with `PUT .../collections/{collectionId}/order`. In a sequential ladder that changes the climb for every fan.

## How the AI decides what to offer

When a conversation reaches a moment to sell, the AI:

1. Considers only **active** ladders and **active** levels that are **available in paid messages** (`availableInPaidMessages: true`).
2. Skips what this fan already bought.
3. In a sequential ladder, looks only at the next unbought level; in a standard ladder, at all of them.
4. Picks what fits the conversation, using the level's `tags` (matched against what the fan talks about), its `description`, its `highlight` (a one-line hook it can lead with), and the ladder's `description`.
5. Sends the preview media free and the paid media locked, at or above the floor price, in the creator's voice.

Good tags and descriptions make better matches:

| Field | Good | Bad |
| - | - | - |
| `tags` (up to 30, 40 chars each) | `["lingerie", "lace", "bedroom", "red"]` | `["hot", "sexy"]` |
| `highlight` (80 chars) | `The red lace set you asked about` | `BUY NOW` |
| `description` (2,000 chars) | `Eight photos in the red lace set on her bed, morning light, playful and teasing, face visible.` | `Photos` |

## Level stats

Each level reports `stats` for sales the AI made:

| Field | Meaning |
| - | - |
| `sent` | How many times the AI offered it |
| `purchased` | How many of those offers were bought |
| `revenueCents` | What those purchases earned |

These count the AI's own offers only; sales your team made by hand are not included.

## Vault coverage

The board also reports `vault: {total, assigned, unassigned}`: how many items the creator's vault holds, how many are placed on a level, and how many are not. A large `unassigned` count is content the AI cannot sell yet.

## The board in one response

`GET /v1/creators/{creatorId}/ai-content` returns the whole board, and every write returns the updated board, so you never have to stitch pieces together.

```json ContentBoard (shortened) theme={"system"}
{
  "creatorId": "cre_5f2d9a1c7b3e4f60a2d1",
  "folders": [{ "id": "fld_2a4c6e8f0b1d3f5a7c9e", "name": "Main", "position": 1, "collectionCount": 1 }],
  "collections": [
    {
      "id": "col_8e1f3a5c7d9b2e4f6a0c",
      "folderId": "fld_2a4c6e8f0b1d3f5a7c9e",
      "name": "Bedroom tease",
      "mode": "sequential",
      "description": "Morning in bed, from cozy to lace to shower.",
      "active": true,
      "position": 1,
      "levelCount": 4
    }
  ],
  "levels": [
    {
      "id": "set_4b6d8f0a2c4e6a8c0e2a",
      "collectionId": "col_8e1f3a5c7d9b2e4f6a0c",
      "name": "Lace set",
      "position": 2,
      "priceCents": 1200,
      "free": false,
      "tags": ["lingerie", "lace", "bedroom"],
      "highlight": "The red lace set you asked about",
      "description": "Eight photos in the red lace set on her bed, morning light.",
      "availableInPaidMessages": true,
      "active": true,
      "stats": { "sent": 214, "purchased": 61, "revenueCents": 83900 },
      "preview": [
        { "id": "4012345678", "type": "photo", "durationSeconds": null, "thumbnailUrl": "https://api.onlyx.ai/v1/creators/cre_5f2d9a1c7b3e4f60a2d1/media/4012345678/thumbnail" }
      ],
      "paid": [
        { "id": "4012345679", "type": "photo", "durationSeconds": null, "thumbnailUrl": "https://api.onlyx.ai/v1/creators/cre_5f2d9a1c7b3e4f60a2d1/media/4012345679/thumbnail" }
      ]
    }
  ],
  "vault": { "total": 1840, "assigned": 36, "unassigned": 1804 }
}
```

## Rules the API enforces

* Media ids are the vault ids from `GET /v1/creators/{creatorId}/media` (strings of digits). Items from an OnlyX media library appear as `ox:` ids.
* One item lives on one level. Adding an item to a level **moves** it from wherever it was.
* A `folderId` must belong to the same creator, or you get `404`.
* Deleting a folder keeps its ladders (they become unfiled). Deleting a ladder deletes its levels and their media placements. Deleting a level renumbers the ones after it.
* Nothing in AI content is published to OnlyFans. Only the AI's offers in chats reach fans.
* Creates answer `201`, every other write `200`, always with the whole board. Content writes are limited to 60 per minute per credential.

## Related

* [Build the AI content ladder](/developers/guides/ai-content): every call, step by step.
* [Vault media](/developers/guides/vault-media): find media ids and thumbnails.
* [AI persona](/developers/concepts/ai-persona): `contentMenu` and `contentNotes` describe her content in words.
