Engagement
List Top Posts by Engagement
Returns a paginated leaderboard of top-performing posts ranked by a single engagement metric. Unlike /highlights/post (one top post per metric, no pagination), this returns the full ranked list for one metric. Requires permission api_engagement_list_posts.
https://public-api.fansmetric.comAuthorization
defaultAuthorizationBearer <token>Send your FansMetric API key as a Bearer token in the Authorization header.
In: header
Path Parameters
account_id*integerOnlyFans numeric account ID.
by*stringRanking metric. One of
comments,likes,views,tips,purchases.
Query Parameters
start_datestringWindow start. Default 2 years ago, UTC.
end_datestringWindow end. Default end of today, UTC.
offsetintegerRows to skip. Page size is fixed at 10.
Response Fields
data.items[]arrayPost objects in this page, ranked by
{by}(descending). Note the key isitems— notlist— and is passed through verbatim from OnlyFans.data.items[].idintegerOnlyFans post ID.
data.items[].postedAtstringISO 8601 publish time.
data.items[].textstringHTML post body.
data.items[].rawTextstringPlain-text post body.
data.items[].mediaCountintegerNumber of media attachments.
data.items[].pricenumberUnlock price for PPV posts. Absent on free posts.
data.items[].isPinnedbooleantrueif pinned to the top of the feed.data.items[].statsobjectlookCount,uniqueLookCount,likeCount,commentCount,tipCount,tipSum,purchasedCount,purchasedSumm.data.items[].mediaarrayMedia attachments:
id,type,files.{full,thumb,preview,squarePreview},duration,videoSources.{240,720}for videos.data.hasMorebooleanWhether more pages are available.
dataobject | arrayEndpoint-specific payload. See the fields below for this route.
_pagination.next_pagestringRelative URL for the next page, with the cursor or offset already applied. Append it to the API base URL and send it as-is. Omitted entirely on the last page.
_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.items[] | array | Post objects in this page, ranked by {by} (descending). Note the key is items — not list — and is passed through verbatim from OnlyFans. |
| data.items[].id | integer | OnlyFans post ID. |
| data.items[].postedAt | string | ISO 8601 publish time. |
| data.items[].text | string | HTML post body. |
| data.items[].rawText | string | Plain-text post body. |
| data.items[].mediaCount | integer | Number of media attachments. |
| data.items[].price | number | Unlock price for PPV posts. Absent on free posts. |
| data.items[].isPinned | boolean | true if pinned to the top of the feed. |
| data.items[].stats | object | lookCount, uniqueLookCount, likeCount, commentCount, tipCount, tipSum, purchasedCount, purchasedSumm. |
| data.items[].media | array | Media attachments: id, type, files.{full,thumb,preview,squarePreview}, duration, videoSources.{240,720} for videos. |
| data.hasMore | boolean | Whether more pages are available. |
| data | object | array | Endpoint-specific payload. See the fields below for this route. |
| _pagination.next_page | string | Relative URL for the next page, with the cursor or offset already applied. Append it to the API base URL and send it as-is. Omitted entirely on the last page. |
| _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 GET "https://public-api.fansmetric.com/v1/100000001/engagement/posts/sample_by?start_date=2026-01-01%2000%3A00%3A00&end_date=2026-01-31%2023%3A59%3A59&offset=0" \
--header "Authorization: Bearer YOUR_API_KEY"Response
200