curl --request GET \
--url https://api.onlyx.ai/v1/creators/{creatorId}/persona \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.onlyx.ai/v1/creators/{creatorId}/persona"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.onlyx.ai/v1/creators/{creatorId}/persona', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"accountContext": "Paid page. The wall has photos; videos are sold in messages.",
"additionalLanguages": [
"es"
],
"age": 24,
"aiDisclosureEnabled": false,
"aiDisclosureText": "",
"allowTypos": true,
"archetype": "girl_next_door",
"boundaries": [
"Does not talk about her family."
],
"capitalization": "lowercase",
"city": "Austin",
"completeness": 86,
"contentMenu": [
"lingerie photos",
"shower videos"
],
"contentNotes": "No face in explicit videos.",
"customContentEnabled": true,
"customPhotoDeliveryDays": 3,
"customVideoDeliveryDays": 7,
"emojiPolicy": "some",
"exemplars": [
"heyy you 😘 how was your day?"
],
"handoffCatalogue": [
{
"default": true,
"key": "welfare.self_harm",
"label": "Suicidal or self-harm language",
"locked": true,
"reason": "welfare"
},
{
"default": true,
"key": "payment.refund_demand",
"label": "Asks for a refund",
"locked": false,
"reason": "payment_dispute"
},
{
"default": false,
"key": "real_world.meet_request",
"label": "Asks to meet",
"locked": false,
"reason": "real_world"
}
],
"handoffEffective": [
"welfare.self_harm",
"welfare.immediate_danger",
"prohibited.underage",
"prohibited.animals_illegal",
"real_world.stalking",
"real_world.threat",
"payment.fraud_threat",
"payment.refund_demand",
"payment.double_charge",
"payment.not_received",
"payment.custom_overdue",
"whale.broken_promise",
"whale.feels_scammed"
],
"handoffKinds": null,
"hardLimits": [
"No meetups.",
"No custom videos with other people."
],
"interests": [
"hiking",
"live music",
"tacos"
],
"lore": "Grew up by the beach, moved to Austin for college and stayed for the music.",
"messageSplitting": "sometimes",
"nickname": "Mimi",
"occupation": "Yoga instructor",
"origin": "San Diego",
"personaName": "Mia",
"physicalDescription": "Blonde, 5'6\", athletic, small tattoo on her left wrist.",
"priceCustomPhotoCents": 2500,
"priceCustomVideoMinCents": 5000,
"priceCustomVideoPerMinCents": 1000,
"primaryLanguage": "en",
"punctuation": "relaxed",
"readyForAi": true,
"requiredMissing": [],
"timezone": "America/Chicago",
"typingSpeed": "natural",
"updatedAt": "2026-09-26T14:02:31.000Z"
}Get the AI persona
Returns the creator’s AI persona: the brief your team wrote so the AI chatter can chat as her (name, age, city, backstory, voice, boundaries, hard limits, sample messages, custom-content prices, and which situations hand off to your team). It also reports completeness, readyForAi and requiredMissing, and lists every hand-off kind you can choose from in handoffCatalogue. A creator whose persona was never written gets the defaults with updatedAt: null; reading never creates anything.
Scope: requires ai:read.
Rate limit: the general limit of 120 requests per 60 seconds per credential.
curl --request GET \
--url https://api.onlyx.ai/v1/creators/{creatorId}/persona \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.onlyx.ai/v1/creators/{creatorId}/persona"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.onlyx.ai/v1/creators/{creatorId}/persona', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"accountContext": "Paid page. The wall has photos; videos are sold in messages.",
"additionalLanguages": [
"es"
],
"age": 24,
"aiDisclosureEnabled": false,
"aiDisclosureText": "",
"allowTypos": true,
"archetype": "girl_next_door",
"boundaries": [
"Does not talk about her family."
],
"capitalization": "lowercase",
"city": "Austin",
"completeness": 86,
"contentMenu": [
"lingerie photos",
"shower videos"
],
"contentNotes": "No face in explicit videos.",
"customContentEnabled": true,
"customPhotoDeliveryDays": 3,
"customVideoDeliveryDays": 7,
"emojiPolicy": "some",
"exemplars": [
"heyy you 😘 how was your day?"
],
"handoffCatalogue": [
{
"default": true,
"key": "welfare.self_harm",
"label": "Suicidal or self-harm language",
"locked": true,
"reason": "welfare"
},
{
"default": true,
"key": "payment.refund_demand",
"label": "Asks for a refund",
"locked": false,
"reason": "payment_dispute"
},
{
"default": false,
"key": "real_world.meet_request",
"label": "Asks to meet",
"locked": false,
"reason": "real_world"
}
],
"handoffEffective": [
"welfare.self_harm",
"welfare.immediate_danger",
"prohibited.underage",
"prohibited.animals_illegal",
"real_world.stalking",
"real_world.threat",
"payment.fraud_threat",
"payment.refund_demand",
"payment.double_charge",
"payment.not_received",
"payment.custom_overdue",
"whale.broken_promise",
"whale.feels_scammed"
],
"handoffKinds": null,
"hardLimits": [
"No meetups.",
"No custom videos with other people."
],
"interests": [
"hiking",
"live music",
"tacos"
],
"lore": "Grew up by the beach, moved to Austin for college and stayed for the music.",
"messageSplitting": "sometimes",
"nickname": "Mimi",
"occupation": "Yoga instructor",
"origin": "San Diego",
"personaName": "Mia",
"physicalDescription": "Blonde, 5'6\", athletic, small tattoo on her left wrist.",
"priceCustomPhotoCents": 2500,
"priceCustomVideoMinCents": 5000,
"priceCustomVideoPerMinCents": 1000,
"primaryLanguage": "en",
"punctuation": "relaxed",
"readyForAi": true,
"requiredMissing": [],
"timezone": "America/Chicago",
"typingSpeed": "natural",
"updatedAt": "2026-09-26T14:02:31.000Z"
}Authorizations
An API key (onx_sk_…) created in OnlyX under Settings → API & MCP, or an OAuth access token (onx_at_…) issued to a connected app. Send it as Authorization: Bearer <credential>. API keys may also be sent as X-API-Key: <key>.
Path Parameters
The creator id (cre_…).
Response
The persona, its completeness, and the hand-off catalogue.
The AI persona: the brief the AI chatter follows to chat as this creator. Every field is written by your team.
How her page works: free or paid, what is on the wall, what is sold in messages.
Other languages she can chat in (BCP-47 tags).
Her age, 18 to 99. Required for the AI.
Whether fans are told they may be talking to an AI.
The disclosure fans see when aiDisclosureEnabled is on.
Whether the AI may make an occasional natural typo.
Her overall character, for example girl_next_door.
Topics she avoids or steers away from, in plain sentences.
How she capitalizes: normal, all lowercase, or a casual_mix.
Where she says she lives. Required for the AI.
How complete the persona is, 0 to 100.
The kinds of content she makes.
Anything else about her content: lengths, what is shown, what is never shown.
Whether the AI may quote custom content at the prices below.
Days she needs to deliver a custom photo. null uses the default of 3.
Days she needs to deliver a custom video. null uses the default of 7.
How many emojis she uses: none, rare, some, heavy.
Sample messages in her voice. The strongest single influence on how the AI sounds.
Every hand-off kind you can choose from (the example shows three of them).
Show child attributes
Show child attributes
The hand-off kinds actually in force: your handoffKinds (or the recommended set) plus the locked kinds.
The hand-off kinds (keys from handoffCatalogue) that make the AI hand a chat to your team. null means the recommended set; [] means only the kinds that can never be switched off.
Things she never does or offers, whatever a fan says. The AI treats them as a hard stop.
Things she likes talking about.
Her backstory in her own world: family, home, routine, personality. Required for the AI.
How often one reply is split into several short messages: never, sometimes, often.
A pet name or short name.
What she does besides OnlyFans. Required for the AI.
Where she is from.
The first name she uses with fans. Required for the AI.
What she looks like, so the AI never contradicts her content.
Minimum price for a custom photo, in cents.
Minimum total price for any custom video, in cents.
Minimum price per minute of custom video, in cents.
The language she chats in, as a BCP-47 tag (en, es, pt-BR).
How carefully she punctuates: proper, relaxed or minimal.
true when every required field is filled: personaName, age, city, occupation and lore.
Required fields that are still empty.
Her IANA time zone (America/Chicago). The AI's sense of her local time uses it.
How quickly replies go out, like a person typing: fast, natural, slow.
When the persona was last changed; null if it was never written.