Skip to content

Revenue

The OnlyFans Earnings API for revenue, payouts and transactions

Get OnlyFans revenue into your own dashboards, payroll and accounting. Query earnings by category and date range, read payout and chargeback history, and sync every transaction with a cursor-paginated REST endpoint or a signed webhook.

earnings.ts
const account = client.for("123456789")

const [error, chart] = await account.request("GET /earnings/chart", {
  query: { startDate: "2026-01-01", endDate: "2026-03-31" },
})

if (!error) {
  console.log("Total", chart.total?.total)
  console.log("Tips", chart.tips?.total)
  console.log("Messages", chart.chat_messages?.total)
}

Earnings API

What's included

Earnings breakdown

Revenue chart by date range, split into subscriptions, tips, messages and more.

Payouts

Payout stats, payout history, current balance and pending amounts, plus chargebacks.

Transactions feed

GET /v1/revenue/transactions with gross, net, fee and VAT in cents, paginated by cursor, up to 1000 rows a page.

Push, not just pull

Every new or changed transaction can be POSTed to your webhook URL in the same shape as the REST rows.

Campaigns and referrals

Campaign lists and charts, and referral balances, for tracking what brings fans in.

Agency-wide in one call

batchUsers runs the same earnings request across every creator and returns results keyed by account.

FAQ

Frequently asked questions

Can I get OnlyFans earnings data through an API?

Yes. BetterFans Link exposes typed routes for the earnings chart by date range, payout stats and history, balances, chargebacks, referral balances and campaign performance. Each call is scoped to a creator account your key can act as. For a whole agency, batchUsers runs the same request across every creator in one call and returns the results keyed by account id.

How do I sync OnlyFans transactions into my own database?

Call GET /v1/revenue/transactions with your API key. It returns rows with gross, net, fee and VAT amounts in cents, ordered by when they were first seen or changed. Store the nextCursor value and pass it back on the next call to continue where you left off. When hasMore is false you are caught up, so a simple scheduled job keeps your ledger current.

Why can the same transaction appear twice?

A row is emitted again when its status or amounts change, or when it is deleted, for example after a refund or chargeback. Each row keeps the same id, so treat the latest row for an id as current and update your record rather than inserting a duplicate. This gives you an accurate ledger instead of a snapshot that silently goes stale.

Can transactions be pushed to my server instead of polled?

Yes. Agency owners and admins can set one webhook URL on the API Keys page. Every new or changed transaction for the agency is then POSTed as JSON with the type transaction.observed and the same fields as a REST row. Deliveries are signed with HMAC-SHA256 and carry a unique delivery id, so you can verify each one and discard repeats safely.

LET’S BUILD SOMETHING BETTER

Your next big idea starts with a connection.

Build the tools your team has been waiting for. We’ll handle the connection to OnlyFans.

Your ideas. Your interface. BetterFans Link underneath.