Chatters
Chatter Report
Returns a paginated per-chatter aggregate table across the window, plus an aggregate totals row that spans every chatter (not just the current page). Companion to Compare Chatters — same data, tabular shape instead of time-series. Requires permission api_chat_chatters_report.
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/jsonaccount_ids*arrayArray of OnlyFans numeric account IDs (as strings). At least one. Every ID must belong to your org.
fromstringWindow start (UTC). Default 30 days ago.
tostringWindow end (UTC). Default now. Must be after
from.team_idsarrayArray of team UUIDs. Restricts the report to users in any of these teams.
limitintegerPage size. Default
100, max500.offsetintegerRows to skip. Default
0.compare_to_previousstringtrue(default) to include*_prevfields on each row for the same-length window immediately beforefrom. Setfalsefor a faster response.skip_revenue_statsstringtrueto return onlyhours_workedandmessages_sentper row — no revenue, PPV, tips, or previous-window compare. Use for fast roster listings. Defaultfalse.
Response Fields
data.chatters[]arrayRows in this page, sorted by
all_earningsdescending.data.chatters[].idstringFansMetric user UUID.
data.chatters[].emailstringSign-in email.
data.chatters[].namestringDisplay name.
data.chatters[].rolesarrayRoles (
id,name,color).data.chatters[].hours_workedintegerHours the chatter was clocked in during the window.
data.chatters[].messages_sentintegerTotal messages sent (text + PPV).
data.chatters[].unique_messaged_fansintegerDistinct fans the chatter messaged.
data.chatters[].unique_fansintegerDistinct fans that responded to or interacted with this chatter.
data.chatters[].all_earningsnumberTotal attributed revenue (
tips_revenue + ppvs_revenue, net). In the account's payout currency.data.chatters[].tips_revenuenumberNet tips revenue attributed to this chatter.
data.chatters[].tips_countintegerNumber of tips.
data.chatters[].ppvs_revenuenumberNet revenue from unlocked PPVs attributed to this chatter.
data.chatters[].ppvs_countintegerNumber of PPV messages sent.
data.chatters[].unlocked_ppvs_countintegerNumber of PPVs that were unlocked.
data.chatters[].golden_rationumber(ppvs_count / messages_sent) × 100, rounded to 2 decimals.0whenmessages_sentis 0.data.chatters[].unlock_rationumber(unlocked_ppvs_count / ppvs_count) × 100, rounded to 2 decimals.0whenppvs_countis 0.data.chatters[].chargebacks_totalnumberSum of chargeback amounts on this chatter's transactions.
data.chatters[].chargebacks_countintegerNumber of chargebacks.
data.chatters[].<field>_prevanyEvery current-window field is repeated with a
_prevsuffix for the same-length window immediately beforefrom. Present only whencompare_to_previous=true.data.aggregateobjectTotals across every row in the result set (not just the current page). Same fields as
data.chatters[]minus identity. Ratios are re-derived from the summed numerators/denominators.data.totalintegerTotal rows across all pages.
data.limitintegerEffective page size.
data.offsetintegerEffective offset.
data.fromstringResolved window start (RFC 3339 UTC).
data.tostringResolved window end (RFC 3339 UTC).
dataobject | arrayEndpoint-specific payload. See the fields below for this route.
_pagination.next_pagestringRelative 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.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 | Rows in this page, sorted by all_earnings descending. |
| data.chatters[].id | string | FansMetric user UUID. |
| data.chatters[].email | string | Sign-in email. |
| data.chatters[].name | string | Display name. |
| data.chatters[].roles | array | Roles (id, name, color). |
| data.chatters[].hours_worked | integer | Hours the chatter was clocked in during the window. |
| data.chatters[].messages_sent | integer | Total messages sent (text + PPV). |
| data.chatters[].unique_messaged_fans | integer | Distinct fans the chatter messaged. |
| data.chatters[].unique_fans | integer | Distinct fans that responded to or interacted with this chatter. |
| data.chatters[].all_earnings | number | Total attributed revenue (tips_revenue + ppvs_revenue, net). In the account's payout currency. |
| data.chatters[].tips_revenue | number | Net tips revenue attributed to this chatter. |
| data.chatters[].tips_count | integer | Number of tips. |
| data.chatters[].ppvs_revenue | number | Net revenue from unlocked PPVs attributed to this chatter. |
| data.chatters[].ppvs_count | integer | Number of PPV messages sent. |
| data.chatters[].unlocked_ppvs_count | integer | Number of PPVs that were unlocked. |
| data.chatters[].golden_ratio | number | (ppvs_count / messages_sent) × 100, rounded to 2 decimals. 0 when messages_sent is 0. |
| data.chatters[].unlock_ratio | number | (unlocked_ppvs_count / ppvs_count) × 100, rounded to 2 decimals. 0 when ppvs_count is 0. |
| data.chatters[].chargebacks_total | number | Sum of chargeback amounts on this chatter's transactions. |
| data.chatters[].chargebacks_count | integer | Number of chargebacks. |
| data.chatters[].<field>_prev | any | Every current-window field is repeated with a _prev suffix for the same-length window immediately before from. Present only when compare_to_previous=true. |
| data.aggregate | object | Totals across every row in the result set (not just the current page). Same fields as data.chatters[] minus identity. Ratios are re-derived from the summed numerators/denominators. |
| data.total | integer | Total rows across all pages. |
| data.limit | integer | Effective page size. |
| data.offset | integer | Effective offset. |
| data.from | string | Resolved window start (RFC 3339 UTC). |
| data.to | string | Resolved window end (RFC 3339 UTC). |
| data | object | array | Endpoint-specific payload. See the fields below for this route. |
| _pagination.next_page | string | 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.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/report" \
--header "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"from": "2026-07-11T00:00:00Z",
"to": "2026-08-10T23:59:59Z",
"account_ids": ["100000001", "100000002"],
"limit": 100,
"offset": 0,
"compare_to_previous": true
}'Response
200