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.com
POST/v1/chatters/compare
Bearer

Authorization

default
AuthorizationBearer <token>

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

In: header

Request Body

application/json
  • user_ids*array

    Array of FansMetric user UUIDs from List Chatters. 1–5 per call — batch client-side if you need more.

  • account_ids*array

    Array of OnlyFans numeric account IDs (as strings). At least one. Every ID must belong to your org — unknown IDs return 404.

  • fromstring

    Window start (UTC). Default 30 days ago. Accepts ISO 8601 or relative shorthand (-30days).

  • tostring

    Window end (UTC). Default now. Must be after from.

  • team_idsarray

    Array of team UUIDs. When set, every user_ids entry must also be a member of one of these teams — otherwise the call returns 404.

  • granularitystring

    Bucket size — hour, day, week, or month. Default derived from window length.

Response Fields

  • data.chatters[]array

    One entry per requested user, sorted by name (not input order — index by user_id).

  • data.chatters[].user_idstring

    FansMetric user UUID.

  • data.chatters[].user_namestring

    Display name.

  • data.chatters[].metricsobject

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

    RFC 3339 UTC bucket-start timestamps. Shared axis across every user in the response.

  • data.chatters[].metrics.<stat>.chartValuesarray

    Per-bucket values for this user + stat. Empty buckets are zero-filled.

  • data.chatters[].metrics.<stat>.statHumanstring

    Human-readable label.

  • data.chatters[].metrics.<stat>.descriptionstring

    One-line explanation of the stat.

  • data.chatters[].metrics.<stat>.symbolstring

    $, %, or empty.

  • data.chatters[].metrics.<stat>.valueIsIntegerboolean

    Render hint.

  • data.chatters[].metrics.<stat>.symbolFirstboolean

    Render hint. false for % stats.

  • data.chatters[].metrics.<stat>.positiveIsGoodboolean

    Render hint.

  • data.chatters[].metrics.<stat>.granularitystring

    Bucket size for this series.

  • data.fromstring

    Bucket-aligned window start (RFC 3339 UTC).

  • data.tostring

    Bucket-aligned window end (RFC 3339 UTC).

  • data.granularitystring

    Bucket size for the response.

  • dataobject | array

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

  • _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 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
{
"data":{
"chatters":[
0:{
"user_id":"b7a9e0f1-2fa4-4d0b-9c2a-6c4d0b41f2c7"
"user_name":"Alex Chen"
"metrics":{
"employee_sales":{
"stat":"employee_sales"
"statHuman":"Employee Sales"
"description":"Total revenue from tips and unlocked PPVs sent on each day"
"chartLabels":[
0:"2026-08-08T00:00:00Z"
1:"2026-08-09T00:00:00Z"
2:"2026-08-10T00:00:00Z"
]
"chartValues":[
0:1240.55
1:985.1
2:1502.2
]
"symbol":"$"
"valueIsInteger":false
"symbolFirst":true
"positiveIsGood":true
"granularity":"day"
}
"golden_ratio":{
"stat":"golden_ratio"
"statHuman":"Golden Ratio"
"description":"Percentage of PPVs sent to messages sent on each day"
"chartLabels":[
0:"2026-08-08T00:00:00Z"
1:"2026-08-09T00:00:00Z"
2:"2026-08-10T00:00:00Z"
]
"chartValues":[
0:12.4
1:10.8
2:14.1
]
"symbol":"%"
"valueIsInteger":false
"symbolFirst":false
"positiveIsGood":true
"granularity":"day"
}
}
}
1:{
"user_id":"c5d6e7f8-9012-3456-7890-abcdef012345"
"user_name":"Jordan Rivera"
"metrics":{
"employee_sales":{
"stat":"employee_sales"
"statHuman":"Employee Sales"
"description":"Total revenue from tips and unlocked PPVs sent on each day"
"chartLabels":[
0:"2026-08-08T00:00:00Z"
1:"2026-08-09T00:00:00Z"
2:"2026-08-10T00:00:00Z"
]
"chartValues":[
0:980.2
1:1105
2:1220.65
]
"symbol":"$"
"valueIsInteger":false
"symbolFirst":true
"positiveIsGood":true
"granularity":"day"
}
}
}
]
"from":"2026-07-11T00:00:00Z"
"to":"2026-08-11T00:00:00Z"
"granularity":"day"
}
"_meta":{
"_credits":{
"used":1
}
"_rate_limits":{
"limit_minute":1000
"remaining_minute":999
"limit_day":50000
"remaining_day":49999
}
}
}