Mass Messages

Mass Message Statistics

Returns mass message stats — sent count, viewed count, media, and PPV purchase counts per mass message. Paginate by following _pagination.next_page. Requires permission api_mass_messages_list.

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

    Number of items. Default 10. Min 1, max 100.

  • start_datestring

    Earliest mass message date (UTC). Default 2 years ago. Format YYYY-MM-DD HH:MM:SS; a bare RFC 3339 timestamp (2026-08-19T00:00:00) is also accepted, but a trailing UTC offset such as +00:00 is not — strip it. Hold this value fixed while paginating.

  • end_datestring

    Latest mass message date (UTC), exclusive. Default end of today. This doubles as the pagination cursor — prefer following _pagination.next_page over setting it by hand. Format YYYY-MM-DD HH:MM:SS.

Response Fields

  • data.items[]array

    Per-mass-message stat rows, newest first. Shape is determined by upstream OnlyFans and proxied as-is.

  • data.items[].idinteger

    Mass message ID.

  • data.items[].datestring

    Send time, RFC 3339 with offset (2026-09-18T06:32:28+00:00). This is the value behind the pagination cursor, but it is not directly reusable as end_date — convert it to 2026-09-18 06:32:28 first (drop the T and the +00:00), or just use _pagination.next_page, which is already converted.

  • data.items[].sentCountinteger

    Fans the message was delivered to.

  • data.items[].viewedCountinteger

    Fans who opened it.

  • data.items[].pricestring

    PPV price as a decimal string (e.g. "14.59"), not a number. Omitted entirely on free sends — check isFree before reading it.

  • data.items[].purchasedCountinteger

    Number of purchases of the PPV. Omitted on free sends.

  • data.items[].previewsarray

    Media IDs shown as the free preview on a PPV send. Empty array on free sends.

  • data.items[].media[]array

    Attached media: id, type (photo or video), duration, videoSources, and files.{full,thumb,preview,squarePreview} with signed FansMetric URLs.

  • data.items[].mediaCountinteger

    Number of attachments.

  • data.items[].isFreeboolean

    Whether the send carried no PPV price.

  • data.items[].isCanceledboolean

    Whether the send was cancelled before completing.

  • data.items[].templatestring

    Message kind — group for mass messages.

  • data.items[].canUnsendboolean

    Whether the message is still inside its unsend window.

  • data.items[].unsendSecondsinteger

    Seconds remaining in the unsend window.

  • data.hasMoreboolean

    Whether another page exists. Stop paginating when this is false.

  • 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/mass-messages?limit=20&start_date=2026-01-01%2000%3A00%3A00&end_date=2026-01-31%2023%3A59%3A59" \
  --header "Authorization: Bearer YOUR_API_KEY"

Response

200
{
"data":{
"hasMore":true
"items":[
0:{
"id":47038188668
"date":"2026-09-18T06:32:28+00:00"
"responseType":"message"
"text":"New set just dropped 💕"
"rawText":"New set just dropped 💕"
"giphyId":null
"isFree":false
"isTip":false
"isCanceled":false
"isReportedByMe":false
"isMediaReady":true
"mediaCount":2
"media":[
0:{
"id":4066950154
"type":"photo"
"convertedToVideo":false
"canView":true
"hasError":false
"hasCustomPreview":false
"createdAt":"2026-09-17T08:08:07+00:00"
"isReady":true
"duration":0
"files":{
"full":{
"url":"https://media.fansmetric.com/…"
"width":2632
"height":3519
"size":0
"sources":[]
}
"thumb":{
"url":"https://media.fansmetric.com/…"
"width":300
"height":300
"size":0
}
"preview":{
"url":"https://media.fansmetric.com/…"
"width":960
"height":1284
"size":0
}
"squarePreview":{
"url":"https://media.fansmetric.com/…"
"width":960
"height":960
"size":0
}
}
"videoSources":{
"240":null
"720":null
}
}
]
"previews":[
0:4066950154
]
"price":"14.59"
"purchasedCount":18
"canSendMessageToBuyers":true
"sentCount":157066
"viewedCount":3337
"template":"group"
"canUnsend":false
"unsendSeconds":0
}
]
}
"_pagination":{
"next_page":"/v1/100000001/mass-messages?start_date=2026-08-19+00%3A00%3A00&end_date=2026-09-18+06%3A32%3A28&limit=10"
}
"_meta":{
"_credits":{
"used":1
}
"_rate_limits":{
"limit_minute":1000
"remaining_minute":999
"limit_day":50000
"remaining_day":49999
}
}
}