All reports take an optional
creatorId. Without it they cover every creator the key can see. A creatorId you cannot see returns 404 CREATOR_NOT_FOUND.
The examples below show each report’s shape, abridged. The API reference lists every field, generated from the live API.
Windows and timezone
Reports that cover a period take either:days: the last N days including today, 1 to 366 (default 30); orstartandend: local dates asYYYY-MM-DD, both included.
start/end wins over days. The window never extends past today, and a window longer than 366 days keeps its most recent 366 days.
Days are counted in your workspace timezone (see GET /v1/me), so “today” and each day in a daily series start at local midnight. Money is always integer US cents: netCents is what the creator earns after OnlyFans’ fee, grossCents what fans paid.
The /v1/stats endpoints share a limit of 20 requests per 60 seconds per credential, on top of the general limit. Cache reports on your side; they do not change second by second.
Today
GET /v1/stats/today gives today so far, from local midnight in the workspace timezone: earnings (settled and still clearing), new fans, buyers, paid messages unlocked, message volume and how much of it the AI wrote. It also returns all of yesterday (yesterday) and yesterday up to the same time of day (yesterdaySameTime), the fair comparison for a day still in progress. The figures are cached for a minute or two, so polling faster does not make them fresher.
Response 200
messages.out counts only messages OnlyFans confirmed as delivered; ai and team split it (messages you send through the API count as team). aiShare is null until something was sent today. earnings.complete: false means some creator’s earnings could not be read in full just now, so the figures are a lower bound; ask again in a few minutes.
Revenue
GET /v1/stats/revenue returns earnings for the window: totals (net after OnlyFans’ fee, gross, the fee, settled versus still clearing, refunds), a split by what was paid for (byType), one entry per day (byDay, including days with no earnings), one per creator (byCreator), paid-message sales by seller (bySeller: ai, the sales the AI made, versus team, the sales your people made), and the current OnlyFans balance.
Response 200 (abridged: byDay shortened)
byType[].typeissubscription,ppv(paid messages),tip,post,streamorother; more values may be added. Refunded sales are left out ofnetCentsand reported inrefundedNetCents.bySellercovers paid messages sent in chats that fans unlocked in the window, split by who sent them. Subscriptions and tips have no seller.unattributedNetCentsis paid-message income no chat sender accounts for, such as mass messages or unlocks of messages sent more than 30 days earlier.complete: falsemeans some creator’s ledger could not be read in full, so the totals are a lower bound.coverageFromis the oldest day the ledger has been read back to; earlier days may be missing.balanceis what OnlyFans shows right now as available to withdraw and still held, across the creators in the report. It is not limited to the window.
Audience
GET /v1/stats/audience summarizes fans: how many are active, expired or not yet reported by OnlyFans, auto-renew among active fans, how they spread over lifetime-spend bands, how many wrote in the last 7, 30 and 90 days, and week-over-week retention of fans who write. It is cached for several minutes.
cURL
Response 200
fans.unknown counts fans whose subscription state OnlyFans has not reported yet. retention.rate is retainedFans / previousFans (of the fans who wrote in one week, how many wrote again the next), or null when nobody wrote in the earlier week.
For lists of the actual fans in a group, use GET /v1/fans with a segment.
Overview: the cached report
GET /v1/stats/overview is the dashboard’s full activity report for a window: conversations, messages in and out, AI versus team, reply times, new fans, and more. It is expensive to compute, so the API never computes it while you wait:
- If a copy is cached (at most about five minutes old; see
generatedAt), you get200with the report. - If not, you get
202with{"status": "warming", "retryAfterSeconds": N}and aRetry-Afterheader, and OnlyX prepares it in the background. Ask again after that many seconds.
Retry-After.
Response 202
REPORT_WARMING is the name of this 202 answer in the error reference. It is not a failure.
Response 200 (abridged: one entry shown in each series)
inbox and fans.total describe the inbox and fan base right now; everything else covers the window. replyTime.slowReplies counts answers that took longer than 5 minutes.
Transactions
GET /v1/creators/{creatorId}/transactions (scope money:read) is one creator’s earnings ledger, newest first, paged with limit (1 to 100, default 25) and cursor. It is the copy OnlyX keeps while the creator is connected, so the call never reaches OnlyFans; a creator with no connected account returns an empty list. New sales arriving between pages can shift entries by a position. This endpoint is not under /v1/stats, so the stats limit does not apply to it.
Response 200
The ledger is read from OnlyFans continuously while the creator is connected.
stats.revenueKnown on the Creator is false until it has been read once; until then, treat revenue as unknown rather than zero.
Recipe: a daily digest
Every morning, for each creator: yesterday’s revenue (start = end = yesterday), open hand-offs, and unread chats.
Python
daily_briefing and weekly_revenue_report MCP prompts do it for you. See Using OnlyX with Claude.
Related
- Creators: headline
statson every creator. - Rate limits: the stats limit and
Retry-After. - Fans: lists of fans behind the audience numbers.