List Active Fans
Get a paginated list of fans for an Account. Newest fans are first. Paginate by following _pagination.next_page until it is null (data.hasMore is the authoritative flag). Do NOT use the page's item count to detect the last page — OnlyFans occasionally returns fewer than limit items (e.g. 19 for limit=20) on a non-final page because it filters entries server-side; no fans are skipped. To track progress, GET /{account}/me returns data.subscribersCount (the current active-subscriber count) as a total.
Supports filter[max_total_spent] (e.g. filter[max_total_spent]=0 for fans who have never spent), which OnlyFans itself cannot do. Those requests are answered from OnlyFansAPI's own fan index rather than proxied, so the page is limited to fans we have already indexed for this account — see data._source in the response.
Authorization
default Get your API Key from OnlyFansAPI Console - https://app.onlyfansapi.com/api-keys
In: header
Path Parameters
The Account ID
Query Parameters
Number of fans to return (1-20). OnlyFans does not allow more than 20 per page. Must be at least 1. Must not be greater than 20.
Number of fans to skip. Must be at least 0.
Filter by fan type.
"active" | "expired" | "all"Filter by specific fields.
Filter by online status (1 for online fans). Must use bracket syntax: filter[online]=1 — the dot form (filter.online=1) is rejected with a 422, because PHP rewrites it to filter_online and the filter could not be applied.
1 | 0Filter by minimum amount total spent by a fan. Must use bracket syntax: filter[total_spent]=100 — the dot form (filter.total_spent=100) is rejected with a 422, because PHP rewrites it to filter_total_spent and the filter could not be applied. Must be at least 0.
Filter by minimum tips. Must use bracket syntax: filter[tips]=100 — the dot form (filter.tips=100) is rejected with a 422, because PHP rewrites it to filter_tips and the filter could not be applied. Must be at least 0.
Filter by minimum subscription duration in months. Must use bracket syntax: filter[duration]=1 — the dot form (filter.duration=1) is rejected with a 422, because PHP rewrites it to filter_duration and the filter could not be applied. Must be at least 0.
Filter by maximum amount total spent by a fan — use filter[max_total_spent]=0 to isolate fans who have never spent. Combine with filter[total_spent] for a range. Must use bracket syntax: filter[max_total_spent]=0 — the dot form is rejected with a 422, because PHP rewrites it to filter_max_total_spent and the filter could not be applied.
OnlyFans itself has no maximum-spend filter, so this one is resolved against OnlyFansAPI's own fan index instead of being proxied. The fan objects in data.list are still fetched live from OnlyFans and are re-checked against your filters before being returned, but only fans we have already indexed for this account can appear. Each response reports its own coverage under data._source; when data._source.is_complete is false a full-base backfill is queued automatically, so retry later for a complete answer.
data._source.omitted_from_page counts fans that matched your filters but which OnlyFans returned no usable data for on that page (a deleted account, or a partial response). They are left out of data.list and not revisited later in the same walk, so a non-zero value means that page was short — start a fresh walk to retry them. Cannot be combined with filter[online]. Must be at least 0.
Search within fan name/username.
Response Body
application/json
curl -X GET "https://app.onlyfansapi.com/api/acct_XXXXXXXXXXXXXXX/fans/active?limit=20&offset=0"{
"data": {
"list": [
{
"view": "x",
"avatar": "https://public.onlyfans.com/files/l/la/lal/.../123/avatar.jpg",
"avatarThumbs": {
"c50": "https://thumbs.onlyfans.com/public/files/thumbs/c50/l/la/lal/.../123/avatar.jpg",
"c144": "https://thumbs.onlyfans.com/public/files/thumbs/c144/l/la/lal/.../123/avatar.jpg"
},
"header": null,
"headerSize": null,
"headerThumbs": null,
"id": 123,
"name": "name",
"username": "username",
"canLookStory": false,
"canCommentStory": false,
"hasNotViewedStory": false,
"isVerified": true,
"canPayInternal": true,
"hasScheduledStream": false,
"hasStream": false,
"hasStories": false,
"tipsEnabled": false,
"tipsTextEnabled": true,
"tipsMin": 5,
"tipsMinInternal": 1,
"tipsMax": 200,
"canEarn": true,
"canAddSubscriber": true,
"subscribePrice": 4.99,
"subscriptionBundles": [],
"displayName": "",
"notice": "",
"isPaywallRequired": true,
"isRestricted": false,
"canRestrict": true,
"subscribedBy": false,
"subscribedByExpire": null,
"subscribedByExpireDate": null,
"subscribedByAutoprolong": null,
"subscribedIsExpiredNow": null,
"currentSubscribePrice": null,
"subscribedOn": true,
"subscribedOnExpiredNow": false,
"subscribedOnDuration": "6 days",
"listsStates": [
{
"id": "following",
"type": "following",
"name": "Following",
"hasUser": false,
"canAddUser": false,
"cannotAddUserReason": "SYSTEM_LIST"
},
{
"id": "fans",
"type": "fans",
"name": "Fans",
"hasUser": true,
"canAddUser": false,
"cannotAddUserReason": "ALREADY_EXISTS"
},
{
"id": "recent",
"type": "recent",
"name": "Recent (last 24 hours)",
"hasUser": false,
"canAddUser": false,
"cannotAddUserReason": "SYSTEM_LIST"
},
{
"id": "tagged",
"type": "tagged",
"name": "Tagged",
"hasUser": false,
"canAddUser": false,
"cannotAddUserReason": "SYSTEM_LIST"
},
{
"id": "friends",
"type": "friends",
"name": "Friends",
"hasUser": false,
"canAddUser": true,
"cannotAddUserReason": null
},
{
"id": "muted",
"type": "muted",
"name": "Muted",
"hasUser": false,
"canAddUser": true,
"cannotAddUserReason": null
}
],
"canReport": false,
"canReceiveChatMessage": true,
"hideChat": false,
"lastSeen": "2025-01-01T00:00:00+00:00",
"isPerformer": true,
"isRealPerformer": true,
"subscribedByData": null,
"subscribedOnData": {
"price": 0,
"newPrice": 0,
"regularPrice": 0,
"subscribePrice": 0,
"discountPercent": 0,
"discountPeriod": 1,
"subscribeAt": "2025-01-01T00:00:00+00:00",
"expiredAt": "2025-01-01T00:00:00+00:00",
"renewedAt": null,
"discountFinishedAt": null,
"discountStartedAt": null,
"status": "Set to Expire",
"isMuted": false,
"unsubscribeReason": "No reason given",
"duration": "6 days",
"tipsSumm": 0,
"subscribesSumm": 0,
"messagesSumm": 0,
"postsSumm": 0,
"streamsSumm": 0,
"totalSumm": 0,
"lastActivity": "2025-01-01T00:00:00+00:00",
"recommendations": 0,
"subscribes": [
{
"id": 123,
"userId": 123,
"subscriberId": 123,
"date": "2025-01-01T00:00:00+00:00",
"duration": 7,
"startDate": "2025-01-01T00:00:00+00:00",
"expireDate": "2025-01-01T00:00:00+00:00",
"cancelDate": null,
"price": 0,
"regularPrice": 4.99,
"discount": 0,
"earningId": 0,
"action": "subscribe",
"type": "trial",
"offerStart": "2025-01-01T00:00:00+00:00",
"offerEnd": "2025-01-01T00:00:00+00:00",
"isCurrent": true
}
],
"hasActivePaidSubscriptions": false
},
"canTrialSend": false,
"isBlocked": false,
"promoOffers": [
{
"id": 123,
"subscribeDays": 7,
"createdAt": "2025-01-01T00:00:00+00:00",
"expiredAt": "2025-01-01T00:00:00+00:00",
"finishedAt": "2025-01-01T00:00:00+00:00",
"subscriberId": "123",
"userId": "123"
}
]
}
],
"hasMore": false
},
"_pagination": {
"next_page": null
},
"_meta": {
"_credits": {
"used": 1,
"balance": 999999840,
"note": "Always"
},
"_cache": {
"is_cached": false,
"note": "Cache disabled for this endpoint"
},
"_rate_limits": {
"limit_minute": 10000000,
"limit_day": 50000,
"remaining_minute": 9999999,
"remaining_day": 49998
}
}
}