Add, list, or remove a link on a domain
The four raw moves on a domain's OnlyFans-link inventory, so it reflects what's actually in rotation.
A domain link is one row in segment_links: a single OnlyFans link — paid tracking or free
trial — tied to a domain, a country (or "" for the long-tail default), and an arm (paid or
ftl). This page covers adding, listing, and removing them one at a time. Need a whole country
batch at once instead? See Auto-provision link slots.
List what's on a domain
curl "https://app.tease.link/api/admin/domains/links.creator.com/links?show_hidden=true" \
-H "Authorization: Bearer $TEASE_API_KEY"| Query param | Default | Meaning |
|---|---|---|
show_hidden | false | Include disabled (active=false) rows. |
period_from / period_to | 0 / 0 | Unix-seconds window for the revenue figures on each row; 0/0 = all-time. |
The response's items mixes two sources: source: "segment" rows are the ones this page manages
(their id is the real segment_links primary key — that's what PATCH/DELETE below target);
source: "campaign" rows are OnlyFans campaigns your account already has that were never
provisioned through here (a domain with no segment_links rows still shows its real traffic this
way). Campaign rows are read-only in this list. stamped tells you whether a row's URL is
live on a currently-published button right now — a row can exist and be active without being
stamped if nothing currently routes to it.
Add one link
curl -X POST https://app.tease.link/api/admin/domains/links.creator.com/links \
-H "Authorization: Bearer $TEASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "country": "DE", "arm": "paid", "trial_days": 30 }'| Field | Type | Required | Description |
|---|---|---|---|
country | string | no | ISO alpha-2 code, or "" (default) for the long-tail catch-all slot. |
arm | "paid" | "ftl" | yes | Paid tracking link, or free-trial link. |
trial_days | int | no | OFAPI trial length — one of 1, 3, 7, 14, 30, 90, 180, 360. Default 30. Only matters when this call actually creates a new trial link; re-adding an existing slot keeps that link's original (immutable) duration. |
This makes a real call to onlyfansapi.com (mint a new link, or adopt one that already exists under this domain's deterministic name) — it's synchronous, so the response carries the finished row. Idempotent: re-adding a slot that already has a URL just returns the existing row; it never mints a duplicate link.
Turn a link on or off
curl -X PATCH https://app.tease.link/api/admin/domains/links.creator.com/links/482 \
-H "Authorization: Bearer $TEASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "active": false }'active is required — the toggle is always explicit, never inferred. Disabling is fail-safe:
it never blanks a live button. It only stops that row from being chosen the next time buttons
are re-stamped, so a currently-published paid button keeps its last-known URL and an ftl arm
keeps its current one until something else replaces it. Re-enabling puts this row's URL back in
contention immediately.
If the link was deleted on OnlyFans itself (confirmed by our engine), the row is marked
archived and re-enabling it 409s with link_archived — turning it back on would stamp a dead
OnlyFans URL onto a live button. Create a new link for that slot instead.
Remove a link
curl -X DELETE "https://app.tease.link/api/admin/domains/links.creator.com/links/482?hard=true" \
-H "Authorization: Bearer $TEASE_API_KEY"Delete has three modes, picked by two query flags (local is checked first — if it's true, hard
is ignored):
| Call | What happens to our row | What happens on OnlyFans |
|---|---|---|
| (no flags — default) | Soft: active set to false, row kept | Untouched |
?local=true | Row removed for real | Untouched — no provider call at all |
?hard=true | Row removed for real | The link is deleted via the OFAPI |
The default soft delete is the safe one for a trial link: the row and the provider link both
survive, so nothing ever gets re-created. A hard delete of a trial link deliberately reopens
free-trial stacking if you later re-add that slot (the very thing static links exist to prevent) —
the response's note field carries that warning, and it's written to the audit log too.
A hard delete 409s with url_stamped_elsewhere if this link's URL is still live on a published
button of another domain — deleting it on OnlyFans would leave that other domain's button
302'ing fans onto a dead link. Replace or reprovision it there first, then delete.
How to know it worked
Re-list the domain (GET .../links) — the row you added/changed/removed should show the
expected active/stamped state, or be gone entirely for a real (local/hard) delete. A soft
delete keeps the row visible only with show_hidden=true.
If it didn't work
404 domain_not_found— the hostname doesn't match a domain on your account.404 link_not_found— thelink_idisn't asegment_linksrow on this domain (it may belong to another domain, or be asource: "campaign"row, which has no numeric link id here).409 link_archived— see the callout above.409 url_stamped_elsewhere— see the callout above.502 link_not_permanent(add) — a freshly created trial link didn't come back permanent/never-expiring from OnlyFans; nothing was registered.502 link_unresolved(add) — the slot couldn't be resolved to any URL at all.502 provision_failed/stamp_failed/provider_delete_failed— an OFAPI or stamping call failed partway through; the whole change was rolled back, so retry is safe.
What's next
- Auto-provision link slots — add a whole country batch instead of one slot at a time.
- See ad spend and ROI for one link — decide whether a link is worth keeping before you remove it.
- Troubleshooting