Creator research, done with this API, is three reads and a stop rule. Search people by a niche word. Open the public profile. Follow links that creator actually published, including an email only if they wrote it down. Nothing is inferred from a similar handle. The routes are in beta. Send x-api-key. See authentication.
Search users#
GET /v1/tiktok/search/users takes query. The recorded query is nasa. Results page with cursor.
curl -G "https://api.socialscrape.io/v1/tiktok/search/users" \
-H "x-api-key: $SOCIALSCRAPE_API_KEY" \
--data-urlencode "query=nasa"import os
import requests
params = {
"query": "nasa",
}
res = requests.get(
"https://api.socialscrape.io/v1/tiktok/search/users",
headers={"x-api-key": os.environ["SOCIALSCRAPE_API_KEY"]},
params=params,
)
body = res.json()
if body["ok"]:
print(body["data"])
else:
print(body["error"]["code"], body["error"]["message"])const url = new URL("https://api.socialscrape.io/v1/tiktok/search/users");
url.search = new URLSearchParams({
"query": "nasa"
}).toString();
const res = await fetch(url, {
headers: { "x-api-key": process.env.SOCIALSCRAPE_API_KEY! },
});
const body = await res.json();
if (body.ok) {
console.log(body.data);
} else {
console.error(body.error.code, body.error.message);
}data.items are profiles, thinner than a full profile fetch. You get id, handle, name, bio, avatar_url, verified, url and stats (followers, following, posts, likes). extra on a hit includes sec_uid and verification_reason when TikTok sends them. Sort or filter in your own code. This endpoint does not take a minimum follower count.
Page while has_more is true. Each page is 1 credit. Pick the rows you care about and stop. See pagination.
Open the profile#
Pass handle to GET /v1/tiktok/profile. That adds the bio link, links, is_private, and the extra flags (is_commerce_user, is_tiktok_seller, duet and stitch settings). The call is written out in Read a TikTok profile. One profile is 1 credit. The follower count you show a teammate should be stats.followers from this call or from the search row, labeled with the time you fetched it. It is not a score.
If the creator's main presence is YouTube, start from GET /v1/youtube/channel instead. Subscriber counts can be approximate: read extra.subscribers_approximate and extra.subscribers_text. That path is Get a YouTube channel and its videos.
Other profiles they linked#
GET /v1/creators/social-profiles lists social profiles a creator links from their own bio, links section or link-in-bio page. Each item is a profile with platform and url. extra.evidence lists the pages that say so. extra.confidence is 1.0 for a link on the profile itself, and 0.9 for one a link-in-bio page or a linked profile declares. Only published links are followed. A matching handle on another site is not enough, and it is not added.
Pass platform and handle, or a profile url. platform is youtube, tiktok, instagram, twitter, twitch or facebook. YouTube also accepts a channel id as the handle. The recorded request is a YouTube handle.
curl -G "https://api.socialscrape.io/v1/creators/social-profiles" \
-H "x-api-key: $SOCIALSCRAPE_API_KEY" \
--data-urlencode "handle=MrBeast" \
--data-urlencode "platform=youtube"import os
import requests
params = {
"handle": "MrBeast",
"platform": "youtube",
}
res = requests.get(
"https://api.socialscrape.io/v1/creators/social-profiles",
headers={"x-api-key": os.environ["SOCIALSCRAPE_API_KEY"]},
params=params,
)
body = res.json()
if body["ok"]:
print(body["data"])
else:
print(body["error"]["code"], body["error"]["message"])const url = new URL("https://api.socialscrape.io/v1/creators/social-profiles");
url.search = new URLSearchParams({
"handle": "MrBeast",
"platform": "youtube"
}).toString();
const res = await fetch(url, {
headers: { "x-api-key": process.env.SOCIALSCRAPE_API_KEY! },
});
const body = await res.json();
if (body.ok) {
console.log(body.data);
} else {
console.error(body.error.code, body.error.message);
}Items can have empty stats when the link was only a URL. The point of the row is platform, url and handle, plus extra.linked_from and extra.evidence. Do not drop a row because stats.followers is null. Fetch that platform's profile endpoint if you need the count. This list is not that fetch.
not_found means no published links were found, or the source profile was missing. unsupported_url means the URL was not a supported profile. Both are final.
Emails they published#
GET /v1/creators/emails returns addresses a creator published themselves. Each address has the URLs where it was seen. The route reads the bio and links, the link-in-bio pages they link (Linktree, Komi, Pillar, Lnk.Bio, Linkme and other link hubs), the profiles they link, and up to three websites they declare (homepage and contact pages, robots.txt honoured).
Addresses are never guessed and never checked by sending mail. kind is business, management or personal when the address itself says so. Otherwise it can be null. extra.partial is true when a page failed or was skipped, so an empty emails array is then not proof that no address exists. Look at extra.failed_scans and extra.skipped_urls before you write "no email".
extra.email_sources repeats each address with sources, and each source has a type: social_profile, link_in_bio, linked_profile or website_page.
Pass platform and handle, or a profile url. The recorded request is an Instagram handle. The recorded sample is anonymised: addresses in that file are [email protected], which is a placeholder. Do not mail it. A live response contains the address that was published, or an empty list.
curl -G "https://api.socialscrape.io/v1/creators/emails" \
-H "x-api-key: $SOCIALSCRAPE_API_KEY" \
--data-urlencode "platform=instagram" \
--data-urlencode "handle=miguelangeles"import os
import requests
params = {
"platform": "instagram",
"handle": "miguelangeles",
}
res = requests.get(
"https://api.socialscrape.io/v1/creators/emails",
headers={"x-api-key": os.environ["SOCIALSCRAPE_API_KEY"]},
params=params,
)
body = res.json()
if body["ok"]:
print(body["data"])
else:
print(body["error"]["code"], body["error"]["message"])const url = new URL("https://api.socialscrape.io/v1/creators/emails");
url.search = new URLSearchParams({
"platform": "instagram",
"handle": "miguelangeles"
}).toString();
const res = await fetch(url, {
headers: { "x-api-key": process.env.SOCIALSCRAPE_API_KEY! },
});
const body = await res.json();
if (body.ok) {
console.log(body.data);
} else {
console.error(body.error.code, body.error.message);
}data.object is creator_emails. profile_url is the page you started from. One successful call is 1 credit. It is cacheable for 30 days.
Cost and limits#
A research pass on one creator is a search page, a profile, a link lookup and an email lookup: four credits if all four succeed and miss the cache. Searching fifty handles is fifty profile calls, not one. max_age_days is appropriate for a link graph you checked last week. It is the wrong flag if you need today's follower count. Failures cost 0.
You do not get a private email, a guessed firstname@domain pattern, or a follower list. You do not get age or gender. Those are not fields on these routes.
Signup is 100 credits, once, no card. See pricing and credits. The team rate limit is 30 a minute on free credits. See rate limits.
The API is in early access. The routes are beta.
Next#
The shorter product page is influencer discovery. User search: TikTok user search API, tutorial, reference. Links: creator social profiles API and reference. Emails: creator emails API and reference. The group hub is the creator contact API.
Vetting a channel with recent videos and comments is the creator vetting use case.