TEASEDocs
ProductsLinkLinks on a domain

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 paramDefaultMeaning
show_hiddenfalseInclude disabled (active=false) rows.
period_from / period_to0 / 0Unix-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.

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 }'
FieldTypeRequiredDescription
countrystringnoISO alpha-2 code, or "" (default) for the long-tail catch-all slot.
arm"paid" | "ftl"yesPaid tracking link, or free-trial link.
trial_daysintnoOFAPI 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.

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.

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):

CallWhat happens to our rowWhat happens on OnlyFans
(no flags — default)Soft: active set to false, row keptUntouched
?local=trueRow removed for realUntouched — no provider call at all
?hard=trueRow removed for realThe 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 — the link_id isn't a segment_links row on this domain (it may belong to another domain, or be a source: "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

On this page