Fans
FansMetric dataGet Fan Transactions
Every purchase one fan has made across the accounts you name, newest first, each with what the fan paid and what the creator kept. Refunds and chargebacks are included here, unlike the spend totals elsewhere, so a reversal shows up next to the charge it cancels. Requires permission api_fans_read_transactions.
https://public-api.fansmetric.comAuthorization
defaultAuthorizationBearer <token>Send your FansMetric API key as a Bearer token in the Authorization header.
In: header
Path Parameters
fan_id*integerThe fan's OnlyFans numeric user ID.
Request Body
application/jsonaccount_ids*arrayArray of OnlyFans numeric account IDs.
limitintegerDefault 25, min 1, max 100.
offsetintegerDefault 0.
categoriesarrayKeep only these transaction kinds. Any of
tip,message,recurring_subscription,new_subscription,unlock,unknown. Absent or[]means every category. An unrecognised value returns 400 listing the allowed set — it never silently matches nothing.statusesarrayKeep only these statuses. Any of
done,undo,pending_return,loading. Absent or[]means every status, chargebacks included. An unrecognised value returns 400.fromstringWindow start, inclusive.
YYYY-MM-DD,YYYY-MM-DD HH:MM:SS, RFC 3339,now, or a relative shorthand like-30days. Absent means no lower bound.tostringWindow end, inclusive. Same formats. Absent means no upper bound. Sending
fromlater thantoreturns 400.
Response Fields
data.transactions[].idstringOnlyFans' own transaction ID — the same one OnlyFans shows for this charge.
data.transactions[].transaction_created_atstring | nullWhen the transaction occurred (RFC 3339, UTC).
data.transactions[].account_idstringOnlyFans numeric account ID the transaction belongs to — one of the
account_idsyou sent.data.transactions[].account_namestringThat account's OnlyFans username.
data.transactions[].amountnumber | nullGross — what the fan paid. This is the figure List Fans and Get Fan Stats total up, so summing it reproduces
total_spend.nullon older rows imported without the breakdown.data.transactions[].feenumber | nullOnlyFans' cut.
nullwhere unknown.data.transactions[].vat_amountnumber | nullVAT collected on the sale.
nullwhere unknown.data.transactions[].netnumberWhat the creator received —
amountlessfeeandvat_amount. Always present, even where the breakdown is not.data.transactions[].currencystring | nullCurrency the amounts are in, as OnlyFans reported it.
nullon rows that predate the field.data.transactions[].categorystring | nullTransaction kind — one of
tip,message,recurring_subscription,new_subscription,unlock,unknown.nullis possible on legacy rows and is treated asunknownby thecategoriesfilter.data.transactions[].statusstringdone(settled),undo(refund or chargeback),pending_return(reversal in progress), orloading(still processing), as reported by OnlyFans._pagination.next_pagestring | nullThe
offsetfor the next page. Absent on the last page.dataobject | arrayEndpoint-specific payload. See the fields below for this route.
_meta._credits.usedintegerCredits consumed by this request (currently always
1)._meta._rate_limits.limit_minuteintegerMaximum requests per minute for the organization.
_meta._rate_limits.remaining_minuteintegerRemaining requests in the current minute window.
_meta._rate_limits.limit_dayintegerMaximum requests per day for the organization.
_meta._rate_limits.remaining_dayintegerRemaining requests in the current day window.
| Field | Type | Description |
|---|---|---|
| data.transactions[].id | string | OnlyFans' own transaction ID — the same one OnlyFans shows for this charge. |
| data.transactions[].transaction_created_at | string | null | When the transaction occurred (RFC 3339, UTC). |
| data.transactions[].account_id | string | OnlyFans numeric account ID the transaction belongs to — one of the account_ids you sent. |
| data.transactions[].account_name | string | That account's OnlyFans username. |
| data.transactions[].amount | number | null | Gross — what the fan paid. This is the figure List Fans and Get Fan Stats total up, so summing it reproduces total_spend. null on older rows imported without the breakdown. |
| data.transactions[].fee | number | null | OnlyFans' cut. null where unknown. |
| data.transactions[].vat_amount | number | null | VAT collected on the sale. null where unknown. |
| data.transactions[].net | number | What the creator received — amount less fee and vat_amount. Always present, even where the breakdown is not. |
| data.transactions[].currency | string | null | Currency the amounts are in, as OnlyFans reported it. null on rows that predate the field. |
| data.transactions[].category | string | null | Transaction kind — one of tip, message, recurring_subscription, new_subscription, unlock, unknown. null is possible on legacy rows and is treated as unknown by the categories filter. |
| data.transactions[].status | string | done (settled), undo (refund or chargeback), pending_return (reversal in progress), or loading (still processing), as reported by OnlyFans. |
| _pagination.next_page | string | null | The offset for the next page. Absent on the last page. |
| data | object | array | Endpoint-specific payload. See the fields below for this route. |
| _meta._credits.used | integer | Credits consumed by this request (currently always 1). |
| _meta._rate_limits.limit_minute | integer | Maximum requests per minute for the organization. |
| _meta._rate_limits.remaining_minute | integer | Remaining requests in the current minute window. |
| _meta._rate_limits.limit_day | integer | Maximum requests per day for the organization. |
| _meta._rate_limits.remaining_day | integer | Remaining requests in the current day window. |
curl --request POST "https://public-api.fansmetric.com/v1/fans/XXXXX/transactions" \
--header "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"account_ids": ["100000001"],
"limit": 25,
"offset": 0,
"categories": ["message", "tip"],
"statuses": ["done"],
"from": "2026-01-01",
"to": "now"
}'Response
200