Fans
FansMetric dataList Fans
Your fans ranked by what they have spent, across the accounts you pick. Only people who actually paid show up — subscribers who never bought anything are not on this list. Filter by spend, number of purchases, or how recently they bought. Requires permission api_fans_list.
https://public-api.fansmetric.comAuthorization
defaultAuthorizationBearer <token>Send your FansMetric API key as a Bearer token in the Authorization header.
In: header
Request Body
application/jsonaccount_ids*arrayArray of OnlyFans numeric account IDs. Aggregates are summed across them, not returned per account. An ID you do not own returns 404.
sort_bystringOne of
total_spend(default),purchases_count,average_purchase,average_weekly_spend,last_purchase_at. Anything else returns 400 — there is no silent fallback.sort_dirstringascordesc(default), case-insensitive. Any other value returns 400.limitintegerDefault 25, min 1, max 100.
offsetintegerDefault 0.
total_spendobjectKeep fans whose lifetime spend falls in this range.
{ "min": number, "max": number }— either half may be omitted ornullto leave that side unbounded.purchases_countobjectSame
{min, max}shape, on the number of non-refunded purchases.average_purchaseobjectSame
{min, max}shape, ontotal_spend÷purchases_count.average_weekly_spendobjectSame
{min, max}shape. Fans active a week or less have anaverage_weekly_spendof 0, so aminabove 0 excludes them.last_purchase_within_daysintegerA whole number of days, not a range — keep only fans whose most recent purchase falls within this many days. Must be ≥ 1.
Response Fields
data.fans[].idstring | nullThe fan's OnlyFans numeric user ID. Pass it as
{fan_id}to every other fan route.nullonly if the fan's profile record has been purged while their transactions survive.data.fans[].namestring | nullOnlyFans display name.
data.fans[].usernamestring | nullOnlyFans username.
data.fans[].avatar_urlstring | nullAvatar URL.
data.fans[].total_spendnumberGross lifetime spend across the named accounts. Gross, not net — this is what the fan paid, not what the creator received.
data.fans[].average_purchasenumbertotal_spend÷purchases_count.data.fans[].average_weekly_spendnumber7 × total_spend ÷ (days_active + 1), and 0 for any fan active 7 days or fewer — a single large purchase would otherwise project an implausible weekly rate.data.fans[].days_activenumberDays between the fan's first and last transaction. 0 for a fan with a single purchase.
data.fans[].purchases_countintegerNumber of non-refunded transactions.
data.fans[].last_purchase_atstring | nullMost recent transaction timestamp (RFC 3339, UTC).
_pagination.next_pagestring | nullThe
offsetto send for the next page. Absent when this is 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.fans[].id | string | null | The fan's OnlyFans numeric user ID. Pass it as {fan_id} to every other fan route. null only if the fan's profile record has been purged while their transactions survive. |
| data.fans[].name | string | null | OnlyFans display name. |
| data.fans[].username | string | null | OnlyFans username. |
| data.fans[].avatar_url | string | null | Avatar URL. |
| data.fans[].total_spend | number | Gross lifetime spend across the named accounts. Gross, not net — this is what the fan paid, not what the creator received. |
| data.fans[].average_purchase | number | total_spend ÷ purchases_count. |
| data.fans[].average_weekly_spend | number | 7 × total_spend ÷ (days_active + 1), and 0 for any fan active 7 days or fewer — a single large purchase would otherwise project an implausible weekly rate. |
| data.fans[].days_active | number | Days between the fan's first and last transaction. 0 for a fan with a single purchase. |
| data.fans[].purchases_count | integer | Number of non-refunded transactions. |
| data.fans[].last_purchase_at | string | null | Most recent transaction timestamp (RFC 3339, UTC). |
| _pagination.next_page | string | null | The offset to send for the next page. Absent when this is 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" \
--header "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"account_ids": ["100000001"],
"sort_by": "total_spend",
"sort_dir": "desc",
"limit": 25,
"offset": 0,
"total_spend": { "min": 100, "max": null },
"last_purchase_within_days": 30
}'Response
200