OnlyFans API
FanvueInsights

List Earnings

List the creator's transactions over a date range, each with the fan who paid, so revenue can be reconciled row by row. Proxies Fanvue's GET /v1/insights/earnings.

Money is in USD cents. gross is pre-fee, net is the creator's cut after Fanvue's fees, and currency only records what the fan originally paid in: both amounts are already converted. Refunds and chargebacks come back as their own rows with negative amounts and a reversedTransactionOrderId pointing at the transaction they reverse, so the original row is never rewritten.

user is null on rows no fan paid for, which is the normal case for referral, affiliate and giveaway.

GET
/api/fanvue/{fanvueAccount}/insights/earnings
AuthorizationBearer <token>

Get your API Key from OnlyFansAPI Console - https://app.onlyfansapi.com/api-keys

In: header

Path Parameters

fanvueAccount*string

The Fanvue Account ID

Query Parameters

cursor?string

Opaque pagination cursor from a previous response's nextCursor.

size?integer

Number of transactions to return (1 - 50). Default = 20

startDate?string

Only include transactions on or after this ISO 8601 datetime.

endDate?string

Only include transactions before this ISO 8601 datetime (non-inclusive).

source?array<string>

Restrict to these earning sources: all, affiliate, appStore, checkoutLink, fanExperience, mediaLink, message, post, referral, renewal, subscription, tip, giveaway, refund, chargeback. Default = all. Note that every recurring charge after the first bills as renewal, whether it started as a subscription, a checkout link or a fan experience; an app store charge is the one exception and stays appStore.

transactionOrderIds?array<string>

Return only these transaction order ids (max 100), to re-check known transactions for a status change. Combines with the other filters and still paginates.

Response Body

application/json

curl -X GET "https://app.onlyfansapi.com/api/fanvue/fanvue_acct_XXXXXXXXXXXXXXX/insights/earnings?cursor=eyJ2IjoxfQ&size=20&startDate=2026-01-01T00%3A00%3A00Z&endDate=2026-09-01T00%3A00%3A00Z&source=tip%2Cmessage&transactionOrderIds=FV-ORDER-123"
{
  "data": {
    "data": [
      {
        "date": "2026-09-22T10:29:07.224Z",
        "gross": 399,
        "net": 339,
        "currency": null,
        "source": "subscription",
        "transactionOrderId": "FVE-20260922-41280",
        "transactionOrderStatus": "pendingBalance",
        "user": {
          "uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
          "handle": "sarah-jones",
          "displayName": "Sarah Jones",
          "nickname": null,
          "isTopSpender": false
        }
      },
      {
        "date": "2026-09-21T14:02:55.118Z",
        "gross": -399,
        "net": -339,
        "currency": null,
        "source": "refund",
        "transactionOrderId": "FVE-20260921-40118",
        "transactionOrderStatus": "availableForPayout",
        "reversedTransactionOrderId": "FVE-20260921-40117",
        "user": {
          "uuid": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
          "handle": "mike-smith",
          "displayName": "Mike Smith",
          "nickname": null,
          "isTopSpender": false
        }
      }
    ],
    "nextCursor": null
  },
  "_meta": {
    "_credits": {
      "used": 1,
      "balance": 10055811,
      "note": "Always"
    },
    "_cache": {
      "is_cached": false,
      "note": "Cache disabled for this endpoint"
    },
    "_rate_limits": {
      "limit_minute": 5000,
      "limit_day": null,
      "remaining_minute": 4999,
      "remaining_day": null,
      "notice": "We have decided to remove our daily rate limits. Please remove any references to these in your integrations."
    }
  }
}