Tokfluence
Tokfluence
API Docs
API reference

Creators

Creators are TikTok accounts indexed by Tokfluence, with stats, contact info, and cross-platform presence baked in.

Run the same filtered search the Tokfluence app uses. Results are paginated; per_page caps at 100.

Query parameters

ParamTypeNotes
querystringFree text matched against usernames, tags, mentions, and bios. An exact or partial handle ranks first, so query=mbellucci finds @mbellucci6.
niche_levelstringHow 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_followersintInclusive lower bound.
max_followersintInclusive upper bound.
min_engagement_ratefloat0–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_engagementboolWith 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).
genderstringmale, 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.
brandbooltrue returns brand/business accounts only; false excludes them. Omit to include both.
is_tiktok_verifiedboolVerified accounts only.
has_emailbooltrue: 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_phonebooltrue: 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_linkedboolHas a discoverable YouTube channel.
has_instagram_linkedboolHas a discoverable Instagram profile.
analyzed_within_daysintOnly 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.
sortstringfollower_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).
pageintDefaults to 1. page × per_page cannot exceed 10,000 — see paging past 10,000.
per_pageintDefaults to 20, max 100.
cursorstringSwitches 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.
includestringComma-separated extra embeds. Currently only recent_posts: pass include=recent_posts to embed each creator's latest posts. Costs no extra credit.

Example

bash
curl "https://developers.tokfluence.com/v1/creators/search?query=fitness&min_followers=50000&regions[]=US" \
  -H "Authorization: Bearer $TOKEN"

Response

json
{
  "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.

bash
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

ParamTypeNotes
idstringStable Tokfluence creator id (tkc_).
usernamestringCurrent TikTok username.
biostringProfile biography text.
picturestringProfile 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.
regionstringISO-3166 alpha-2, derived from creator location or top audience country.
verifiedboolTikTok verified badge.
brandbooltrue when the account is a brand/business rather than an individual creator.
genderstringmale, 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_emailboolWhether any contact email is known. Useful as a filter without parsing the array.
contact_emailstringPrimary contact email when known, else null.
contact_emailsstring[]All known contact emails, deduplicated.
has_phoneboolWhether any contact phone is known. Useful as a filter without parsing the array.
contact_phonestringPrimary contact phone when known, else null.
contact_phonesstring[]All known contact phones, deduplicated.
follower_countintTikTok followers.
average_views_per_videointMean views per video. null when we've analyzed fewer than 3 videos, since an average off one or two clips isn't meaningful.
engagement_ratefloat0–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_weekfloatPosts per week. 0 is a real quiet period; null when we hold no posting cadence for the creator.
video_countintTotal TikTok videos.
total_likesintLifetime hearts across all videos.
audience_regionsobject[]Top audience countries with share.
last_analyzed_atstringISO 8601 timestamp of when we last refreshed this creator's rollup.
hashtagsstring[]Hashtags from the creator's posts, most used first, without the #.
mentionsstring[]@-mentions from the creator's posts, most used first, without the @.
youtubeobjectLinked YouTube channel info, or null.
instagramobjectLinked Instagram profile info, or null.
recent_postsobject[]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.
Contact details are included by default
No separate "reveal" call needed. Every 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.

bash
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

ParamTypeNotes
limitintDefaults to 24, max 50.
Live data — may take a few seconds
This endpoint hits TikTok via our proxy network on cold cache, so it costs 25 credits and can take a few seconds the first time you ask for a creator. On a warm cache it returns immediately. When we last analysed the creator long ago, this call puts them in our scrape queue and the response is 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.
bash
curl "https://developers.tokfluence.com/v1/creators/wwe/posts?limit=10" \
  -H "Authorization: Bearer $TOKEN"