Chatters
Compare Chatters
Returns per-chatter time-series across 11 chat performance stats for up to 5 chatters over a single window. Powers side-by-side comparison charts — every user shares the same bucket axis so their series overlay directly. Requires permission api_chat_chatters_compare.
https://public-api.fansmetric.comAuthorization
defaultAuthorizationBearer <token>Send your FansMetric API key as a Bearer token in the Authorization header.
In: header
Request Body
application/jsonuser_ids*arrayArray of FansMetric user UUIDs from List Chatters. 1–5 per call — batch client-side if you need more.
account_ids*arrayArray of OnlyFans numeric account IDs (as strings). At least one. Every ID must belong to your org — unknown IDs return
404.fromstringWindow start (UTC). Default 30 days ago. Accepts ISO 8601 or relative shorthand (
-30days).tostringWindow end (UTC). Default now. Must be after
from.team_idsarrayArray of team UUIDs. When set, every
user_idsentry must also be a member of one of these teams — otherwise the call returns404.granularitystringBucket size —
hour,day,week, ormonth. Default derived from window length.
Response Fields
data.chatters[]arrayOne entry per requested user, sorted by name (not input order — index by
user_id).data.chatters[].user_idstringFansMetric user UUID.
data.chatters[].user_namestringDisplay name.
data.chatters[].metricsobjectKeyed by stat name. Keys:
tips_revenue,tips_count,unlocked_ppvs_revenue,unlocked_ppvs_count,all_messages_count,all_ppvs_count,fans_count,word_count,employee_sales,golden_ratio,unlock_ratio.data.chatters[].metrics.<stat>.chartLabelsarrayRFC 3339 UTC bucket-start timestamps. Shared axis across every user in the response.
data.chatters[].metrics.<stat>.chartValuesarrayPer-bucket values for this user + stat. Empty buckets are zero-filled.
data.chatters[].metrics.<stat>.statHumanstringHuman-readable label.
data.chatters[].metrics.<stat>.descriptionstringOne-line explanation of the stat.
data.chatters[].metrics.<stat>.symbolstring$,%, or empty.data.chatters[].metrics.<stat>.valueIsIntegerbooleanRender hint.
data.chatters[].metrics.<stat>.symbolFirstbooleanRender hint.
falsefor%stats.data.chatters[].metrics.<stat>.positiveIsGoodbooleanRender hint.
data.chatters[].metrics.<stat>.granularitystringBucket size for this series.
data.fromstringBucket-aligned window start (RFC 3339 UTC).
data.tostringBucket-aligned window end (RFC 3339 UTC).
data.granularitystringBucket size for the response.
dataobject | arrayEndpoint-specific payload. See the fields below for this route.
_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.chatters[] | array | One entry per requested user, sorted by name (not input order — index by user_id). |
| data.chatters[].user_id | string | FansMetric user UUID. |
| data.chatters[].user_name | string | Display name. |
| data.chatters[].metrics | object | Keyed by stat name. Keys: tips_revenue, tips_count, unlocked_ppvs_revenue, unlocked_ppvs_count, all_messages_count, all_ppvs_count, fans_count, word_count, employee_sales, golden_ratio, unlock_ratio. |
| data.chatters[].metrics.<stat>.chartLabels | array | RFC 3339 UTC bucket-start timestamps. Shared axis across every user in the response. |
| data.chatters[].metrics.<stat>.chartValues | array | Per-bucket values for this user + stat. Empty buckets are zero-filled. |
| data.chatters[].metrics.<stat>.statHuman | string | Human-readable label. |
| data.chatters[].metrics.<stat>.description | string | One-line explanation of the stat. |
| data.chatters[].metrics.<stat>.symbol | string | $, %, or empty. |
| data.chatters[].metrics.<stat>.valueIsInteger | boolean | Render hint. |
| data.chatters[].metrics.<stat>.symbolFirst | boolean | Render hint. false for % stats. |
| data.chatters[].metrics.<stat>.positiveIsGood | boolean | Render hint. |
| data.chatters[].metrics.<stat>.granularity | string | Bucket size for this series. |
| data.from | string | Bucket-aligned window start (RFC 3339 UTC). |
| data.to | string | Bucket-aligned window end (RFC 3339 UTC). |
| data.granularity | string | Bucket size for the response. |
| data | object | array | Endpoint-specific payload. See the fields below for this route. |
| _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 POST "https://public-api.fansmetric.com/v1/chatters/compare" \
--header "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"from": "2026-07-11T00:00:00Z",
"to": "2026-08-10T23:59:59Z",
"user_ids": ["b7a9e0f1-2fa4-4d0b-9c2a-6c4d0b41f2c7", "c5d6e7f8-9012-3456-7890-abcdef012345"],
"account_ids": ["100000001", "100000002"],
"granularity": "day"
}'Response
200