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.com
GET/v1/{account_id}/engagement/posts/{by}
Bearer

Authorization

default
AuthorizationBearer <token>

Send your FansMetric API key as a Bearer token in the Authorization header.

In: header

Path Parameters

  • account_id*integer

    OnlyFans numeric account ID.

  • by*string

    Ranking metric. One of comments, likes, views, tips, purchases.

Query Parameters

  • start_datestring

    Window start. Default 2 years ago, UTC.

  • end_datestring

    Window end. Default end of today, UTC.

  • offsetinteger

    Rows to skip. Page size is fixed at 10.

Response Fields

  • 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[].idinteger

    OnlyFans post ID.

  • data.items[].postedAtstring

    ISO 8601 publish time.

  • data.items[].textstring

    HTML post body.

  • data.items[].rawTextstring

    Plain-text post body.

  • data.items[].mediaCountinteger

    Number of media attachments.

  • data.items[].pricenumber

    Unlock price for PPV posts. Absent on free posts.

  • data.items[].isPinnedboolean

    true if pinned to the top of the feed.

  • data.items[].statsobject

    lookCount, uniqueLookCount, likeCount, commentCount, tipCount, tipSum, purchasedCount, purchasedSumm.

  • data.items[].mediaarray

    Media attachments: id, type, files.{full,thumb,preview,squarePreview}, duration, videoSources.{240,720} for videos.

  • data.hasMoreboolean

    Whether more pages are available.

  • dataobject | array

    Endpoint-specific payload. See the fields below for this route.

  • _pagination.next_pagestring

    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.usedinteger

    Credits consumed by this request (currently always 1).

  • _meta._rate_limits.limit_minuteinteger

    Maximum requests per minute for the organization.

  • _meta._rate_limits.remaining_minuteinteger

    Remaining requests in the current minute window.

  • _meta._rate_limits.limit_dayinteger

    Maximum requests per day for the organization.

  • _meta._rate_limits.remaining_dayinteger

    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
{
"data":{
"hasMore":true
"items":[
0:{
"id":2155691024
"postedAt":"2025-12-17T03:05:15+00:00"
"rawText":"New set out now"
"favoritesCount":666
"mediaCount":1
"isPinned":false
"stats":{
"lookCount":8810
"uniqueLookCount":4947
"likeCount":666
"commentCount":0
"tipCount":0
"tipSum":0
"purchasedCount":0
"purchasedSumm":0
}
"media":[]
}
]
}
"_pagination":{
"next_page":"/v1/100000001/engagement/posts/likes?start_date=2025-09-17%2004%3A23%3A50&end_date=2026-05-28%2013%3A22%3A18&offset=10"
}
"_meta":{
"_credits":{
"used":1
}
"_rate_limits":{
"limit_minute":1000
"remaining_minute":999
"limit_day":50000
"remaining_day":49999
}
}
}