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

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



## OpenAPI

````yaml /developers/api-reference/openapi.json get /v1/creators/{creatorId}/persona
openapi: 3.1.0
info:
  contact:
    email: developers@onlyx.ai
    name: OnlyX developers
    url: https://docs.onlyx.ai/
  description: >
    The OnlyX API runs your OnlyX workspace from your own code and AI tools:
    creators and their

    connection, the fan inbox, fans, vault media, statistics, the AI chatter's
    setup and tracking links.


    **Authentication.** Send an API key as `Authorization: Bearer onx_sk_…`
    (create one in OnlyX under

    Settings → API & MCP), or an OAuth access token issued to a connected app.
    Keys belong to the

    workspace, carry scopes, and can be limited to some creators.


    **Conventions.** JSON with camelCase fields; timestamps are ISO-8601 UTC
    with a `Z`; money is integer

    US cents (fields end in `Cents`). Lists return `{"data": [...], "hasMore":
    bool, "nextCursor": string|null}`

    and page with `limit` and `cursor`.


    **Scopes.** Every operation names the scope it needs in `x-required-scope`
    and in its description; a

    credential without it gets `403 INSUFFICIENT_SCOPE`.


    **Errors and limits.** Errors are `{"error": {"code", "message",
    "requestId"}}`; every response

    carries `X-Request-Id`. The default limit is 120 requests per 60 seconds per

    credential, reported in `X-RateLimit-*` headers; over it you get `429
    RATE_LIMITED` with `Retry-After`.

    Operations with limits of their own list them in `x-rate-limits`.


    **Idempotency and safety.** Every write accepts an `Idempotency-Key` header
    (required when sending a

    message, adding a creator and creating a tracking link): retry with the same
    key and you get the

    original answer instead of a second action. Operations marked
    `x-reaches-fans: true` can reach a real

    fan or change the live OnlyFans account.


    Guides, the MCP server and more: [docs.onlyx.ai](https://docs.onlyx.ai).
  summary: >-
    Run your OnlyX workspace (creators, inbox, fans, stats and the AI chatter)
    from code and AI tools.
  title: OnlyX API
  version: 1.0.0
servers:
  - description: Production
    url: https://api.onlyx.ai
security:
  - bearerAuth: []
tags:
  - description: 'Who you are: the workspace and credential behind a key.'
    name: Workspace
  - description: >-
      The creators your workspace manages: list, read, add, rename, and the AI
      switch.
    name: Creators
  - description: >-
      Connecting a creator's OnlyFans account: connect links she opens on her
      own device, and the connection status to poll.
    name: Connect
  - description: >-
      The fan inbox: list and count conversations, read state, take over,
      release, and the per-chat AI switch.
    name: Conversations
  - description: Read message history and send text, free media and paid messages to fans.
    name: Messages
  - description: Conversations the AI chatter handed to your team, and resolving them.
    name: Hand-offs
  - description: >-
      Fans, their purchases, fan lists, and your team's notes, custom names and
      mute flag.
    name: Fans
  - description: >-
      Each creator's OnlyFans vault: media ids for messages and levels, and
      thumbnails.
    name: Media
  - description: >-
      Today, revenue, audience, the cached overview report, and each creator's
      transaction ledger.
    name: Stats
  - description: The brief the AI chatter follows to chat as each creator.
    name: AI persona
  - description: 'The AI content ladder: folders, ladders, priced levels and their media.'
    name: AI content
  - description: >-
      Follow-ups, review mode, the master AI switch, and OnlyFans' welcome
      message.
    name: AI settings
  - description: >-
      OnlyFans tracking and trial links, your cost fields, and creating new
      links.
    name: Tracking links
externalDocs:
  description: OnlyX developer documentation
  url: https://docs.onlyx.ai
paths:
  /v1/creators/{creatorId}/persona:
    get:
      tags:
        - AI persona
      summary: Get the AI persona
      description: >-
        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.
      operationId: getPersona
      parameters:
        - description: The creator id (`cre_…`).
          in: path
          name: creatorId
          required: true
          schema:
            description: The creator id (`cre_…`).
            title: Creatorid
            type: string
      responses:
        '200':
          content:
            application/json:
              example:
                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'
              schema:
                $ref: '#/components/schemas/Persona'
          description: The persona, its completeness, and the hand-off catalogue.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '400':
          content:
            application/json:
              examples:
                VALIDATION_ERROR:
                  summary: VALIDATION_ERROR
                  value:
                    error:
                      code: VALIDATION_ERROR
                      message: The request could not be read.
                      requestId: req-3f9a1c2b7d4e5f60a1b2c3d4
              schema:
                $ref: '#/components/schemas/Error'
          description: >-
            The request is not valid and was not carried out. Fix it before
            retrying. `VALIDATION_ERROR`: the request is not valid; `message`
            names the field and the problem.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          content:
            application/json:
              examples:
                INSUFFICIENT_SCOPE:
                  summary: INSUFFICIENT_SCOPE
                  value:
                    error:
                      code: INSUFFICIENT_SCOPE
                      message: This key does not have the `ai:read` scope.
                      requestId: req-3f9a1c2b7d4e5f60a1b2c3d4
                WORKSPACE_SUSPENDED:
                  summary: WORKSPACE_SUSPENDED
                  value:
                    error:
                      code: WORKSPACE_SUSPENDED
                      message: This workspace is suspended.
                      requestId: req-3f9a1c2b7d4e5f60a1b2c3d4
              schema:
                $ref: '#/components/schemas/Error'
          description: >-
            The credential may not do this. `INSUFFICIENT_SCOPE`: the credential
            lacks the `ai:read` scope (the `WWW-Authenticate` header names it;
            an OAuth token's message says "token" instead of "key").
            `WORKSPACE_SUSPENDED`: the workspace is suspended.
          headers:
            WWW-Authenticate:
              $ref: '#/components/headers/WWW-Authenticate'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '404':
          content:
            application/json:
              examples:
                CREATOR_NOT_FOUND:
                  summary: CREATOR_NOT_FOUND
                  value:
                    error:
                      code: CREATOR_NOT_FOUND
                      message: Creator not found.
                      requestId: req-3f9a1c2b7d4e5f60a1b2c3d4
              schema:
                $ref: '#/components/schemas/Error'
          description: >-
            Not found. An id that does not exist, belongs to another workspace,
            or is outside this credential's creators all get the same answer.
            `CREATOR_NOT_FOUND`: no creator with this `creatorId` is visible to
            this credential.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  schemas:
    Persona:
      description: >-
        The AI persona: the brief the AI chatter follows to chat as this
        creator. Every field is

        written by your team.
      examples:
        - 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'
      properties:
        accountContext:
          description: >-
            How her page works: free or paid, what is on the wall, what is sold
            in messages.
          type: string
        additionalLanguages:
          description: Other languages she can chat in (BCP-47 tags).
          items:
            type: string
          type: array
        age:
          anyOf:
            - type: integer
            - type: 'null'
          description: Her age, 18 to 99. Required for the AI.
        aiDisclosureEnabled:
          description: Whether fans are told they may be talking to an AI.
          type: boolean
        aiDisclosureText:
          description: The disclosure fans see when `aiDisclosureEnabled` is on.
          type: string
        allowTypos:
          description: Whether the AI may make an occasional natural typo.
          type: boolean
        archetype:
          description: Her overall character, for example `girl_next_door`.
          type: string
        boundaries:
          description: Topics she avoids or steers away from, in plain sentences.
          items:
            type: string
          type: array
        capitalization:
          description: 'How she capitalizes: `normal`, all `lowercase`, or a `casual_mix`.'
          type: string
        city:
          description: Where she says she lives. Required for the AI.
          type: string
        completeness:
          description: How complete the persona is, 0 to 100.
          type: integer
        contentMenu:
          description: The kinds of content she makes.
          items:
            type: string
          type: array
        contentNotes:
          description: >-
            Anything else about her content: lengths, what is shown, what is
            never shown.
          type: string
        customContentEnabled:
          description: Whether the AI may quote custom content at the prices below.
          type: boolean
        customPhotoDeliveryDays:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            Days she needs to deliver a custom photo. `null` uses the default of
            3.
        customVideoDeliveryDays:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            Days she needs to deliver a custom video. `null` uses the default of
            7.
        emojiPolicy:
          description: 'How many emojis she uses: `none`, `rare`, `some`, `heavy`.'
          type: string
        exemplars:
          description: >-
            Sample messages in her voice. The strongest single influence on how
            the AI sounds.
          items:
            type: string
          type: array
        handoffCatalogue:
          description: >-
            Every hand-off kind you can choose from (the example shows three of
            them).
          items:
            $ref: '#/components/schemas/HandoffKind'
          type: array
        handoffEffective:
          description: >-
            The hand-off kinds actually in force: your `handoffKinds` (or the
            recommended set) plus the locked kinds.
          items:
            type: string
          type: array
        handoffKinds:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          description: >-
            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.
        hardLimits:
          description: >-
            Things she never does or offers, whatever a fan says. The AI treats
            them as a hard stop.
          items:
            type: string
          type: array
        interests:
          description: Things she likes talking about.
          items:
            type: string
          type: array
        lore:
          description: >-
            Her backstory in her own world: family, home, routine, personality.
            Required for the AI.
          type: string
        messageSplitting:
          description: >-
            How often one reply is split into several short messages: `never`,
            `sometimes`, `often`.
          type: string
        nickname:
          anyOf:
            - type: string
            - type: 'null'
          description: A pet name or short name.
        occupation:
          anyOf:
            - type: string
            - type: 'null'
          description: What she does besides OnlyFans. Required for the AI.
        origin:
          anyOf:
            - type: string
            - type: 'null'
          description: Where she is from.
        personaName:
          anyOf:
            - type: string
            - type: 'null'
          description: The first name she uses with fans. Required for the AI.
        physicalDescription:
          description: What she looks like, so the AI never contradicts her content.
          type: string
        priceCustomPhotoCents:
          anyOf:
            - type: integer
            - type: 'null'
          description: Minimum price for a custom photo, in cents.
        priceCustomVideoMinCents:
          anyOf:
            - type: integer
            - type: 'null'
          description: Minimum total price for any custom video, in cents.
        priceCustomVideoPerMinCents:
          anyOf:
            - type: integer
            - type: 'null'
          description: Minimum price per minute of custom video, in cents.
        primaryLanguage:
          description: The language she chats in, as a BCP-47 tag (`en`, `es`, `pt-BR`).
          type: string
        punctuation:
          description: 'How carefully she punctuates: `proper`, `relaxed` or `minimal`.'
          type: string
        readyForAi:
          description: >-
            `true` when every required field is filled: `personaName`, `age`,
            `city`, `occupation` and `lore`.
          type: boolean
        requiredMissing:
          description: Required fields that are still empty.
          items:
            type: string
          type: array
        timezone:
          description: >-
            Her IANA time zone (`America/Chicago`). The AI's sense of her local
            time uses it.
          type: string
        typingSpeed:
          description: >-
            How quickly replies go out, like a person typing: `fast`, `natural`,
            `slow`.
          type: string
        updatedAt:
          anyOf:
            - type: string
            - type: 'null'
          description: When the persona was last changed; `null` if it was never written.
      required:
        - personaName
        - nickname
        - age
        - city
        - origin
        - occupation
        - archetype
        - lore
        - accountContext
        - physicalDescription
        - interests
        - contentMenu
        - contentNotes
        - boundaries
        - hardLimits
        - exemplars
        - primaryLanguage
        - additionalLanguages
        - timezone
        - capitalization
        - punctuation
        - messageSplitting
        - typingSpeed
        - emojiPolicy
        - allowTypos
        - customContentEnabled
        - priceCustomPhotoCents
        - priceCustomVideoPerMinCents
        - priceCustomVideoMinCents
        - customPhotoDeliveryDays
        - customVideoDeliveryDays
        - aiDisclosureEnabled
        - aiDisclosureText
        - handoffKinds
        - handoffEffective
        - handoffCatalogue
        - completeness
        - readyForAi
        - requiredMissing
        - updatedAt
      title: Persona
      type: object
    Error:
      properties:
        error:
          properties:
            code:
              description: Stable, machine-readable error code.
              type: string
            message:
              description: What went wrong, in a sentence for a person.
              type: string
            requestId:
              description: >-
                The id of this request (also in the `X-Request-Id` header).
                Quote it to support.
              type: string
          required:
            - code
            - message
            - requestId
          type: object
      required:
        - error
      type: object
    HandoffKind:
      properties:
        default:
          description: Whether the kind is in the recommended set.
          type: boolean
        key:
          description: The kind's stable key, for `handoffKinds`.
          type: string
        label:
          description: What the situation is, for people.
          type: string
        locked:
          description: '`true` for kinds that always hand off and cannot be switched off.'
          type: boolean
        reason:
          description: >-
            The hand-off `reason` this kind reports (`welfare`,
            `payment_dispute`, …).
          type: string
      required:
        - key
        - reason
        - label
        - default
        - locked
      title: HandoffKind
      type: object
  headers:
    X-RateLimit-Limit:
      description: >-
        Requests allowed in the current window of the tightest limit this
        request counted against.
      example: 120
      schema:
        type: integer
    X-RateLimit-Remaining:
      description: Requests left in that window.
      example: 117
      schema:
        type: integer
    X-RateLimit-Reset:
      description: When that window resets, as Unix epoch seconds.
      example: 1790431380
      schema:
        type: integer
    X-Request-Id:
      description: >-
        The id of this request. Your own `X-Request-Id` (8 to 64 letters, digits
        or `-`) is echoed back; otherwise OnlyX creates one. Also in every error
        body as `requestId`: quote it to support.
      example: req-3f9a1c2b7d4e5f60a1b2c3d4
      schema:
        type: string
    WWW-Authenticate:
      description: >-
        The authentication challenge (RFC 6750), for example `Bearer
        error="insufficient_scope", scope="messages:send"`.
      schema:
        type: string
    Retry-After:
      description: Seconds to wait before trying again.
      example: 12
      schema:
        type: integer
  responses:
    Unauthorized:
      content:
        application/json:
          examples:
            INVALID_API_KEY:
              summary: INVALID_API_KEY
              value:
                error:
                  code: INVALID_API_KEY
                  message: The API key is invalid, expired or revoked.
                  requestId: req-3f9a1c2b7d4e5f60a1b2c3d4
            INVALID_TOKEN:
              summary: INVALID_TOKEN
              value:
                error:
                  code: INVALID_TOKEN
                  message: The access token is invalid, expired or revoked.
                  requestId: req-3f9a1c2b7d4e5f60a1b2c3d4
            UNAUTHORIZED:
              summary: UNAUTHORIZED
              value:
                error:
                  code: UNAUTHORIZED
                  message: >-
                    Authentication required. Send your API key as
                    `Authorization: Bearer onx_sk_…`.
                  requestId: req-3f9a1c2b7d4e5f60a1b2c3d4
          schema:
            $ref: '#/components/schemas/Error'
      description: >-
        No credential was sent (`UNAUTHORIZED`), or it is invalid, expired or
        revoked (`INVALID_API_KEY` for API keys, `INVALID_TOKEN` for OAuth
        access tokens: refresh the token or reconnect the app). Too many failed
        attempts from one address with credentials OnlyX never issued are
        answered `429 RATE_LIMITED` instead.
      headers:
        WWW-Authenticate:
          $ref: '#/components/headers/WWW-Authenticate'
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
    RateLimited:
      content:
        application/json:
          examples:
            RATE_LIMITED:
              summary: RATE_LIMITED
              value:
                error:
                  code: RATE_LIMITED
                  message: Too many requests. Try again in 12 seconds.
                  requestId: req-3f9a1c2b7d4e5f60a1b2c3d4
          schema:
            $ref: '#/components/schemas/Error'
      description: >-
        Over a rate limit (`RATE_LIMITED`). Wait `Retry-After` seconds, then
        retry — with the same `Idempotency-Key` for a write.
      headers:
        Retry-After:
          $ref: '#/components/headers/Retry-After'
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
    InternalError:
      content:
        application/json:
          examples:
            INTERNAL_ERROR:
              summary: INTERNAL_ERROR
              value:
                error:
                  code: INTERNAL_ERROR
                  message: Something went wrong on our side.
                  requestId: req-3f9a1c2b7d4e5f60a1b2c3d4
          schema:
            $ref: '#/components/schemas/Error'
      description: >-
        Something went wrong on OnlyX's side (`INTERNAL_ERROR`). Retry with
        backoff (reuse the `Idempotency-Key` for a write); quote `requestId` to
        support if it persists.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
  securitySchemes:
    bearerAuth:
      bearerFormat: onx_sk_… API key or onx_at_… access token
      description: >-
        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>`.
      scheme: bearer
      type: http

````