Reach
Get Profile Visitors Top Countries
Ranked country breakdown of profile-page visits — guests + signed-in users + paying subscribers — with an Others rollup row. Requires permission api_reach_read_profile_visitors_countries.
https://public-api.fansmetric.comAuthorization
defaultAuthorizationBearer <token>Send your FansMetric API key as a Bearer token in the Authorization header.
In: header
Path Parameters
account_id*integerOnlyFans numeric account ID.
Query Parameters
start_datestringWindow start. Default 2 years ago, UTC.
end_datestringWindow end. Default end of today, UTC.
bystringBucket:
total(default),guests,users,subscribers.limitintegerTop-N rows. Default 10. Capped at 100.
Response Fields
data.topCountries.hasMorebooleantrueif more country rows are aggregated into theOthersrollup beyond the returned top-N.data.topCountries.totalsobjectAccount-wide totals across all countries. Quirk:
totalandsubscribersare numbers, butguestsanduserscome back as strings.data.topCountries.rows[]arrayRanked country rows. The final row is always an
Othersrollup withcountryCode: "".data.topCountries.rows[].rankinteger1-based rank.
Othersgetslimit+1.data.topCountries.rows[].countryNamestringHuman-readable name.
"Others"on the rollup row.data.topCountries.rows[].countryCodestringISO 3166-1 alpha-2. Empty string for
Others.data.topCountries.rows[].viewsCountobjectPer-country
{ total, guests, users, subscribers }— all numeric.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.topCountries.hasMore | boolean | true if more country rows are aggregated into the Others rollup beyond the returned top-N. |
| data.topCountries.totals | object | Account-wide totals across all countries. Quirk: total and subscribers are numbers, but guests and users come back as strings. |
| data.topCountries.rows[] | array | Ranked country rows. The final row is always an Others rollup with countryCode: "". |
| data.topCountries.rows[].rank | integer | 1-based rank. Others gets limit+1. |
| data.topCountries.rows[].countryName | string | Human-readable name. "Others" on the rollup row. |
| data.topCountries.rows[].countryCode | string | ISO 3166-1 alpha-2. Empty string for Others. |
| data.topCountries.rows[].viewsCount | object | Per-country { total, guests, users, subscribers } — all numeric. |
| 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 GET "https://public-api.fansmetric.com/v1/100000001/reach/profile-visitors/countries?start_date=2026-01-01%2000%3A00%3A00&end_date=2026-01-31%2023%3A59%3A59&by=sample_by" \
--header "Authorization: Bearer YOUR_API_KEY"Response
200