curl --request PATCH \
--url https://api.onlyx.ai/v1/creators/{creatorId}/tracking-links/{linkId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"costCents": 25000,
"note": "Paid posts in three subreddits",
"source": "reddit"
}
'import requests
url = "https://api.onlyx.ai/v1/creators/{creatorId}/tracking-links/{linkId}"
payload = {
"costCents": 25000,
"note": "Paid posts in three subreddits",
"source": "reddit"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({costCents: 25000, note: 'Paid posts in three subreddits', source: 'reddit'})
};
fetch('https://api.onlyx.ai/v1/creators/{creatorId}/tracking-links/{linkId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"accountedFans": 301,
"archived": false,
"arpuCents": 475,
"attributedFans": 388,
"claims": 0,
"claimsLimit": null,
"clicks": 4210,
"code": "17",
"conversion": 0.0922,
"costCents": 25000,
"cpcCents": 6,
"cpfCents": 64,
"earningsCents": 184300,
"earningsKnown": true,
"epcCents": 44,
"expiresAt": null,
"firstSeenAt": "2026-09-01T10:14:00.000Z",
"id": "trk_5a7c9e1b3d5f7a9c1e3b",
"kind": "tracking",
"lastSeenAt": "2026-09-26T09:15:00.000Z",
"name": "Reddit September",
"note": "Paid posts in three subreddits",
"ofCreatedAt": "2026-09-01T10:00:00.000Z",
"profitCents": 159300,
"roi": 6.372,
"source": "reddit",
"subscribers": 388,
"trialDays": null,
"url": "https://onlyfans.com/miarose/c17"
}Update a tracking link
Records what a promotion cost and where it ran, adds a note, or archives the link in OnlyX. Send only what changes; null clears costCents, source or note. Cost drives the computed profit, ROI, cost per click and cost per fan. These fields live only in OnlyX: nothing changes on OnlyFans, and fields OnlyFans owns (name, code, counts) cannot be sent.
Scope: requires links:write.
Rate limit: the general limit of 120 requests per 60 seconds per credential.
Idempotency: send an Idempotency-Key header to make retries safe: a replay within 24 hours returns the original response with Idempotent-Replayed: true.
curl --request PATCH \
--url https://api.onlyx.ai/v1/creators/{creatorId}/tracking-links/{linkId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"costCents": 25000,
"note": "Paid posts in three subreddits",
"source": "reddit"
}
'import requests
url = "https://api.onlyx.ai/v1/creators/{creatorId}/tracking-links/{linkId}"
payload = {
"costCents": 25000,
"note": "Paid posts in three subreddits",
"source": "reddit"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({costCents: 25000, note: 'Paid posts in three subreddits', source: 'reddit'})
};
fetch('https://api.onlyx.ai/v1/creators/{creatorId}/tracking-links/{linkId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"accountedFans": 301,
"archived": false,
"arpuCents": 475,
"attributedFans": 388,
"claims": 0,
"claimsLimit": null,
"clicks": 4210,
"code": "17",
"conversion": 0.0922,
"costCents": 25000,
"cpcCents": 6,
"cpfCents": 64,
"earningsCents": 184300,
"earningsKnown": true,
"epcCents": 44,
"expiresAt": null,
"firstSeenAt": "2026-09-01T10:14:00.000Z",
"id": "trk_5a7c9e1b3d5f7a9c1e3b",
"kind": "tracking",
"lastSeenAt": "2026-09-26T09:15:00.000Z",
"name": "Reddit September",
"note": "Paid posts in three subreddits",
"ofCreatedAt": "2026-09-01T10:00:00.000Z",
"profitCents": 159300,
"roi": 6.372,
"source": "reddit",
"subscribers": 388,
"trialDays": null,
"url": "https://onlyfans.com/miarose/c17"
}Authorizations
An API key (onx_sk_…) created in OnlyX under Settings → API & MCP, or an OAuth access token (onx_at_…) issued to a connected app. Send it as Authorization: Bearer <credential>. API keys may also be sent as X-API-Key: <key>.
Headers
Optional. A unique value (8 to 64 letters, digits, - or _; a UUID is ideal) that makes a retry safe: the same key with the same request within 24 hours returns the stored response, with Idempotent-Replayed: true, instead of doing the work twice. The same key with a different request is 409 IDEMPOTENCY_KEY_REUSED; while the first request still runs it is 409 IDEMPOTENCY_IN_PROGRESS. A malformed key is 400 VALIDATION_ERROR.
8 - 64^[A-Za-z0-9_-]{8,64}$Path Parameters
The creator id (cre_…).
The tracking link id (trk_…).
Body
Archive or unarchive it in OnlyX. Nothing changes on OnlyFans.
What the promotion cost, 0 to 100000000 cents. null clears it.
0 <= x <= 100000000Your note, up to 500 characters. null clears it.
500Where you ran it, up to 60 characters. null clears it.
60Response
The updated tracking link.
Of those, fans OnlyX could match to spend.
Hidden from the default list.
Earnings per fan, in cents, or null.
Fans OnlyFans attributes to this link.
Trial links: trials claimed.
Trial links: the most trials it gives, or null for no limit.
Clicks, as counted by OnlyFans.
The link code on OnlyFans.
subscribers / clicks, or null.
What you paid for the promotion, in cents. null = never costed, 0 = free.
Cost per click, in cents, or null.
Cost per fan (subscriber), in cents, or null.
Lifetime spend of the fans this link brought, in cents. A floor when accountedFans is below attributedFans. null when no attributed fan is known. Never add link earnings up into creator revenue: a fan on two links counts on both.
false until earnings could be worked out.
Earnings per click, in cents, or null.
When the link stops working, or null.
When OnlyX first read the link.
The tracking link id (trk_…).
tracking: a campaign link. trial: a free-trial link.
tracking, trial When OnlyX last read it (about hourly while the creator is connected).
The link name on OnlyFans.
Your note.
When it was created on OnlyFans.
earnings − cost, in cents, or null.
profit / cost, or null when there is no cost.
Where you ran it (your label).
Subscribers it brought, as counted by OnlyFans.
Trial links: the length of the free trial in days.
The public link to share.