Reach
List Promotions
Returns the history of subscription promotions (discounted-price offers + free-trial bundles) the creator has run. Filterable by createdAt window. For aggregate promo earnings + a monthly chart, use Earnings Overview with by=promo. Requires permission api_reach_list_promotions.
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
limitintegerPage size. Default 10. Min 1, max 100.
offsetintegerRows to skip.
start_datestringLower bound on
createdAt. Default 2 years ago, UTC.end_datestringUpper bound on
createdAt. Default end of today, UTC.
Response Fields
data.items[].idintegerPromotion ID. Pass to
/reach/promotions/{promo_id}/subscribersfor the claim list.data.items[].messagestringPromo description shown to fans (HTML allowed; often empty).
data.items[].rawMessagestringPlain-text version of
message.data.items[].pricenumberDiscounted subscription price during the promo.
data.items[].typestringAudience scope. Observed:
all,expired. Other values may exist (new,current, …).data.items[].canClaimbooleantruewhile the promo is still claimable.data.items[].claimsCountintegerNumber of fans who claimed/subscribed via this promo.
data.items[].subscribeDaysintegerSubscribe-days bonus.
0when the promo doesn't extend the term.data.items[].createdAtstringISO 8601 — when the promo was created.
data.items[].finishedAtstringISO 8601 — when the promo expired/will expire.
data.items[].isFinishedbooleantrueoncefinishedAthas passed.data.hasMorebooleanWhether more pages are available.
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.items[].id | integer | Promotion ID. Pass to /reach/promotions/{promo_id}/subscribers for the claim list. |
| data.items[].message | string | Promo description shown to fans (HTML allowed; often empty). |
| data.items[].rawMessage | string | Plain-text version of message. |
| data.items[].price | number | Discounted subscription price during the promo. |
| data.items[].type | string | Audience scope. Observed: all, expired. Other values may exist (new, current, …). |
| data.items[].canClaim | boolean | true while the promo is still claimable. |
| data.items[].claimsCount | integer | Number of fans who claimed/subscribed via this promo. |
| data.items[].subscribeDays | integer | Subscribe-days bonus. 0 when the promo doesn't extend the term. |
| data.items[].createdAt | string | ISO 8601 — when the promo was created. |
| data.items[].finishedAt | string | ISO 8601 — when the promo expired/will expire. |
| data.items[].isFinished | boolean | true once finishedAt has passed. |
| data.hasMore | boolean | Whether more pages are available. |
| 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 GET "https://public-api.fansmetric.com/v1/100000001/reach/promotions?limit=20&offset=0&start_date=2026-01-01%2000%3A00%3A00" \
--header "Authorization: Bearer YOUR_API_KEY"Response
200