Posts

List Posts

Returns the creator's own post feed — the same list the Posts tab shows inside OnlyFans. Filter by media type, label, caption text and pinned state, and sort by publish date, likes or tips. This feed pages by cursor rather than page number, so walk it by following _pagination.next_page instead of building a numbered pager. Requires permission api_posts_list.

https://public-api.fansmetric.com
GET/v1/{account_id}/posts
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.

Query Parameters

  • limitinteger

    Page size. Default 10. Min 1, max 100 (anything higher is clamped to 100).

  • media_typestring

    Only return posts that carry a media type: photos, videos, audios, or medias (any of the three). Omit to include text-only posts.

  • labelstring

    Only posts carrying this label. Takes a numeric label ID from List Post Labels, or an archive bucket name: archived for the Archive, private_archived for the Private Archive.

  • exclude_labelstring

    The inverse of label — leave out posts carrying it. Accepts the same values.

  • querystring

    Free-text search across post captions.

  • pinnedboolean

    true returns only pinned posts, false returns everything except them. Omit for the whole feed.

  • orderstring

    Sort order. One of publish_date_desc (default), publish_date_asc, favorites_count_desc, tips_summ_desc, tips_summ_asc. Any other value returns 400 rather than quietly falling back.

  • countersboolean

    Include the counters block of account totals — useful for tab badges. Default true; send false to skip it.

  • before_publish_timestring

    Cursor for continuing a descending feed. Pass the previous page's tailMarker. _pagination.next_page fills this in for you.

  • after_publish_timestring

    Cursor for continuing an ascending feed. Pass the previous page's tailMarker. _pagination.next_page fills this in for you.

Response Fields

  • data.list[]array

    The posts on this page.

  • data.list[].idinteger

    OnlyFans post ID. Use it for every other Posts route.

  • data.list[].postedAtstring

    ISO timestamp the post was published — the one to show in a UI.

  • data.list[].postedAtPrecisestring

    The same publish time as a fractional epoch string. This is what tailMarker reports and what the two cursor parameters take.

  • data.list[].textstring

    Caption as HTML.

  • data.list[].rawTextstring

    Caption as plain text — the safer field for list rows and search indexes.

  • data.list[].authorobject

    Short author reference (id, _view). Always the account you queried; OnlyFans leaves out the full user object here because every row would repeat it.

  • data.list[].mediaCountinteger

    How many media items are attached.

  • data.list[].media[]array

    Attached media. Each item carries a files object with full, thumb, preview and squarePreview URLs.

  • data.list[].tipsAmountstring

    Tip total for the post, pre-formatted for display, e.g. $0.

  • data.hasMoreboolean

    Whether another page exists.

  • data.tailMarkerstring

    Publish time of the last row on this page — the value that seeds the next page's cursor.

  • data.headMarkerstring

    Publish time of the first row on this page.

  • data.countersobject

    Account totals: postsCount, photosCount, videosCount, audiosCount, mediasCount, streamsCount, archivedPostsCount, privateArchivedPostsCount. Present only when counters is true.

  • 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/posts?limit=20&media_type=sample_media_type&label=sample_label" \
  --header "Authorization: Bearer YOUR_API_KEY"

Response

200
{
"data":{
"list":[
0:{
"author":{
"id":12345678
"_view":"a"
}
"responseType":"post"
"id":2678855749
"postedAt":"2026-08-16T16:33:27+00:00"
"postedAtPrecise":"1786898007.000000"
"text":"<p>behind the scenes from today's shoot 💖</p>"
"rawText":"behind the scenes from today's shoot 💖"
"canDelete":true
"canComment":true
"canEdit":true
"mediaCount":1
"isMediaReady":true
"canToggleFavorite":true
"tipsAmount":"$0"
"canViewMedia":true
"media":[
0:{
"id":987654321
"type":"photo"
"canView":true
"isReady":true
"duration":0
"files":{
"full":{
"url":"https://public-api.fansmetric.com/media-proxy?url=...&exp=...&sig=..."
}
"thumb":{
"url":"https://public-api.fansmetric.com/media-proxy?url=...&exp=...&sig=..."
}
"preview":{
"url":"https://public-api.fansmetric.com/media-proxy?url=...&exp=...&sig=..."
}
"squarePreview":{
"url":"https://public-api.fansmetric.com/media-proxy?url=...&exp=...&sig=..."
}
}
}
]
}
]
"hasMore":true
"headMarker":"1786898007.000000"
"tailMarker":"1786872300.000000"
"counters":{
"audiosCount":0
"photosCount":278
"videosCount":18
"mediasCount":296
"postsCount":279
"streamsCount":0
"archivedPostsCount":1
"privateArchivedPostsCount":77
}
}
"_pagination":{
"next_page":"/v1/12345678/posts?limit=10&order=publish_date_desc&before_publish_time=1786872300.000000"
}
"_meta":{
"_credits":{
"used":1
}
"_rate_limits":{
"limit_minute":1000
"remaining_minute":999
"limit_day":50000
"remaining_day":49999
}
}
}