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

> Every field of a creator's AI persona: who she is, how she writes, what she will never do, and when the AI hands off. With good and bad examples.

The **AI persona** is your brief to the AI chatter about one creator: who she is, how she talks, what she makes, and where her limits are. The AI reads it fresh for every reply, so a change applies to the next message it writes. It is the single biggest lever on how convincing and how safe the AI is.

Read it with `GET /v1/creators/{creatorId}/persona` (`ai:read`) and change it with `PATCH` (`ai:write`). The step-by-step guide is [Set up the AI persona](/developers/guides/ai-persona).

<Tip>
  Write the persona the way you would brief a new human chatter on day one: concrete facts, her real way of texting, and a clear list of things she never does. Vague personas produce generic replies.
</Tip>

## Required fields

The AI is ready to chat for a creator (`readyForAi: true`) once these five are filled. `requiredMissing` lists the ones still empty.

| Field | Limit | What it is | Good | Bad |
| - | - | - | - | - |
| `personaName` | 120 chars | The name she uses with fans | `Mia` | `Mia Rose OFFICIAL` |
| `age` | 18 to 99 | Her age, as fans know it | `24` | leaving it empty, so the AI dodges a common question |
| `city` | 120 chars | Where she lives now, at the level she shares with fans | `Austin, Texas` | `USA` (too vague to chat about) |
| `occupation` | 160 chars | What she does besides OnlyFans | `Nursing student, weekend shifts at a coffee shop` | `Model` |
| `lore` | 4,000 chars | Her backstory: family, pets, routine, what she did last weekend, running jokes | A few concrete paragraphs (see below) | `She is hot and loves her fans.` |

A good `lore` is specific enough that the AI can answer "what did you do today?" the way she would:

> Mia grew up outside Denver with two older brothers and moved to Austin for nursing school three years ago. She lives with her cat Pickle in a small apartment near campus, works Saturday and Sunday mornings at a coffee shop, and studies most evenings. She loves hiking Barton Creek, trying every taco truck in town, and rewatching Gilmore Girls. She is flirty and teasing but gets shy when fans compliment her smile. She started OnlyFans last year to pay for school.

## Identity and background

| Field | Limit | What it is | Good | Bad |
| - | - | - | - | - |
| `nickname` | 80 chars | What fans may call her | `Mimi` | a nickname she never uses |
| `origin` | 120 chars | Where she grew up | `Outside Denver, Colorado` | her exact home address |
| `archetype` | 60 chars | A short label for her overall vibe; default `girl_next_door` (sending `null` puts the default back) | `girl_next_door` | a full sentence |
| `accountContext` | 1,000 chars | What her OnlyFans page is: what is on the wall, how often she posts, what is free versus paid | `Free page. Wall has teasing lingerie photos; all explicit sets are paid messages. Posts daily around 8 pm.` | `OnlyFans account` |
| `physicalDescription` | 1,000 chars | How she looks, so the AI never contradicts her photos | `5'4", long brown hair, green eyes, small rose tattoo on her left wrist, freckles` | `Beautiful` |
| `interests` | list | Things she enjoys talking about | `["hiking", "tacos", "Gilmore Girls", "her cat Pickle"]` | `["fun"]` |

## Language and time

| Field | Limit | What it is | Good | Bad |
| - | - | - | - | - |
| `primaryLanguage` | BCP-47 tag, 20 chars | The language she writes in; default `en` | `en`, `es`, `pt-BR` | `English` (use the tag) |
| `additionalLanguages` | up to 50 BCP-47 tags | Other languages she can answer in | `["es"]` | languages she does not speak |
| `timezone` | IANA name, 64 chars | Her local time, so she sleeps at night and "good morning" lands in the morning; default `UTC` | `America/Chicago` | `CST` (use the IANA name) |

## How she writes

These fields shape the texture of every message. Pick what matches her real texting, not an ideal. They always have a value: you can change them, but sending `null` is a `400 VALIDATION_ERROR`.

| Field | Values | Default | Effect |
| - | - | - | - |
| `capitalization` | `normal`, `lowercase`, `casual_mix` | `normal` | `lowercase` writes "omg stop", `casual_mix` mixes both like most people on a phone |
| `punctuation` | `proper`, `relaxed`, `minimal` | `relaxed` | `minimal` drops most periods and commas |
| `messageSplitting` | `never`, `sometimes`, `often` | `sometimes` | `often` sends two or three short bubbles instead of one long one |
| `typingSpeed` | `fast`, `natural`, `slow` | `natural` | How long a reply takes to arrive, so replies do not feel instant |
| `emojiPolicy` | `none`, `rare`, `some`, `heavy` | `some` | How many emoji she uses |
| `allowTypos` | `true`, `false` | `false` | Allows the occasional human typo |

`exemplars` (list) is the strongest style signal: real messages in her voice. Paste 5 to 15 lines she or your best chatter actually sent.

| Good exemplars | Bad exemplars |
| - | - |
| `omg stop you're making me blush 🙈 what are you up to tonight?` | `Hello! How may I help you today?` |
| `ok but that shirt?? where did u get it` | `I am a friendly and flirty girl.` |
| `just got back from the gym, legs are dead lol` | `Buy my content now!!!` |

## What she makes

| Field | Limit | What it is | Good | Bad |
| - | - | - | - | - |
| `contentMenu` | list | The kinds of content she makes, so the AI never promises something she does not have | `["lingerie photo sets", "shower videos", "custom photos"]` | `["everything"]` |
| `contentNotes` | 1,000 chars | Rules about her content | `Face shown in all photos. Videos are 2-6 minutes. No content with other people.` | empty |

The priced content the AI actually sells lives in her [AI content](/developers/concepts/ai-content) ladder; the persona only describes it.

## Boundaries and hard limits

| Field | What it is | Good | Bad |
| - | - | - | - |
| `boundaries` | Soft limits: topics she avoids or steers away from | `["Does not talk about her ex", "Changes the subject if asked about her family's jobs"]` | `["Be nice"]` |
| `hardLimits` | Things she never does, whatever the price. The AI refuses these firmly, in character. At least one is needed for the `limits` readiness check. | `["No meetups or video calls", "Never shares her last name, school or workplace", "No content with other people"]` | leaving it empty |

## Custom content

| Field | Limit | What it is |
| - | - | - |
| `customContentEnabled` | `true`/`false` (default `false`) | Whether the AI may quote custom photos and videos |
| `priceCustomPhotoCents` | 0 to 1,000,000 | The lowest price for a custom photo, in cents |
| `priceCustomVideoPerMinCents` | 0 to 1,000,000 | The lowest price per minute of custom video |
| `priceCustomVideoMinCents` | 0 to 1,000,000 | The lowest total price of any custom video |
| `customPhotoDeliveryDays` | 1 to 60 (`null` = 3) | How many days a custom photo takes |
| `customVideoDeliveryDays` | 1 to 60 (`null` = 7) | How many days a custom video takes |

Custom selling also has to be available for your workspace. When it is off, these fields are kept but the AI does not quote customs; if you want those requests to reach your team, turn on the `custom.selling_off` hand-off kind.

## AI disclosure

| Field | Limit | What it is |
| - | - | - |
| `aiDisclosureEnabled` | `true`/`false` (default `false`) | When `true`, the AI tells fans they are chatting with an AI assistant, using your text |
| `aiDisclosureText` | 500 chars | The words to use, for example `Heads up: some of my replies are written with help from my AI assistant.` |

Turn this on if the law where you or your fans are requires it, or if it is your policy.

## Hand-off kinds

`handoffKinds` chooses which situations make the AI hand a chat to your team for this creator. The response includes the full catalogue so you can build a picker:

```json theme={"system"}
{
  "handoffCatalogue": [
    { "key": "welfare.self_harm", "reason": "welfare", "label": "Suicidal or self-harm language", "default": true, "locked": true },
    { "key": "real_world.meet_request", "reason": "real_world", "label": "Asks to meet", "default": false, "locked": false },
    { "key": "payment.refund_demand", "reason": "payment_dispute", "label": "Asks for a refund", "default": true, "locked": false }
  ]
}
```

| Value you send | Meaning |
| - | - |
| `null` (or never set) | The recommended set: every kind with `default: true` |
| `[]` | Only the kinds that are `locked` (they can never be turned off) |
| `["real_world.meet_request", "payment.refund_demand"]` | These kinds, plus the locked ones |

`handoffEffective` is the list that actually applies right now. Up to 100 keys; an unknown key is rejected with `400 VALIDATION_ERROR`. The catalogue's two locked kinds are `welfare.self_harm` and `prohibited.underage`.

## Read-only fields

| Field | Meaning |
| - | - |
| `completeness` | 0 to 100. Required fields count for half, optional fields for the other half. |
| `readyForAi` | `true` when all five required fields are filled |
| `requiredMissing` | The required fields that are still empty, for example `["city", "lore"]` |
| `handoffEffective`, `handoffCatalogue` | See above |
| `updatedAt` | When the persona last changed (UTC, for example `2026-09-26T14:02:31.000Z`); `null` if it was never written |

## Related

* [Set up the AI persona](/developers/guides/ai-persona): read, update, clear fields and check readiness with real calls.
* [Hugo, the AI chatter](/developers/concepts/hugo-ai): what the AI does with the persona.
* [AI content](/developers/concepts/ai-content): the priced content the AI sells.
