The pages show request and response examples you can copy. Interactive testing (a “Send” button on each page) arrives when the API launches. Until then, call the API from your own code or with
curl.Base URL
/v1. Always use HTTPS.
Authentication
Send a credential in theAuthorization header:
Tools that cannot set a bearer header may send an API key as
X-API-Key: onx_sk_… instead. Keys belong to the workspace, not to a person, carry scopes, and can be limited to some creators. Every operation page names the scope it needs under Scope (the OpenAPI document carries it as x-required-scope), and the table below sums it up by area. A credential without the scope gets 403 INSUFFICIENT_SCOPE, and the error message names the missing scope. One operation needs two: turning review mode off with PATCH /v1/creators/{creatorId}/ai-settings releases waiting AI drafts to fans, so it needs messages:send as well as ai:write (in the OpenAPI document: x-conditional-scopes). GET /v1/me works with every valid credential and is the quickest way to check one. Details: Authentication and Security.
Versioning
The version is part of the path:/v1. Within v1 we only make additive changes: new endpoints, new optional parameters, new response fields, new enum values and new error codes. We never remove or rename a field or change its type within v1. Build your integration to ignore fields it does not know and to handle an unknown enum value or error code gracefully. Every change is listed in the changelog.
Conventions
- JSON in and out, UTF-8, with
Content-Type: application/jsonon request bodies. - camelCase field names:
displayName,priceCents,createdAt. - Money is an integer number of US cents in fields ending in
Cents:1500is $15.00. Where it matters,netCentsis what the creator earns after OnlyFans’ fee andgrossCents(oramountCents) is what the fan paid. - Timestamps are ISO-8601 in UTC with a
Z, for example2026-09-26T14:02:31.000Z. Parse them with a standard ISO-8601 parser and do not assume a fixed number of fractional-second digits. Dates areYYYY-MM-DDin the workspace time zone (GET /v1/mereturns it). - Null: a field without a value is present as
nullrather than left out. A few optional fields, such as a fan’susername, may be missing when OnlyFans does not provide them. - Single objects are returned bare; lists are wrapped (see below).
- Ids are opaque strings with a prefix that tells you the type. Always take them from a list or get call; never build or guess them.
On the wire the AI chatter (Hugo in the OnlyX app) is
ai and people on your team are team.
Pagination
List endpoints return one page at a time:limit (1 to 100 unless the page says otherwise, default 25) and, for the next page, cursor set to the previous nextCursor. Stop when hasMore is false. Cursors are opaque and tamper-evident: an edited cursor is 400 VALIDATION_ERROR. Message history pages backwards with before instead. Details and loops in Python and JavaScript: Pagination.
Errors
Every error has the same shape, with an HTTP status that matches the kind of problem:code, never on message. An id from another workspace, or one your credential may not see, gets exactly the same 404 as an id that does not exist. Every operation page lists the errors it can return; the full list of codes with fixes is in Errors.
Rate limits
Every credential may make 120 requests per 60 seconds. Some operations add a tighter limit of their own, counted on top of the general one. Each operation page states its limits under Rate limit (the OpenAPI document carries them asx-rate-limits); here they are in one place:
Every response reports the tightest limit it counted against:
Over a limit you get
429 RATE_LIMITED with a Retry-After header in seconds. The full table and a backoff example: Rate limits.
Idempotency
Send anIdempotency-Key header (8 to 64 letters, digits, - or _; a UUID is ideal) on any POST, PUT, PATCH or DELETE. If the request times out or fails with a 5xx, retry with the same key: OnlyX returns the stored response, marked Idempotent-Replayed: true, and does nothing twice. The key is required when sending a message (POST /v1/conversations/{conversationId}/messages), adding a creator (POST /v1/creators) and creating a tracking link (POST /v1/creators/{creatorId}/tracking-links); without it they answer 400 IDEMPOTENCY_KEY_REQUIRED. Keys are kept for 24 hours. Every write’s page lists the header (required or optional). Details: Idempotency.
Operations that reach fans
Some operations reach a real fan or change the creator’s live OnlyFans account: sending a message, releasing a conversation to the AI, switching the AI on for a conversation or a creator, resolving a hand-off, changing AI settings, replacing the welcome message and creating a tracking link. Their pages say so under Reaches fans, and the OpenAPI document marks them withx-reaches-fans: true. When an automation or an AI assistant is about to call one, show a person exactly what will happen and get a clear yes first.
Request ids
Every response carries anX-Request-Id header, and every error body repeats it as requestId. Send your own X-Request-Id (8 to 64 letters, digits or -) to tie OnlyX’s answer to your own logs; otherwise OnlyX creates one. Quote it when you contact support.
The OpenAPI document
This reference is generated from an OpenAPI 3.1 document. At launch the API serves it, without authentication, atGET https://api.onlyx.ai/v1/openapi.json. Use it to generate a client in your language, to import the API into Postman or Insomnia, or to hand an AI agent the exact contract.