Trial Links
Create Trial Link
Creates a trial link on OnlyFans and stores it in the FansMetric database. Requires permission api_trial_links_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/jsonname*stringTrial link name.
subscribe_days*stringTrial duration in days. Valid: 1, 3, 7, 14, 30, 90, 180, 360.
subscribe_countsstringMax claims. 0 = unlimited. Default 0.
expire_daysstringDays until link expires. 0 = no expiry.
tag_idsarrayFansMetric tag IDs.
custom_source_urlstringCustom source URL.
Response Fields
data.idintegerNewly created OnlyFans trial link ID.
data.trialLinkNamestringTrial link name as stored on OnlyFans.
data.urlstringThe OnlyFans trial URL fans claim.
data.subscribeDaysintegerLength of the free trial granted to a claimer, in days.
data.subscribeCountsintegerThe claim limit — the "y" in "x of y".
0means unlimited. OnlyFans' naming, kept for parity; it is not a count of subscribers.data.claimCountsintegerAlways
0on creation.data.allClaimCountsintegerAlways
0on creation. Lifetime claims — the "x" in "x of y".data.isFinishedbooleanAlways
falseon creation. OnlyFans finishes trials rather than deleting them.data.createdAtstring | nullCreation timestamp (RFC 3339).
data.expiredAtstring | nullExpiry timestamp, or
nullwhen the link does not expire.data.customNamestring | nullFansMetric display-name override.
nullon creation — set it via Update Trial Link.data.customSourceUrlstring | nullTraffic-source URL stored in FansMetric (the value submitted in
custom_source_url).data.notestring | nullFree-text note.
nullon creation.data.isHiddenbooleanFansMetric hide flag.
falseon creation.data.isRevenueSharedbooleanWhether an enabled share exposes revenue.
falseon creation.data.lastScannedAtstring | nullWhen the scraper last refreshed this link.
nulluntil the first pass.data.user.usernamestringCreator username. Empty string if it could not be resolved.
data.tags[]arrayFull tag objects for the IDs passed in
tag_ids. Each element hasid,name,color,created_at— same shape asGET /v1/tags. Resolution is best-effort: if the post-write tag-map fetch fails,tagsis[]rather than failing the create. Cross-org tag IDs are silently filtered out.data.revenue.totalstring"0.00"on creation.data.revenue.spendersCountinteger0on creation.data.revenue.revenuePerSubscriberstring"0"on creation.data.revenue.conversionToSpenderstringClaim→spend rate.
"0"on creation.data.costobjectperPromo,perSub,profit,roi— allnulluntil a promo cost is set, which is how you tell "not set" from zero.data.links.related.subscribersstringPath to this link's claimers.
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.id | integer | Newly created OnlyFans trial link ID. |
| data.trialLinkName | string | Trial link name as stored on OnlyFans. |
| data.url | string | The OnlyFans trial URL fans claim. |
| data.subscribeDays | integer | Length of the free trial granted to a claimer, in days. |
| data.subscribeCounts | integer | The claim limit — the "y" in "x of y". 0 means unlimited. OnlyFans' naming, kept for parity; it is not a count of subscribers. |
| data.claimCounts | integer | Always 0 on creation. |
| data.allClaimCounts | integer | Always 0 on creation. Lifetime claims — the "x" in "x of y". |
| data.isFinished | boolean | Always false on creation. OnlyFans finishes trials rather than deleting them. |
| data.createdAt | string | null | Creation timestamp (RFC 3339). |
| data.expiredAt | string | null | Expiry timestamp, or null when the link does not expire. |
| data.customName | string | null | FansMetric display-name override. null on creation — set it via Update Trial Link. |
| data.customSourceUrl | string | null | Traffic-source URL stored in FansMetric (the value submitted in custom_source_url). |
| data.note | string | null | Free-text note. null on creation. |
| data.isHidden | boolean | FansMetric hide flag. false on creation. |
| data.isRevenueShared | boolean | Whether an enabled share exposes revenue. false on creation. |
| data.lastScannedAt | string | null | When the scraper last refreshed this link. null until the first pass. |
| data.user.username | string | Creator username. Empty string if it could not be resolved. |
| data.tags[] | array | Full tag objects for the IDs passed in tag_ids. Each element has id, name, color, created_at — same shape as GET /v1/tags. Resolution is best-effort: if the post-write tag-map fetch fails, tags is [] rather than failing the create. Cross-org tag IDs are silently filtered out. |
| data.revenue.total | string | "0.00" on creation. |
| data.revenue.spendersCount | integer | 0 on creation. |
| data.revenue.revenuePerSubscriber | string | "0" on creation. |
| data.revenue.conversionToSpender | string | Claim→spend rate. "0" on creation. |
| data.cost | object | perPromo, perSub, profit, roi — all null until a promo cost is set, which is how you tell "not set" from zero. |
| data.links.related.subscribers | string | Path to this link's claimers. |
| 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/trial-links" \
--header "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"name": "1 Month Free Trial",
"subscribe_days": 30,
"subscribe_counts": 100,
"expire_days": 7,
"tag_ids": [1, 2],
"custom_source_url": "https://reddit.com/r/example"
}'Response
201