Creators are TikTok accounts indexed by Tokfluence, with stats, contact info, and cross-platform presence baked in.
GET/v1/creators/search#
Run the same filtered search the Tokfluence app uses. Results are paginated; per_page caps at 100.
Query parameters
| Param | Type | Notes |
|---|---|---|
query | string | Free text matched against usernames, tags, mentions, and bios. An exact or partial handle ranks first, so query=mbellucci finds @mbellucci6. |
niche_level | string | How committed to the topic a creator must be. Governs both query and hashtags[] matching: wide (used the term once), balanced (self-identifies in bio or it recurs in top posts), niche (recurs in top post hashtags), laser (both). Defaults to balanced; pass wide for the previous broad behavior. |
min_followers | int | Inclusive lower bound. |
max_followers | int | Inclusive upper bound. |
min_engagement_rate | float | 0–1 fraction, matching the engagement_rate field in the response. e.g. 0.03 for 3%. Compared in whole percents, so 0.035 acts as 0.04. Creators above 35% are excluded. So are creators we have never measured (engagement_rate null), unless you pass include_unknown_engagement=true. |
include_unknown_engagement | bool | With min_engagement_rate, also keep creators we have never measured; they come back with engagement_rate: null. Creators measured below your minimum stay out; a few old ones are only caught after the search, so a page can hold fewer rows than per_page, and meta.excluded_below_min_engagement says how many were left out. Defaults to false. |
regions[] | string[] | ISO-3166 alpha-2 country codes (uppercase). |
gender | string | male, female, humans (either), no_face, no_picture, artificial_intelligence. An estimated presentation category, inferred by a model from the profile picture. It is not the creator's sex or gender identity, and it is sometimes wrong. Do not use it to make discriminatory or eligibility decisions about a person. |
brand | bool | true returns brand/business accounts only; false excludes them. Omit to include both. |
is_tiktok_verified | bool | Verified accounts only. |
has_email | bool | true: only creators with a contact email. false: only creators without one. Each profile with contact details costs 1 credit, so this is how you control what a page costs. |
has_phone | bool | true: only creators with a contact phone number (parsed from the TikTok bio). false: only creators without one. |
hashtags[] | string[] | Without the # prefix. Several values are OR: a creator needs to match one. At balanced (the default) a value matches a word in the creator's bio, or one of the hashtags that recur in their top posts. niche_level sets the bar for each value. |
mentions[] | string[] | Without the @ prefix. |
has_youtube_linked | bool | Has a discoverable YouTube channel. |
has_instagram_linked | bool | Has a discoverable Instagram profile. |
analyzed_within_days | int | Only creators we last analysed within this many days, 1 to 365. analyzed_within_days=60 leaves out profiles whose stats are more than two months old. This is when we last read the profile (the last_analyzed_at field), not when the creator last posted. Any other value is a 422 invalid_parameter, and is not charged. |
sort | string | follower_count_desc, engagement_rate_desc, posts_per_week_desc, average_views_per_video_desc, last_analyzed_at_desc, or any of these with _asc. Engagement sorts only include creators with a measured, credible rate (35% or below). |
page | int | Defaults to 1. page × per_page cannot exceed 10,000 — see paging past 10,000. |
per_page | int | Defaults to 20, max 100. |
cursor | string | Switches to cursor pagination, which has no depth limit. Send it empty (cursor=) on the first call, then pass back the meta.next_cursor from the previous response. Leave the parameter out entirely for page-based paging. |
include | string | Comma-separated extra embeds. Currently only recent_posts: pass include=recent_posts to embed each creator's latest posts. Costs no extra credit. |
Example
curl "https://developers.tokfluence.com/v1/creators/search?query=fitness&min_followers=50000®ions[]=US" \
-H "Authorization: Bearer $TOKEN"Response
{
"data": [
{
"id": "tkc_a1b2c3d4e5f6a7b8",
"username": "alice",
"bio": "Daily home workouts.",
"picture": "https://...",
"region": "US",
"verified": false,
"brand": false,
"gender": "female",
"has_email": true,
"contact_email": "alice@example.com",
"contact_emails": ["alice@example.com", "press@alice.tv"],
"has_phone": true,
"contact_phone": "+15551234567",
"contact_phones": ["+15551234567"],
"follower_count": 142000,
"average_views_per_video": 38000,
"engagement_rate": 0.052,
"posts_per_week": 4.2,
"video_count": 240,
"total_likes": 7500000,
"audience_regions": [{"id": "US", "share": 0.62}],
"last_analyzed_at": "2026-05-19T11:02:17.553Z",
"hashtags": ["fitness", "homeworkout"],
"mentions": ["nike"],
"youtube": {
"subscribers": 12000,
"channel_url": "https://youtube.com/@alice",
"country": "US",
"verified": true,
"video_count": 90,
"views": 4000000
},
"instagram": null
}
],
"meta": {
"page": 1,
"per_page": 20,
"total": 412,
"total_pages": 21,
"max_page": 500,
"age_filter": {
"enabled": true,
"excluded_likely_minors": 0,
"excluded": [],
"note": "Creators whose own bio states an age under 18 are left out. …"
}
}
}Creators who state they are under 18
Every search endpoint (/v1/creators/search, /v1/ai_search and
/v1/creators/semantic_search) leaves out creators whose own bio states an age under
18, and lists each one it left out in meta.age_filter.excluded with the words that
decided it. The index holds no age field, so this is read from the bio. A creator who states no
age is neither checked nor cleared. The filter runs on the page after the search, so a page can
hold fewer rows than per_page, and meta.total is not reduced for it.
The filter is always on and no parameter turns it off. Single-creator lookups apply it too:
GET /v1/creators/:id and GET /v1/creators/:id/posts answer a creator
whose bio states an age under 18 with 404 creator_not_found, exactly as for a
creator we do not hold, and you are not charged.
Paging past 10,000 results
Page-based paging reads the first 10,000 matches of a search. meta.max_page
tells you where that ceiling falls at your page size; asking for a page beyond it returns
422 page_out_of_range rather than an empty list, so a truncated crawl is never
mistaken for an exhausted one.
To read a result set larger than that, pass cursor instead of page.
Each response carries a meta.next_cursor; feed it back to get the next slice.
Results are ordered by your sort (default follower_count_desc) with a
stable tiebreaker, so no creator is skipped or repeated across the walk. When
next_cursor comes back null, you have reached the end.
Start the walk with an empty cursor, as the loop below does. A cursor is the sort
position of the last creator you received. It holds nothing on our side, so it does not expire
and still works the next day. The index is live, though: a creator whose follower count changes
between your calls can move across your position, so a walk spread over days can skip or repeat
a few creators.
cursor=""
while :; do
page=$(curl -sG "https://developers.tokfluence.com/v1/creators/search" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "regions[]=BG" \
--data-urlencode "min_followers=5000" \
--data-urlencode "cursor=$cursor")
echo "$page" | jq -r '.data[].username'
cursor=$(echo "$page" | jq -r '.meta.next_cursor // empty')
[ -z "$cursor" ] && break # no cursor back = end of the result set
done
Cursor calls are priced the same way as page-based calls, and each returns up to
per_page creators.
A search call costs 1 credit, plus 1 per profile with contact details it returns.
Profiles without contact details are free, and an empty page costs nothing. Use has_email
to control the cost: has_email=true returns only creators you can email,
has_email=false&has_phone=false only creators without contact details, at 1 credit a page.
See search billing.
Field reference
| Param | Type | Notes |
|---|---|---|
id | string | Stable Tokfluence creator id (tkc_). |
username | string | Current TikTok username. |
bio | string | Profile biography text. |
picture | string | Profile picture URL. For creators we analysed in 2025 or later it is a copy on our own storage with no expiry. Older entries, such as creators last analysed in 2020, can still carry TikTok's own URL, which may have expired; see the FAQ. |
region | string | ISO-3166 alpha-2, derived from creator location or top audience country. |
verified | bool | TikTok verified badge. |
brand | bool | true when the account is a brand/business rather than an individual creator. |
gender | string | male, female, no_face, no_picture, artificial_intelligence or other. An estimated presentation category, inferred by a model from the profile picture. It is not the creator's sex or gender identity, and it is sometimes wrong. Do not use it to make discriminatory or eligibility decisions about a person. |
has_email | bool | Whether any contact email is known. Useful as a filter without parsing the array. |
contact_email | string | Primary contact email when known, else null. |
contact_emails | string[] | All known contact emails, deduplicated. |
has_phone | bool | Whether any contact phone is known. Useful as a filter without parsing the array. |
contact_phone | string | Primary contact phone when known, else null. |
contact_phones | string[] | All known contact phones, deduplicated. |
follower_count | int | TikTok followers. |
average_views_per_video | int | Mean views per video. null when we've analyzed fewer than 3 videos, since an average off one or two clips isn't meaningful. |
engagement_rate | float | 0–1, e.g. 0.052 = 5.2%. null when unknown, or when the underlying sample yields a rate above 35%, which we treat as not credible (real engagement measured from creators' posts stays under 20%). |
posts_per_week | float | Posts per week. 0 is a real quiet period; null when we hold no posting cadence for the creator. |
video_count | int | Total TikTok videos. |
total_likes | int | Lifetime hearts across all videos. |
audience_regions | object[] | Top audience countries with share. |
last_analyzed_at | string | ISO 8601 timestamp of when we last refreshed this creator's rollup. |
hashtags | string[] | Hashtags from the creator's posts, most used first, without the #. |
mentions | string[] | @-mentions from the creator's posts, most used first, without the @. |
youtube | object | Linked YouTube channel info, or null. |
instagram | object | Linked Instagram profile info, or null. |
recent_posts | object[] | Up to 12 of the posts we hold for the creator, newest first by published_at, with stats (same shape as the posts endpoint). Empty when we hold none. Pinned posts are not marked, and no field tells a video from a photo post. Always present on GET /v1/creators/:id; in search only when you pass include=recent_posts. |
creators.search or creators.show response includes whatever emails and phone numbers we have on file. In search, each profile with contact details costs 1 credit on top of the call's 1. Use has_email=true or has_phone=true to narrow down to creators who actually have one, or false for creators without.
GET/v1/creators/:id#
Fetch a single creator's profile. :id can be a TikTok username (e.g. wwe) or a Tokfluence creator ID (tkc_…). The response carries every search field plus a recent_posts array of the creator's latest posts.
It returns what we hold and does not re-analyse the creator, so last_analyzed_at does not move. Calling recent posts on a creator we analysed long ago puts them in our scrape queue.
curl "https://developers.tokfluence.com/v1/creators/wwe" \
-H "Authorization: Bearer $TOKEN"GET/v1/creators/:id/posts#
Returns the creator's recent TikTok posts with stats, hashtags, mentions, and music metadata.
Query parameters
| Param | Type | Notes |
|---|---|---|
limit | int | Defaults to 24, max 50. |
202 with code: "analysis_pending" and a Retry-After header. The queue can take longer than Retry-After suggests. You are not charged for the 202 — the credits come back. Retry after the suggested delay and the warm-cache hit will be billed normally.
curl "https://developers.tokfluence.com/v1/creators/wwe/posts?limit=10" \
-H "Authorization: Bearer $TOKEN"