TEASEDocs
ProductsLinkTraffic sources

Create a rule that attributes a link to a source

Bind an OnlyFans link to a domain and channel so its traffic resolves to exactly one source.

A source_link rule tells the resolver which domain-source (and optional channel) an OnlyFans link's traffic belongs to. Every rule picks one match type — how the link's identity is compared against match_value:

match_typeMatches on
provider_idThe link's exact OnlyFans-side id.
exact_nameThe link's exact display name.
name_prefixThe link's name starting with match_value.
regexre.search(match_value, name) against the link's name — see the limits below.

Before you start

domain_source has to be a domain you already own and have connected — the endpoint 404s with domain_not_found if the hostname doesn't exist yet. It can never be a sentinel value (__organic__ or __pending__): those are the resolver's own reserved buckets for traffic that came in with no link at all, or with a link nobody has mapped yet — pointing a rule at either is rejected with 400 domain_source_sentinel.

Create a rule

curl -X POST https://app.tease.link/api/admin/source-links \
  -H "Authorization: Bearer $TEASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "match_type": "name_prefix", "match_value": "VIP-", "domain_source": "links.creator.com", "channel": "twitter" }'
FieldTypeRequiredDescription
match_typestringyesOne of provider_id / exact_name / name_prefix / regex. Any other value is a 422.
match_valuestringyes1–512 characters, trimmed; empty after trimming is rejected.
domain_sourcestringyes1–255 characters; must resolve to an existing, connected domain.
channelstringnoFree-form label (≤32 characters) — a grouping tag, doesn't affect matching.
notesstringno≤512 characters.

A successful create returns the row with its id, assigned_by (your actor), and timestamps.

Regex limits

A regex rule is later run as re.search with no timeout, so match_value is checked at write time for shapes that can hang a worker (catastrophic backtracking):

  • Capped at 200 characters, 12 groups, and 24 quantifiers total.
  • Any quantified group — (...)+, (...)*, (...){n,} — is rejected outright if its body contains another quantifier ((a+)+) or an alternation ((a|aa)+), whether or not that specific pattern would actually backtrack badly.

A pattern can be rejected even when it isn't genuinely catastrophic — the guard checks the shape of a quantified group, not whether it specifically blows up. See Troubleshooting before assuming your pattern should have been accepted; the fix is to simplify it or fall back to exact_name / name_prefix, not to retry.

Update or deactivate a rule

match_type and match_value are fixed at creation — delete and recreate the rule if the link's identity itself needs to change. Everything else can be patched, and every field is optional (omitted = unchanged):

curl -X PATCH https://app.tease.link/api/admin/source-links/482 \
  -H "Authorization: Bearer $TEASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "active": false }'

domain_source, channel, active, and notes all take the same rules as on create (an explicit empty notes clears it). Set active: false to stop a rule from being used without losing its history — deleting is a separate, permanent action.

Remove a rule

curl -X DELETE https://app.tease.link/api/admin/source-links/482 \
  -H "Authorization: Bearer $TEASE_API_KEY"

Returns 204 with no body.

How to know it worked

curl https://app.tease.link/api/admin/source-links \
  -H "Authorization: Bearer $TEASE_API_KEY"

Lists every rule, newest first. If your access is limited to a set of source domains, rules on other domains are silently left out of this list, and update/delete on their id come back as 404 source_link_not_found rather than 403 — a rule outside your scope looks exactly like one that doesn't exist.

If it didn't work

  • 400 domain_source_sentineldomain_source was __organic__ or __pending__; point the rule at a real domain instead.
  • 404 domain_not_found — the hostname in domain_source isn't a connected domain on this account yet.
  • 404 source_link_not_found (update/delete) — either the id doesn't exist, or it belongs to a domain outside your scope.
  • 422match_type isn't one of the four allowed values, a required field is empty/too long, or the regex tripped one of the limits above — see Troubleshooting for the regex case.

What's next

On this page