Promotions
Create Promotion
Creates a new promotion (discount offer or free trial) on the creator's profile. Promotions can target new subscribers, expired subscribers, or both (new_and_expired creates two OF-side promotions in one call). For free-trial links specifically, prefer the /v1/{account_id}/trial-links endpoints — this is the lower-level OF-native primitive. Requires permission api_promotions_create.
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.
Request Body
application/jsontype*stringAudience. One of
new,expired,new_and_expired.new_and_expiredcreates two OF promotions in a single call.discount*stringDiscount percentage applied to the subscription. Range
1–100. Set to100to turn the promotion into a Free Trial —freeTrialDaysthen becomes required.subscribeCounts*stringLimit on how many subscribers can claim. Set to
0for unlimited. Max:100.subscribeDays*stringDays the discount remains in effect for a redeeming subscriber. Range
1–30.finishDays*stringDays before the promotion expires. Range
0–30.0means open-ended.messagestringOptional message shown to subscribers (max 500 chars).
freeTrialDaysstringRequired when
discount == 100. Length of the free trial in days. Range1–30.
Response Fields
data[]arrayCreated promotions. Length 1 for
new/expired, length 2 fornew_and_expired.data[].idintegerOnlyFans promotion ID. Pass to Finish Promotion to stop it early.
data[].typestringneworexpired(the per-row audience, not the requesttype).data[].canClaimbooleanWhether the promo is currently claimable by eligible fans.
data[].claimsCountintegerNumber of subscribers who have already redeemed.
data[].createdAtstringISO timestamp when the promo was created.
data[].finishedAtstringISO timestamp when the promo expires (
createdAt + finishDays).data[].isFinishedbooleantrueonce the promo has expired or been finished early.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[] | array | Created promotions. Length 1 for new/expired, length 2 for new_and_expired. |
| data[].id | integer | OnlyFans promotion ID. Pass to Finish Promotion to stop it early. |
| data[].type | string | new or expired (the per-row audience, not the request type). |
| data[].canClaim | boolean | Whether the promo is currently claimable by eligible fans. |
| data[].claimsCount | integer | Number of subscribers who have already redeemed. |
| data[].createdAt | string | ISO timestamp when the promo was created. |
| data[].finishedAt | string | ISO timestamp when the promo expires (createdAt + finishDays). |
| data[].isFinished | boolean | true once the promo has expired or been finished early. |
| 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/100000001/promotions" \
--header "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"type": "new",
"discount": 50,
"subscribeCounts": 100,
"subscribeDays": 30,
"finishDays": 7,
"message": "Half off your first month! 🎉"
}'Response
200