How to Find a TikTok Creator's Email (Legally, and at Scale)
You found a creator who's perfect for your brand. Right niche, real engagement, a voice your audience would actually like. Now you have to reach them — and the DM route is a graveyard. Popular creators get hundreds of DMs a day, and "hey check your DMs 🙏" in the comments screams amateur.
What you want is their email. And the good news is that a huge number of creators want you to have it. They put business@whoever.com or "📩 collabs: name@agency.com" right in their bio, specifically so brands can reach them. The problem isn't access — it's that copying those emails into a spreadsheet one profile at a time is mind-numbing once your list passes about ten people.
So let's automate the boring part. Below is a real workflow — find creators, pull their bios, extract the emails — with working code in both JavaScript and Python.
First, the honest part: what this can and can't do
This matters, so let's be clear before any code.
What you're doing is reading public bios. If a creator typed their email into the bio that anyone can see by opening their profile, pulling that text is no different from reading it yourself — just faster. That's legitimate.
What this is not: there's no secret "get any creator's private email" button. TikTok doesn't expose a hidden email field. If a creator didn't put an email in their bio, you won't find one this way, full stop. The "email" you can extract is only ever the one they chose to publish. Anyone promising to surface private contact details is either guessing or breaking rules.
And on outreach: scraping public emails is fine; blasting them with unsolicited bulk email may fall under laws like CAN-SPAM (US) or GDPR (EU). Keep it relevant, include a way to opt out, and don't spam. You're building a targeted list, not a spam cannon.
With that settled, here's the pipeline.
The workflow in three steps
- Find creators in your niche with a keyword search.
- Pull each creator's profile to get their bio text.
- Extract the email from the bio with a regex.
We'll use SociaVault for steps 1 and 2 since it returns clean JSON for both. Grab an API key from the dashboard — new accounts get 50 free credits to test this whole thing.
Step 1: Find creators by keyword
A keyword search returns videos, and every video carries its author. That's our source of candidate creators.
const API_KEY = process.env.SOCIAVAULT_API_KEY;
const BASE = "https://api.sociavault.com/v1";
async function findCreators(keyword) {
const res = await fetch(
`${BASE}/scrape/tiktok/search/keyword?query=${encodeURIComponent(keyword)}`,
{ headers: { "x-api-key": API_KEY } },
);
const json = await res.json();
if (!json.success) throw new Error(json.error);
// De-duplicate authors across the result set
const handles = new Set();
for (const item of json.data.search_item_list || []) {
const author = item.aweme_info?.author;
if (author?.unique_id) handles.add(author.unique_id);
}
return [...handles];
}
Each result lives under aweme_info.author, and the handle you want is author.unique_id. We dump them into a Set because the same creator often appears on multiple videos and you don't want to pay for the same profile twice.
Step 2: Pull each creator's bio
The profile endpoint returns the creator's bio in data.user.signature. (TikTok calls the bio the "signature" internally — that's where any email lives.)
async function getBio(handle) {
const res = await fetch(`${BASE}/scrape/tiktok/profile?handle=${handle}`, {
headers: { "x-api-key": API_KEY },
});
const json = await res.json();
if (!json.success) return null;
return {
handle,
bio: json.data.user.signature || "",
bioLink: json.data.user.bioLink?.link || null,
followers: json.data.stats?.followerCount ?? null,
};
}
Note that data.user.bioLink is worth grabbing too — plenty of creators skip the email and instead link a Linktree or a contact page where the email lives.
Step 3: Extract the email
Creators get creative to dodge bots: name [at] gmail [dot] com, name(at)agency.com, spaces everywhere. A good extractor handles the obvious cases and the common obfuscations.
function extractEmail(text) {
if (!text) return null;
// Normalize common obfuscations: [at] (at) {dot} etc.
const normalized = text
.replace(/\s*[\[\(\{]\s*at\s*[\]\)\}]\s*/gi, "@")
.replace(/\s*[\[\(\{]\s*dot\s*[\]\)\}]\s*/gi, ".")
.replace(/\s+at\s+/gi, "@")
.replace(/\s+dot\s+/gi, ".");
const match = normalized.match(/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/i);
return match ? match[0].toLowerCase() : null;
}
Putting it together
async function buildList(keyword) {
const handles = await findCreators(keyword);
const results = [];
for (const handle of handles) {
const profile = await getBio(handle);
if (!profile) continue;
const email = extractEmail(profile.bio);
results.push({
handle: profile.handle,
followers: profile.followers,
email,
bioLink: profile.bioLink,
});
await new Promise((r) => setTimeout(r, 300)); // be gentle
}
// Creators who published an email are your warm leads
return results.filter((r) => r.email);
}
buildList("skincare").then((leads) => console.table(leads));
That setTimeout matters — don't fire hundreds of requests in a tight loop. A small delay keeps things stable and polite.
The same pipeline in Python
import os, re, time, requests
API_KEY = os.environ["SOCIAVAULT_API_KEY"]
BASE = "https://api.sociavault.com/v1"
HEADERS = {"x-api-key": API_KEY}
def find_creators(keyword):
r = requests.get(f"{BASE}/scrape/tiktok/search/keyword",
params={"query": keyword}, headers=HEADERS).json()
handles = set()
for item in r.get("data", {}).get("search_item_list", []):
author = item.get("aweme_info", {}).get("author", {})
if author.get("unique_id"):
handles.add(author["unique_id"])
return list(handles)
def get_bio(handle):
r = requests.get(f"{BASE}/scrape/tiktok/profile",
params={"handle": handle}, headers=HEADERS).json()
if not r.get("success"):
return None
user = r["data"]["user"]
return {"handle": handle, "bio": user.get("signature", ""),
"followers": r["data"].get("stats", {}).get("followerCount")}
def extract_email(text):
if not text:
return None
t = re.sub(r"\s*[\[\(\{]\s*at\s*[\]\)\}]\s*", "@", text, flags=re.I)
t = re.sub(r"\s*[\[\(\{]\s*dot\s*[\]\)\}]\s*", ".", t, flags=re.I)
m = re.search(r"[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}", t, flags=re.I)
return m.group(0).lower() if m else None
def build_list(keyword):
leads = []
for handle in find_creators(keyword):
p = get_bio(handle)
if not p:
continue
email = extract_email(p["bio"])
if email:
leads.append({"handle": p["handle"], "followers": p["followers"], "email": email})
time.sleep(0.3)
return leads
print(build_list("skincare"))
Before you hit send: verify and segment
A raw list of scraped emails isn't a campaign. Two quick passes save you from looking sloppy:
- Spot a real address vs. an agency catch-all.
talent@bigagency.commeans you're pitching a manager, not the creator — your tone and ask should change accordingly. Personal Gmail/Outlook addresses usually mean you're reaching the creator directly. - Sanity-check deliverability. Run the list through an email verifier before a big send so typos and dead addresses don't tank your sender reputation.
Then segment by follower count, niche fit, and whether the email is direct or via an agency, and write something that sounds like a human who actually watched their content. That last part is the whole game — the list just gets you to the inbox.
Frequently Asked Questions
Can you find any TikTok creator's email?
Only if they published one. Creators who add a business email to their bio (or link to a contact page) can be found this way; creators who don't share an email anywhere public can't. There's no method to reveal a private email that a creator chose not to display — anything claiming otherwise isn't legitimate.
Is it legal to scrape emails from TikTok bios?
Reading a public bio is legitimate — it's information anyone can see by visiting the profile. The legal nuance is on the outreach side: bulk unsolicited email is regulated by laws like CAN-SPAM and GDPR. Keep messages relevant and targeted, offer an opt-out, and you stay on the right side of it. Don't spam.
Where do TikTok emails actually live in the data?
In the bio text, which the API returns as data.user.signature. Some creators put the email there directly; others link a Linktree or contact page via data.user.bioLink, where the email lives one click away. There is no dedicated "email" field exposed publicly.
How many credits does this use?
With SociaVault it's one credit per keyword search and one credit per profile lookup. So a search that surfaces 30 unique creators costs roughly 31 credits to fully process. De-duplicating handles before you fetch profiles (as the code does) keeps you from paying twice for the same creator.
How do I find emails for a specific niche?
Search a keyword that defines the niche ("skincare," "home barista," "indie game dev"), collect the authors from the results, and run them through the profile + extraction steps. For tighter targeting, combine several related keywords and merge the de-duplicated handle lists before pulling bios.
Can I do this without writing code?
The pipeline is simple enough that a no-code tool (or a spreadsheet plus a webhook) can handle small batches, but for anything beyond a few dozen creators, the script above is faster and cheaper. If you'd rather not build it, the same data powers most influencer-discovery tools under the hood.
Wrapping Up
Finding creator emails at scale isn't a hack — it's just reading the bios creators already published, faster than you could by hand. Build the list, verify it, segment it, and spend your real energy on a pitch worth replying to.
Ready to build your outreach list? Start free with SociaVault and get 50 credits to run your first niche search.
Related Articles
Found this helpful?
Share it with others who might benefit
Ready to Try SociaVault?
Start extracting social media data with our powerful API. No credit card required.