TEASEDocs
ProductsLinkLinks on a domain

Auto-provision link slots

Preview a domain's whole paid + trial link batch, then commit it in one call instead of adding slots one at a time.

Adding one link at a time works fine for a single fix, but a new domain usually needs the whole standing set — a trial link for the countries that get one, a paid link for everything else. Provisioning builds that whole plan and runs it in one call: for each (country, arm) slot it either mints a new OnlyFans link or adopts one that already exists under this domain's deterministic name, then registers it and re-stamps the domain's buttons.

This is unrelated to Club's free-pool spare dressing (see Concepts), which reuses an already-existing hidden campaign instead of creating anything. Provisioning here always deals in real, named OnlyFans links.

Preview first

curl -X POST https://app.tease.link/api/admin/domains/links.creator.com/provision-links/preview \
  -H "Authorization: Bearer $TEASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "trial_countries": ["US","GB","DE"], "paid_countries": "rest", "default_paid": true }'

Preview is a DB-only dry run — it never calls OnlyFans and writes nothing. It diffs the plan against this domain's existing segment_links rows and returns, per slot, whether a row already exists:

{ "domain": "links.creator.com", "would_create": 3, "already_exist": 40,
  "slots": [ { "country": "US", "arm": "ftl", "status": "new" }, ... ] }

would_create means "no row in our database yet" — it honestly can't tell you whether the real run will mint a brand-new OnlyFans link or silently adopt one that already exists on the vendor side by name. That distinction only shows up once you run the real provision, which is the only call that actually lists OnlyFans's own links.

Commit the batch

Same body, no /preview:

curl -X POST https://app.tease.link/api/admin/domains/links.creator.com/provision-links \
  -H "Authorization: Bearer $TEASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "trial_countries": ["US","GB","DE"], "paid_countries": "rest", "default_paid": true }'

This is synchronous — you get the finished summary back, not a job id. Idempotent: re-running the same (or an overlapping) config reuses any row that already carries a URL instead of minting a second link for that slot.

Configuring the plan

FieldTypeDefaultMeaning
trial_countrieslist of ISO codes[]Countries that get a free-trial (ftl) link. Empty unless you list them — there's no implicit "give everyone a trial" default at the API level.
paid_countrieslist of ISO codes, or the literal "rest""rest"Countries that get a paid tracking link. "rest" is the standing full list — the 16 high-income countries also eligible for a trial, plus a second tier of paid-only countries, plus Russia.
default_paidbooltrueAlso create one country: "" paid link — the long-tail catch-all for every country not explicitly listed.
trial_daysint30OFAPI trial length: 1, 3, 7, 14, 30, 90, 180, 360. Only affects trial links created fresh by this call — an adopted or already-existing trial keeps its own original duration.

Sending {} therefore provisions the full paid list plus the long-tail default, but zero trial links — list trial_countries explicitly whenever you want free trials in the batch.

How to know it worked

unresolved in the response should be empty, and created + adopted + reused should match the preview's would_create + already_exist. List the domain's links afterward — the new rows should show up active and, once a smart link or button points at them, stamped.

If it didn't work

  • 404 domain_not_found — the hostname doesn't match a domain on your account.
  • 400 country_invalid — a code in trial_countries/paid_countries isn't a real ISO alpha-2 (e.g. "USA" instead of "US").
  • 502 link_not_permanent — a newly created trial link came back from OnlyFans without a permanent/never-expiring guarantee; nothing in the batch was registered.
  • 502 provision_failed — any other OFAPI or database failure aborted the whole batch; retry is safe (nothing partial was committed).
  • A slot listed in unresolved — that specific (country, arm) couldn't be resolved to any URL; everything else in the batch still went through.

What's next

On this page