Skip to content

TikTok Scraper

Try for free

Scrape public TikTok videos from profiles, hashtags, video URLs, and keyword search, plus comments. Get captions, play, like, share, and comment counts, music, and author details.

🎵 TikTok Scraper

Turn public TikTok profiles, hashtags, video URLs, and keyword searches into a dataset you can schedule and export.

For social listening, creator research, and catalog work that has to finish even when one account is private or one link is dead.

✨ Features

  • 👤 Profiles. Public videos and reposts, plus follower and following rows when you set a cap.
  • #️⃣ Hashtags. The videos on a tag, with the tag name and view count when TikTok sends them.
  • 🔗 Video URLs. A full URL or a short share link. Related videos are optional.
  • 🔎 Search. Top and video search. Each hit keeps the query that found it.
  • 💬 Comments. Top-level comments, and replies when you set a reply cap.
  • ⬇️ Files. Video, cover, slideshow images, avatar, music cover, and subtitles go to the key-value store only after the body starts with ftyp, JPEG, or WEBVTT.
  • 🌍 Country. Residential proxy, with proxyCountryCode when the audience is in one market.

🚀 Why teams use this

  • Request-based. One Chrome TLS session calls the same web JSON the TikTok page already uses. There is no browser to start.
  • A missing profile, a private account, or a dead URL is skipped and named in the run's status message and the OUTPUT record (failedInputs). The rest of the input still runs, and no placeholder rows land in your dataset.
  • A field TikTok did not send stays off the item. A real 0 stays 0.
  • A CDN address inside videoMeta is not treated as a downloaded file. The store gets a file only after the magic-byte check.

💡 Use cases

  • Track trending videos for a hashtag or keyword.
  • Benchmark creators by plays, likes, shares, and follower counts.
  • Collect comments on videos for audience research.

🧪 Example input

{
  "hashtags": [
    "fyp"
  ],
  "resultsPerPage": 100
}

🧾 Sample output

One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.

{
  "id": "7600000000000000000",
  "text": "#tiktok #sシ゚viral #tvshow #edit #foryou ",
  "textLanguage": "un",
  "createTime": 1773414677,
  "createTimeISO": "2026-03-13T15:11:17.000Z",
  "webVideoUrl": "https://www.tiktok.com/@example_creator/video/7600000000000000000",
  "isAd": false,
  "authorMeta": {
    "id": "7000000000000000000",
    "name": "example_creator",
    "profileUrl": "https://www.tiktok.com/@example_creator",
    "verified": false,
    "privateAccount": false,
    "nickName": "fyp",
    "avatar": "https://p16-common-sign.tiktokcdn.com/…",
    "following": 44,
    "fans": 580200,
    "video": 594,
    "heart": 6900000,
    "digg": 139,
    "friends": 0,
    "originalAvatarUrl": "https://p16-common-sign.tiktokcdn.com/…"
  },
  "musicMeta": {
    "musicName": "original sound",
    "musicAuthor": "fyp",
    "playUrl": "https://v58.tiktokcdn.com/…",
    "coverMediumUrl": "https://p16-common-sign.tiktokcdn.com/…",
    "musicOriginal": true,
    "musicId": "7600000000000000001",
    "originalCoverMediumUrl": "https://p16-common-sign.tiktokcdn.com/…"
  },
  "videoMeta": {
    "height": 1280,
    "width": 720,
    "duration": 500,
    "coverUrl": "https://p16-common-sign.tiktokcdn.com/…",
    "originalCoverUrl": "https://p16-common-sign.tiktokcdn.com/…",
    "definition": "720p",
    "format": "mp4",
    "subtitleLinks": [
      {
        "language": "…",
        "downloadLink": "…",
        "tiktokLink": "…"
      },
      {
        "language": "…",
        "downloadLink": "…",
        "tiktokLink": "…"
      }
    ],
    "downloadAddr": "https://v16-webapp-prime.tiktok.com/video/…"
  },
  "mediaUrls": [
    "https://v16-webapp-prime.tiktok.com/video/…",
    "https://v16-webapp-prime.tiktok.com/video/…"
  ],
  "diggCount": 259900,
  "shareCount": 3034,
  "playCount": 7000000,
  "commentCount": 1869,
  "collectCount": 26000,
  "repostCount": 0,
  "hashtags": [
    {
      "id": "23428",
      "name": "tiktok",
      "title": "tiktok"
    },
    {
      "id": "7084597372034121755",
      "name": "sシ゚viral",
      "title": "sシ゚viral"
    }
  ],
  "effectStickers": [
    {
      "ID": "337296253",
      "name": "Light foundation",
      "stickerStats": {
        "useCount": "…"
      }
    },
    {
      "ID": "263840",
      "name": "Green Screen",
      "stickerStats": {
        "useCount": "…"
      }
    }
  ],
  "isSlideshow": false,
  "input": "fyp",
  "isStory": false,
  "searchHashtag": {
    "name": "fyp",
    "views": 129765185180711
  }
}

📥 Input

Give at least one of profiles, hashtags, postURLs, or searchQueries. resultsPerPage caps each of those.

Profiles: profileScrapeSections (videos or reposts), profileSorting (latest or popular), excludePinnedPosts, oldestPostDateUnified, newestPostDate, mostDiggs, leastDiggs, maxFollowersPerProfile, maxFollowingPerProfile.

Hashtags and posts: scrapeAdditionalAuthorMeta refetches author fields the list left out. scrapeRelatedVideos adds related items for a direct URL.

Search: searchSection empty for top results or /video for video results, plus videoSearchSorting and videoSearchDateFilter (TikTok's logged-out search ignores both, so the actor applies them itself: the date filter drops older videos and sorting re-orders up to 3x your limit of matching videos).

Comments: commentsPerPost, topLevelCommentsPerPost, maxRepliesPerComment.

Downloads: shouldDownloadVideos, shouldDownloadCovers, shouldDownloadSlideshowImages, shouldDownloadAvatars, shouldDownloadMusicCovers, videoKvStoreIdOrName, and downloadSubtitlesOptions set to DOWNLOAD_SUBTITLES.

proxyCountryCode selects the residential country; with None keyword searches run from Canada so repeated runs see the same ranking, and other inputs use any residential exit. aiVideoDescription and aiVideoSummary are on the form, and this actor does not emit them. TikTok's payload does not include those texts.

📤 Output

A video item includes a field only when TikTok sent it: id, text, textLanguage, createTime, createTimeISO, webVideoUrl, isAd, isSlideshow, isStory, authorMeta, musicMeta, videoMeta (including downloadAddr and subtitleLinks), mediaUrls, diggCount, shareCount, playCount, commentCount, collectCount, repostCount, hashtags, effectStickers, locationMeta, comments, commentsDatasetUrl, input, searchHashtag, and searchQuery.

authorMeta can include id, name, nickName, profileUrl, verified, signature, bioLink, fans, following, video, avatar, privateAccount, and ttSeller. Follower and following rows use connectionType follower or following and are stored in their own dataset.

A failed target does not create a dataset row. It is listed in the run's OUTPUT key-value record as failedInputs: [{input, reason, code, url}] and summarised in the status message. reason is a short text such as a private profile or a missing post; it does not include a response body.

💰 Pricing

Pay per event, plus platform usage (compute and residential proxy traffic):

  • Result: $0.0035 per saved video or post row ($3.50 per 1,000).
  • Comment: $0.0008 per comment saved (only when you ask for comments).
  • Follower / following row: $0.0024 per row (only when you set a follower or following cap).
  • Date filter: $0.0008 per result when oldestPostDateUnified, newestPostDate or videoSearchDateFilter filters the results.
  • Popularity filter: $0.0008 per result when leastDiggs or mostDiggs filters the results.
  • Video download: $0.0008 per video file stored in the key-value store.

Failed inputs (private profiles, dead links) are never charged. Example: 1,000 results with no add-ons ≈ $3.50 in event fees plus about $0.03 of platform usage (measured: 20 hashtag videos used $0.0006). Downloaded video files add their proxy traffic (a 3 MB video used about $0.006).

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.