TikTok API: search videos, read details and comments
To look into what TikTok says about a topic, work in three steps: search posts by keyword and take a post's ID (video_id, also called aweme_id on TikTok), read that video's detail with the ID, then read its comments. Every step below is a real endpoint with real parameters.
A new account gets 50 trial calls; after that, successful calls are billed from a prepaid balance. See pricing.
From a keyword to a video's comments in three calls
Replace the keyword nike in the examples with your own. The video_id in steps 2 and 3 is a placeholder: use a post ID from the step 1 results, or the number in a post link, tiktok.com/@user/video/<ID>. You need an API key, and a new account has 50 trial calls.
Search posts by keyword
sort is general for relevance (the default) or most_liked; publish_time limits how recent the posts are (for example week); region is a two-letter uppercase country code, US by default. To turn pages, pass back the cursor from the previous page; adjacent pages may repeat a few posts, so deduplicate by id. No results answers empty.
TikTok video search
GET /v1/raw/tiktok/searchcurl 'https://api.qovia.ai/v1/raw/tiktok/search?keyword=nike®ion=US' \ -H "Authorization: Bearer $QOVIA_KEY"
import os import requests resp = requests.get( "https://api.qovia.ai/v1/raw/tiktok/search", params={"keyword": "nike", "region": "US"}, headers={"Authorization": f"Bearer {os.environ['QOVIA_KEY']}"}, timeout=30, ) resp.raise_for_status() body = resp.json() print(body["meta"]["charged_usd"], body["data"])
The data in the response. The sample comes from the endpoint catalog, not live data; lists are cut to their first two entries and picture links are left out:
{ "data": { "items": [ { "id": "soc_tik_9e48546cd716", "src": "social", "platform": "tiktok", "lang": "en", "text": "Nike mind 001 🔥🔥🔥 #fyp #sneakers #streetwear #streetwear #nike ", "author": { "uid_hash": "e3ccd58d819c", "followers": 2950, "nickname": "Q***y", "uid": "7000000000000000004", "sec_uid": "MS4wLjABAAAAexampleTikTokUserSecUid0000000000000004", "unique_id": "example.user.4" }, "metrics": { "likes": 19, "comments": 0, "shares": 0, "saves": 0, "plays": 4281 }, "extra": { "source_id": "7699038487848193282", "published_at": "2026-10-21T08:41:33+00:00", "video_dur_s": 11, "topic": "#fyp", "topics": [ "fyp", "sneakers", "streetwear", "nike" ], "topic_ids": { "fyp": "229207", "sneakers": "64092", "streetwear": "315492", "nike": "9789" }, "content_type": "video", "url": "https://www.tiktok.com/@example.user.4/video/7699038487848193282" }, "prov": { "hash": "0xe14a962a80ca2a5d", "ts": "2026-10-21T23:15:00+08:00", "source": "live" } }, { "id": "soc_tik_56aaf63cda54", "src": "social", "platform": "tiktok", "lang": "pt", "text": "Tênis Nike 😍 #airmax95 #nikesneakers #nikeairmax #sporlife #nike ", "author": { "uid_hash": "b04c374c292e", "followers": 8456, "nickname": "T***🥇", "uid": "7000000000000000005", "sec_uid": "MS4wLjABAAAAexampleTikTokUserSecUid0000000000000005", "unique_id": "example.user.5" }, "metrics": { "likes": 1071, "comments": 6, "shares": 69, "saves": 92, "plays": 9423 }, "extra": { "source_id": "7698432825535663381", "published_at": "2026-10-19T17:31:23+00:00", "video_dur_s": 15, "topic": "#airmax95", "topics": [ "airmax95", "nikesneakers", "nikeairmax", "sporlife", "nike" ], "topic_ids": { "airmax95": "3514896", "nikesneakers": "3746670", "nikeairmax": "702042", "sporlife": "43175617", "nike": "9789" }, "content_type": "video", "url": "https://www.tiktok.com/@example.user.5/video/7698432825535663381" }, "prov": { "hash": "0x594f2ae067a753d1", "ts": "2026-10-21T23:15:00+08:00", "source": "live" } } ], "cursor": 20, "has_more": true, "prov": { "hash": "0xa1565bda8147e52a", "ts": "2026-10-21T23:15:00+08:00", "source": "live" } } }Read one video's detail
video_id is a 15 to 20 digit number, the same ID as in the search records (extra.source_id). The ID in the example is only a placeholder: use a post ID returned by step 1. You get the caption, author, play, like, comment, share and save counts and hashtags. A post that does not exist or was deleted answers 404.
TikTok video detail
GET /v1/raw/tiktok/videocurl 'https://api.qovia.ai/v1/raw/tiktok/video?video_id=7688834577418194206' \ -H "Authorization: Bearer $QOVIA_KEY"
Page through the comments
Returns the post's first-level comments, with count up to 50 a page. cursor is 0 for the first page; then pass back the cursor from the previous page, and stop when has_more is false. The video_id in the example is a placeholder. Replies under a comment come from raw.tiktok.comment_replies. A post without comments answers empty.
TikTok video comments
GET /v1/raw/tiktok/commentscurl 'https://api.qovia.ai/v1/raw/tiktok/comments?video_id=7688834577418194206' \ -H "Authorization: Bearer $QOVIA_KEY"
More endpoints for this
FAQ
Where does video_id come from?
From the post ID in the records of search (raw.tiktok.search), or from the number in a post link, tiktok.com/@user/video/<ID>. Search, video detail and comments all use the same ID.
How do I read the replies under a comment?
The comments endpoint returns first-level comments only. Pass a comment's cid as comment_id, with the video_id, to raw.tiktok.comment_replies, which also pages with cursor.
Can I look at one creator's videos?
Yes. raw.tiktok.user_search finds creators by keyword, raw.tiktok.creator reads a profile and raw.tiktok.creator_videos lists their posts as the same records and IDs as video detail. They are listed under more endpoints on this page.
How is it billed?
A new account gets 50 trial calls; after that, calls are billed from a prepaid balance, and only successful calls that return data are charged. Empty results and errors are not, and meta.charged_usd in each response says what the call cost. Each endpoint's price is in the API reference, and the plans are on the pricing page.
Your agent only knows what you give it
Give it Douyin, Xiaohongshu (RedNote), WeChat and product reviews: structured, per call, nothing charged for failures.