Creator Contact & Socials Resolver avatar

Creator Contact & Socials Resolver

Pricing

from $5.00 / 1,000 creator resolveds

Go to Apify Store
Creator Contact & Socials Resolver

Creator Contact & Socials Resolver

Turn creator profile URLs (YouTube, TikTok, Instagram, Linktree, websites) into contact rows: name, followers, bio, every linked social account, emails and website from the public page and its bio-link page. One row per input; blocked pages return an error field instead of failing the run.

Pricing

from $5.00 / 1,000 creator resolveds

Rating

0.0

(0)

Developer

Find Creators

Find Creators

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Paste in creator profile links, get back who they are and how to reach them. For every YouTube channel, TikTok profile, Instagram profile, Linktree / Beacons / other bio-link page or personal website you give it, the actor reads the public page, opens the bio-link page it points to, and returns one row with the name, follower count, bio, profile picture, every other social account it found, emails, and the website.

It reads public pages only. It never logs in, never uses cookies, and never touches private data. If a platform blocks the request, you get a row that says so instead of a failed run.

What it deliberately does not do

  • Sponsor and affiliate links are never opened. Bio-link pages list merch partners and sponsors next to the creator's own accounts. A plain website is only read when its domain contains the creator's handle or a word of their display name. Other linked sites are still listed under websites, but their emails and social accounts are never attributed to the creator.
  • Single videos and posts are not "socials". Links to a video, short, reel, tweet or clip are dropped; only account pages are returned.

What you get

One dataset row per input URL:

FieldMeaning
inputThe URL you supplied.
urlThe same URL, normalised.
platformyoutube, tiktok, instagram, linktree (any bio-link service) or web.
handleUsername on that platform (without @).
display_namePublic display name / channel title.
followersFollowers or subscribers as shown on the public page. null if hidden or blocked.
following, posts, likesExtra public counters where the platform shows them.
bioProfile description.
profile_imageURL of the profile picture (hot-linked from the platform's CDN; can expire).
countryCountry/region when the platform exposes it (TikTok, YouTube API).
socialsEvery other social account found: {platform, url, source, via}. via is link (found as a link) or bio_mention (an @name written in the bio, which may be a collaborator rather than the same person).
emailsAll email addresses found in the bio, bio-link page and website, lower-cased and de-duplicated.
websiteThe first personal website found; websites lists all of them.
source_urlsEvery page that was actually opened for this row (normalised URLs; source on each social uses the same form).
hop_errorsBio-link pages / websites that could not be opened, with the reason.
hops_followed, pages_fetchedHow far the actor went.
errornull on success. Otherwise why the profile itself could not be read, e.g. HTTP 403, blocked or empty profile page (...), bare handle: ....

Example

Input https://www.tiktok.com/@creator.demo (a TikTok bio that links to a Linktree):

{
"input": "https://www.tiktok.com/@creator.demo",
"platform": "tiktok",
"handle": "creator.demo",
"display_name": "Creator Demo",
"followers": 152300,
"bio": "Daily picks and behind the scenes\nBusiness: hello@creatordemo.example\nCollabs with @other.creator",
"profile_image": "https://p16-sign.tiktokcdn-us.com/.../abc123~c5_1080x1080.jpeg",
"socials": [
{"platform": "linktree", "url": "https://linktr.ee/creatordemo", "source": "https://tiktok.com/@creator.demo", "via": "link"},
{"platform": "tiktok", "url": "https://tiktok.com/@other.creator", "source": "https://tiktok.com/@creator.demo", "via": "bio_mention"},
{"platform": "youtube", "url": "https://youtube.com/@creatordemo", "source": "https://linktr.ee/creatordemo", "via": "link"},
{"platform": "instagram", "url": "https://instagram.com/creatordemo", "source": "https://linktr.ee/creatordemo", "via": "link"},
{"platform": "twitter", "url": "https://twitter.com/creatordemo", "source": "https://linktr.ee/creatordemo", "via": "link"}
],
"emails": ["hello@creatordemo.example", "booking@creatordemo.example"],
"website": "https://creatordemo.example/",
"source_urls": ["https://tiktok.com/@creator.demo", "https://linktr.ee/creatordemo"],
"hops_followed": 1,
"error": null
}

Input

FieldDefaultWhat it does
startUrlsrequiredOne creator per line. Full URLs. A bare @name is rejected because it could be on any platform.
followLinkPagestrueOpen the Linktree-style page / website a profile links to and collect what it lists.
maxHops1 (max 2)How many levels of bio-link pages and websites to follow. Other social profiles are listed, never opened.
minDelaySeconds3Minimum gap between two requests to the same site, plus up to one second of random jitter.
proxyConfigurationApify proxyRoute requests through proxies. Residential proxies make a real difference on TikTok and Instagram.
youtubeApiKeynoneOptional. Makes YouTube results come from the official Data API instead of page parsing. Never written to output or logs.

What it cannot do (read this before buying)

  • It does not discover creators. You give it URLs; it resolves them. It will not search TikTok or Instagram by topic.
  • Instagram is frequently blocked without a logged-in session. This actor deliberately does not log in. Expect many Instagram inputs to come back with error: "blocked or empty profile page (...)", particularly on datacenter proxies. Rows are still returned and are not charged.
  • TikTok public profiles show followers, total likes and video count only. There are no per-video views on the public page, so no engagement rate is computed. None is faked.
  • YouTube without an API key parses the public channel page, which works until YouTube changes its markup. With your own free Data API key the subscriber count and description come from the official API. The actor does not require a key.
  • Emails are whatever is publicly written in bios, bio-link pages and websites. Nothing is guessed or generated. A creator who publishes no email gets an empty emails list.
  • bio_mention socials may be other people. An @name in a bio is often a collaborator or a brand; it is reported with via: "bio_mention" so you can treat it accordingly.
  • All scrapers read undocumented embedded page data and break when platforms change their pages. When that happens rows come back with an error rather than wrong data.

Pricing

Pay-per-event: one event per input that resolves successfully (creator-resolved). Inputs that end with an error are not charged. Compute and proxy usage are covered by the event price, so you are not billed separately for residential proxy traffic.

Why per resolved creator rather than per run or per page: a run's cost is dominated by how many profiles it reads, and a blocked profile is worth nothing to you, so you should not pay for it. The price is set to cover the residential-proxy bandwidth and compute that a TikTok or Instagram profile plus one bio-link page typically consumes.

Running it locally (without the Apify platform)

From the repository root:

pip install -r apify_actor/requirements.txt
# No SDK needed for this path: prints one JSON row per line.
python apify_actor/run_local.py --url https://linktr.ee/someone --url https://www.tiktok.com/@someone
python apify_actor/run_local.py --input input.json --out rows.jsonl

input.json uses the same shape as the actor input:

{"startUrls": ["https://www.youtube.com/@someone"], "followLinkPages": true, "maxHops": 1, "minDelaySeconds": 3}

To exercise the real Actor entry point (dataset written under ./storage):

# Option A: the SDK's local key-value store
mkdir -p storage/key_value_stores/default
echo '{"startUrls": ["https://linktr.ee/someone"]}' > storage/key_value_stores/default/INPUT.json
python -m apify_actor.src.main
# Option B: env var, no storage setup
ACTOR_INPUT_JSON='{"startUrls": ["https://linktr.ee/someone"]}' python -m apify_actor.src.main
# Rows land in storage/datasets/default/*.json

Set HTTPS_PROXY in the environment if you need a proxy locally.

Tests

pip install pytest
python -m pytest apify_actor/tests -q

The tests mock the HTTP layer with realistic page fixtures (TikTok rehydration JSON, Linktree __NEXT_DATA__, an Open Graph website, a 403 page) and check the row shape, the error row for a blocked profile, and that link pages are followed exactly maxHops deep.

Deploying to Apify

The actor reuses the creatorscout scraper package from the repository root. apify push uploads only this directory, so the package is staged in first:

cd apify_actor
./stage.sh # copies ../creatorscout into ./creatorscout (verbatim, disposable)
apify push # builds from .actor/Dockerfile and uploads
./stage.sh --clean # remove the staged copy so it is never committed

Pay-per-event pricing (creator-resolved) is configured in the Apify Console under the actor's Publication settings; it is not part of actor.json. When PPE is not configured (local runs, or before you set it up) the charge call is skipped and logged once.