Scavio Tiktok

Look up TikTok profiles, search videos and users, explore hashtags, read comments, and traverse the social graph (followers/followings). Eleven endpoints, all at 1 credit per request.

Audits

Pass

Install

openclaw skills install scavio-tiktok

TikTok Profiles, Videos, Comments, Hashtags and Social Graph via Scavio

Search TikTok videos and users, look up profiles, read comments and replies, explore hashtags, and list followers/followings. Returns structured JSON with engagement stats, video metadata, and social graph data.

When to trigger

Use this skill when the user asks to:

  • Look up a TikTok creator's profile, follower count, or bio
  • Search TikTok for videos by keyword or topic
  • Search for TikTok users/creators
  • Get details, stats, or engagement metrics for a specific TikTok video
  • Read comments or replies on a TikTok video
  • Explore a hashtag's stats or trending videos
  • List a creator's followers or who they follow
  • Analyze TikTok trends, influencer reach, or content performance
  • Build RAG pipelines that need short-form video context

Setup

Get a free API key at https://scavio.dev (250 free credits/month, no card required):

export SCAVIO_API_KEY=sk_live_your_key

Workflow

  1. Resolving a username: most endpoints require a sec_user_id. Call /tiktok/profile with a username first, then use data.user.sec_uid for subsequent requests.
  2. Browsing a creator's videos: call /tiktok/user/posts with the sec_user_id. Use sort_type: "1" for most popular.
  3. Video deep-dive: call /tiktok/video with a video_id for full details including play URLs, cover images, and duration.
  4. Reading comments: call /tiktok/video/comments for top-level comments, then /tiktok/video/comments/replies with a comment_id for threaded replies.
  5. Searching: call /tiktok/search/videos or /tiktok/search/users with a keyword. Filter by publish_time and sort_type.
  6. Hashtag research: call /tiktok/hashtag by name to get the hashtag_id and view counts, then /tiktok/hashtag/videos to list videos under it.
  7. Social graph: call /tiktok/user/followers or /tiktok/user/followings with a sec_user_id.

Endpoints

EndpointCreditsDescription
POST https://api.scavio.dev/api/v1/tiktok/profile1Get user profile by username or sec_user_id
POST https://api.scavio.dev/api/v1/tiktok/user/posts1List a user's videos (paginated, sortable)
POST https://api.scavio.dev/api/v1/tiktok/video1Get full details for a single video
POST https://api.scavio.dev/api/v1/tiktok/video/comments1List comments on a video
POST https://api.scavio.dev/api/v1/tiktok/video/comments/replies1List replies to a specific comment
POST https://api.scavio.dev/api/v1/tiktok/search/videos1Search videos by keyword
POST https://api.scavio.dev/api/v1/tiktok/search/users1Search users by keyword
POST https://api.scavio.dev/api/v1/tiktok/hashtag1Get hashtag details and stats
POST https://api.scavio.dev/api/v1/tiktok/hashtag/videos1List videos for a hashtag
POST https://api.scavio.dev/api/v1/tiktok/user/followers1List a user's followers
POST https://api.scavio.dev/api/v1/tiktok/user/followings1List accounts a user follows
Authorization: Bearer $SCAVIO_API_KEY

Profile Parameters

ParameterTypeDefaultDescription
usernamestring--TikTok handle (without @). One of username or sec_user_id required.
sec_user_idstring--Secure user ID. One of username or sec_user_id required.

User Posts Parameters

ParameterTypeDefaultDescription
sec_user_idstringrequiredSecure user ID from profile endpoint
cursorstring"0"Pagination cursor. Use data.max_cursor from previous response.
countnumber20Results per page (1-30)
sort_typestring"0""0" = latest, "1" = popular

Video Detail Parameters

ParameterTypeDefaultDescription
video_idstringrequiredTikTok video ID

Video Comments Parameters

ParameterTypeDefaultDescription
video_idstringrequiredVideo ID
cursorstring"0"Pagination cursor
countnumber20Results per page (1-50)

Comment Replies Parameters

ParameterTypeDefaultDescription
video_idstringrequiredVideo ID
comment_idstringrequiredComment ID (cid from comments endpoint)
cursorstring"0"Pagination cursor
countnumber20Results per page (1-50)

Search Videos Parameters

ParameterTypeDefaultDescription
keywordstringrequiredSearch query (1-500 chars)
cursorstring"0"Pagination offset
countnumber20Results per page (1-30)
sort_typestring"0""0" = relevance, "1" = most likes
publish_timestring"0""0" = all time, "1" = last day, "7" = week, "30" = month, "90" = 3 months, "180" = 6 months

Search Users Parameters

ParameterTypeDefaultDescription
keywordstringrequiredSearch query (1-500 chars)
cursorstring"0"Pagination offset
countnumber20Results per page (1-30)

Hashtag Parameters

ParameterTypeDefaultDescription
hashtag_namestring--Hashtag text (without #). One of hashtag_name or hashtag_id required.
hashtag_idstring--Numeric hashtag ID. One of hashtag_name or hashtag_id required.

Hashtag Videos Parameters

ParameterTypeDefaultDescription
hashtag_idstringrequiredFrom hashtag info endpoint
cursorstring"0"Pagination cursor
countnumber20Results per page (1-30)

Followers / Followings Parameters

ParameterTypeDefaultDescription
sec_user_idstringrequiredFrom profile endpoint
countnumber20Results per page (1-20)
page_tokenstring--From previous response data.next_page_token
min_timenumber--From previous response data.min_time

Pagination Reference

StyleEndpointsNext pageStop condition
Cursor stringuser/postscursor = data.max_cursordata.has_more === 0
Offset numbersearch/*, hashtag/videos, video/comments, video/comments/repliescursor = data.cursordata.has_more === 0
Token + timeuser/followers, user/followingspage_token + min_timedata.has_more === false

Examples

import os, requests

BASE = "https://api.scavio.dev"
HEADERS = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}"}

# 1. Look up a profile
profile = requests.post(f"{BASE}/api/v1/tiktok/profile", headers=HEADERS,
    json={"username": "tiktok"}).json()

sec_uid = profile["data"]["user"]["sec_uid"]
print(f"{profile['data']['user']['nickname']}: {profile['data']['user']['follower_count']} followers")

# 2. List their most popular videos
posts = requests.post(f"{BASE}/api/v1/tiktok/user/posts", headers=HEADERS,
    json={"sec_user_id": sec_uid, "sort_type": "1", "count": 5}).json()

for v in posts["data"]["aweme_list"]:
    print(f"{v['desc'][:60]}  -- {v['statistics']['play_count']} views")

# 3. Get details for a specific video
video = requests.post(f"{BASE}/api/v1/tiktok/video", headers=HEADERS,
    json={"video_id": "7350810998023949599"}).json()

detail = video["data"]["aweme_detail"]
print(f"Likes: {detail['statistics']['digg_count']}, Comments: {detail['statistics']['comment_count']}")

# 4. Read comments on that video
comments = requests.post(f"{BASE}/api/v1/tiktok/video/comments", headers=HEADERS,
    json={"video_id": "7350810998023949599", "count": 10}).json()

for c in comments["data"]["comments"]:
    print(f"@{c['user']['unique_id']}: {c['text']}")

# 5. Search for videos
results = requests.post(f"{BASE}/api/v1/tiktok/search/videos", headers=HEADERS,
    json={"keyword": "cooking recipe", "count": 10, "publish_time": "7"}).json()

# 6. Explore a hashtag
tag = requests.post(f"{BASE}/api/v1/tiktok/hashtag", headers=HEADERS,
    json={"hashtag_name": "fyp"}).json()

tag_id = tag["data"]["challengeInfo"]["challenge"]["id"]
print(f"#{tag['data']['challengeInfo']['challenge']['title']}: {tag['data']['challengeInfo']['stats']['viewCount']} views")

# 7. List hashtag videos
tag_vids = requests.post(f"{BASE}/api/v1/tiktok/hashtag/videos", headers=HEADERS,
    json={"hashtag_id": tag_id, "count": 10}).json()

Profile Response

{
  "data": {
    "user": {
      "unique_id": "tiktok",
      "nickname": "TikTok",
      "sec_uid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM",
      "uid": "107955",
      "signature": "One TikTok can make a big impact",
      "bio_url": "linktr.ee/tiktok",
      "follower_count": 94066595,
      "following_count": 1,
      "aweme_count": 1511,
      "total_favorited": 458010199
    }
  },
  "response_time": 1428,
  "credits_used": 1,
  "credits_remaining": 6545
}

Video Detail Response

{
  "data": {
    "aweme_detail": {
      "aweme_id": "7350810998023949599",
      "desc": "im so sick of being tired im so tired of being sick",
      "create_time": 1711494099,
      "statistics": {
        "digg_count": 2002382,
        "comment_count": 8119,
        "play_count": 12171757,
        "share_count": 274978,
        "collect_count": 211332
      }
    }
  },
  "response_time": 1605,
  "credits_used": 1,
  "credits_remaining": 6544
}

Hashtag Response

{
  "data": {
    "challengeInfo": {
      "challenge": {
        "id": "229207",
        "title": "fyp",
        "desc": "",
        "stats": {
          "videoCount": 0,
          "viewCount": 119178100000000
        }
      }
    }
  },
  "response_time": 969,
  "credits_used": 1,
  "credits_remaining": 6543
}

Guardrails

  • All TikTok calls cost 1 credit each. Inform the user before paginating through many pages.
  • Never fabricate usernames, video captions, follower counts, or comment text. Only return API data.
  • Most endpoints require a sec_user_id, not a username. Always resolve via the profile endpoint first.
  • All create_time fields are Unix timestamps in seconds. Multiply by 1000 for JavaScript Date.
  • Avatar and image fields return an object with a url_list array. Use .url_list[0] for the URL.
  • Do not silently omit any data. Surface all fields so the user can decide what to use.

Failure handling

  • 401 means the API key is invalid or missing. Prompt the user to check their SCAVIO_API_KEY.
  • 429 means rate limit exceeded. Wait before retrying. See https://scavio.dev/docs/rate-limits.
  • 502 / 503 mean upstream is temporarily unavailable. Wait a few seconds before retrying.
  • If search returns no results, suggest different keywords, a broader publish_time, or a different sort_type.
  • If SCAVIO_API_KEY is not set, prompt the user to export it before continuing.

LangChain

pip install langchain-scavio
from langchain_scavio import ScavioSearchTool
tool = ScavioSearchTool(engine="tiktok")