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.

  1. 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 searchGET /v1/raw/tiktok/search

    cURL
    curl 'https://api.qovia.ai/v1/raw/tiktok/search?keyword=nike&region=US' \
      -H "Authorization: Bearer $QOVIA_KEY"
    Python
    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:

    200 OK
    {
      "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"
        }
      }
    }
  2. 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 detailGET /v1/raw/tiktok/video

    cURL
    curl 'https://api.qovia.ai/v1/raw/tiktok/video?video_id=7688834577418194206' \
      -H "Authorization: Bearer $QOVIA_KEY"
  3. 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 commentsGET /v1/raw/tiktok/comments

    cURL
    curl '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.