TikTok Scraper avatar

TikTok Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
TikTok Scraper

TikTok Scraper

Scrape TikTok videos by hashtag or profile: captions, views, likes, comments, shares, music, and author stats. No login needed. Export to JSON, CSV, or Excel.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Donjuan

Donjuan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

TikTok Scraper: videos, stats, authors, and music from hashtags and profiles

TikTok Scraper collects public TikTok posts for any hashtag or profile you give it. For every post you get the caption, publish date, view, like, comment, share, save, and repost counts, the author's profile and follower stats, the sound used, video details, subtitles, location tags, mentions, and hashtags. For hashtags you also get the total view count of the hashtag itself.

You don't need a TikTok account, an API key, or any code. Type in hashtags, profiles, or both, press Start, and download the results as JSON, CSV, Excel, XML, or HTML. Or pull them straight into your app through the Apify API.

What can you do with TikTok data?

  • Track trends. See which videos lead a hashtag right now, how many views they have, and which sounds and effects they use.
  • Monitor creators and brands. Pull the latest, most viewed, or oldest videos of any public profile, plus the posts it reposted, and track how each one performs.
  • Find creators and influencers. Every post comes with the author's follower count, total likes, video count, bio, and verified badge, so you can shortlist creators for a campaign without opening hundreds of profiles.
  • Measure a campaign. Run your branded hashtag on a schedule and watch views, likes, and shares grow over time. The hashtag's total view count comes with every result.
  • Research competitors. See who posts under your competitors' hashtags, what they say, and how their audience reacts.
  • Study content and language. Captions, detected caption language, subtitles, and hashtags give you clean text for topic analysis, sentiment analysis, or training data.
  • Pick music. Each post names its sound, the artist, the album, and whether the sound is original, so you can spot tracks that are taking off.
  • Build datasets for research. Export thousands of rows to a spreadsheet or a database for academic or market research.

What data does TikTok Scraper extract?

GroupFields
PostID, URL, caption text, caption language, publish time (Unix and ISO 8601), ad flag, pinned flag, slideshow flag
Engagementviews, likes, comments, shares, saves (bookmarks), reposts
Authoruser ID, username, display name, profile URL, avatar, bio, verified badge, private account flag, followers, following, friends, total likes received, likes given, number of videos
Musicsound name, artist, album, sound ID, original sound flag, audio URL, cover image
Videowidth, height, duration, quality (for example 720p), format, cover image, video file URL
Subtitleslanguage, source (machine translation or speech recognition), version, link to the subtitle file
Locationplace name, address, city, location ID, TikTok's city and country IDs (geotagged posts only)
Text entitieshashtags with their TikTok IDs, mentioned users with ID, username, profile URL, and secUid
Effectseffect and sticker names and IDs used in the video
Slideshowslinks to every image in photo posts
Hashtagthe hashtag name and its total views across TikTok (hashtag inputs)
Profile sectionwhether a post is one of the profile's own videos or a repost (profile inputs)

How to scrape TikTok hashtags and profiles

  1. Open the actor and go to the Input tab.
  2. Add hashtags, profiles, or both. For a hashtag, write cats, #cats, or paste https://www.tiktok.com/tag/cats. For a profile, write nasa, @nasa, or paste https://www.tiktok.com/@nasa.
  3. For profiles, pick the sections (videos, reposts, or both) and the video order.
  4. Set Posts per hashtag or profile and turn on any downloads you want.
  5. Press Start. When the run finishes, open the Output tab to preview the table, or press Export to download the data.

Input

FieldTypeDescription
hashtagsarray of stringsHashtags to scrape. Accepts cats, #cats, or a full https://www.tiktok.com/tag/cats URL.
profilesarray of stringsProfiles to scrape. Accepts nasa, @nasa, or a full https://www.tiktok.com/@nasa URL. Add hashtags, profiles, or both.
profileScrapeSectionsarray of stringsvideos, reposts, or both. Defaults to ["videos"].
profileSortingstringlatest, popular, or oldest: the order of a profile's videos. Defaults to latest. Reposts always come newest first.
resultsPerPageintegerThe maximum number of posts per hashtag and per profile. A profile's sections share the limit: videos first, then reposts.
excludePinnedPostsbooleanSkip posts the author pinned. Skipped posts don't count toward the limit.
shouldDownloadCoversbooleanSave video cover images to the run's key-value store.
shouldDownloadSlideshowImagesbooleanSave every image of photo (slideshow) posts.
shouldDownloadAvatarsbooleanSave author profile pictures.
shouldDownloadMusicCoversbooleanSave the cover images of sounds.
downloadSubtitlesOptionsstringNEVER_DOWNLOAD_SUBTITLES or DOWNLOAD_SUBTITLES.
proxyCountryCodestringA two-letter country code such as US or DE to browse TikTok through Apify residential proxy in that country. None uses Apify datacenter proxy.

Input example

{
"hashtags": ["cats", "#dogsoftiktok", "https://www.tiktok.com/tag/petsoftiktok"],
"profiles": ["nasa", "https://www.tiktok.com/@natgeo"],
"profileScrapeSections": ["videos", "reposts"],
"profileSorting": "popular",
"resultsPerPage": 50,
"excludePinnedPosts": true,
"shouldDownloadCovers": true,
"shouldDownloadSlideshowImages": false,
"shouldDownloadAvatars": false,
"shouldDownloadMusicCovers": false,
"downloadSubtitlesOptions": "DOWNLOAD_SUBTITLES",
"proxyCountryCode": "None"
}

Output

Every post becomes one item in the dataset. The field layout matches the popular TikTok scrapers on Apify (authorMeta, musicMeta, videoMeta, and so on), so you can swap this actor into an existing pipeline without rewriting it.

Output example

Below is a real post from the #cats hashtag with cover, avatar, music cover, and subtitle downloads turned on. Long links are shortened.

{
"id": "7583279464440777998",
"text": "#cutecat #funnyvideos #funny #cat #catsoftiktok ",
"textLanguage": "un",
"createTime": 1765619988,
"createTimeISO": "2025-12-13T09:59:48.000Z",
"webVideoUrl": "https://www.tiktok.com/@yycats8/video/7583279464440777998",
"isAd": false,
"authorMeta": {
"id": "7496296259767665706",
"name": "yycats8",
"profileUrl": "https://www.tiktok.com/@yycats8",
"nickName": "Didpet",
"verified": false,
"privateAccount": false,
"signature": "🐱My name is Yuanyuan\nI love parkour and get jealous easily\nThank your follow❤️",
"avatar": "https://api.apify.com/v2/key-value-stores/aBcD1234eFgH5678i/records/avatar-7496296259767665706",
"originalAvatarUrl": "https://p16-common-sign.tiktokcdn-eu.com/tos-maliva-avt-0068/...",
"following": 95,
"fans": 297000,
"video": 285,
"heart": 14300000,
"digg": 886,
"friends": 0
},
"musicMeta": {
"musicName": "The Winner Is... - DeVotchKa Version",
"musicAuthor": "DeVotchKa",
"musicOriginal": false,
"musicAlbum": "The Winner Is... - DeVotchKa Version",
"musicId": "7268735501090539521",
"playUrl": "https://sf16-music.tiktokcdn-eu.com/obj/tos-alisg-ve-2774/...",
"coverMediumUrl": "https://api.apify.com/v2/key-value-stores/aBcD1234eFgH5678i/records/music-cover-7268735501090539521",
"originalCoverMediumUrl": "https://p77-sg.tiktokcdn.com/aweme/200x200/tos-alisg-v-2774/..."
},
"videoMeta": {
"height": 1280,
"width": 720,
"duration": 13,
"coverUrl": "https://api.apify.com/v2/key-value-stores/aBcD1234eFgH5678i/records/cover-7583279464440777998",
"originalCoverUrl": "https://p19-common-sign.tiktokcdn-eu.com/tos-useast5-p-0068-...",
"definition": "720p",
"format": "mp4",
"downloadAddr": "https://v16-webapp-prime.tiktok.com/video/tos/alisg/...",
"subtitleLinks": [
{
"language": "eng-US",
"tiktokLink": "https://v19-webapp.tiktokcdn-eu.com/d56585b611d7e7d78558ba76...",
"downloadLink": "https://api.apify.com/v2/key-value-stores/aBcD1234eFgH5678i/records/subtitle-7583279464440777998-eng-US",
"source": "MT",
"version": "4"
},
{
"language": "kor-KR",
"tiktokLink": "https://v19-webapp.tiktokcdn-eu.com/c005fbda84cc7e85d6b3ed23...",
"downloadLink": "https://api.apify.com/v2/key-value-stores/aBcD1234eFgH5678i/records/subtitle-7583279464440777998-kor-KR",
"source": "ASR",
"version": "1:whisper_lid"
}
]
},
"diggCount": 105000,
"shareCount": 35200,
"playCount": 2000000,
"commentCount": 1027,
"collectCount": 6741,
"repostCount": 0,
"mentions": [],
"detailedMentions": [],
"hashtags": [
{ "id": "34199", "name": "cutecat" },
{ "id": "107738", "name": "funnyvideos" },
{ "id": "5424", "name": "funny" },
{ "id": "7551", "name": "cat" },
{ "id": "1601336200518658", "name": "catsoftiktok" }
],
"isSlideshow": false,
"isPinned": false,
"input": "cats",
"searchHashtag": {
"name": "cats",
"views": 439047125953
}
}

Output fields

FieldDescription
idTikTok post ID.
textThe caption, including hashtags and mentions.
textLanguageThe caption language TikTok detected, for example en or uk. un means TikTok couldn't tell.
createTime, createTimeISOPublish time as a Unix timestamp and as an ISO 8601 string in UTC.
webVideoUrlLink to the post. Videos use /video/, photo posts use /photo/.
isAdtrue for paid ads.
authorMetaThe author's profile. name is the username (the part after @), nickName is the display name, signature is the bio, fans is followers, heart is total likes received, digg is likes given, video is the number of posts.
musicMetaThe sound: name, artist, album, ID, audio link, and whether the author recorded it (musicOriginal).
videoMetaSize, length in seconds, quality, format, cover image, a link to the video file, and subtitles when TikTok has them.
locationMetaThe place a post is tagged with. Only geotagged posts have it. cityCode and countryCode are TikTok's own IDs, not ISO codes.
slideshowImageLinksOne entry per image in a photo post.
playCount, diggCount, commentCount, shareCount, collectCount, repostCountViews, likes, comments, shares, saves, and reposts.
hashtagsHashtags in the caption, with TikTok's hashtag ID when TikTok provides one.
mentions, detailedMentionsUsers tagged in the caption.
effectStickersEffects and stickers used in the video.
isSlideshowtrue for photo posts.
isPinnedtrue if the author pinned the post.
inputThe hashtag or profile username from your input that found this post.
searchHashtagThe hashtag's name and its total views on TikTok. Only posts found through a hashtag have it.
fromProfileSectionvideos or reposts: the profile section the post came from. Only posts found through a profile have it.

Downloading covers, avatars, images, and subtitles

TikTok signs its media links, and they stop working after a few hours. If you plan to show the images in a report, a dashboard, or your app later, turn on the downloads you need. The actor then saves each file to the run's key-value store and puts a permanent link in the result:

  • videoMeta.coverUrl points to the saved cover, and videoMeta.originalCoverUrl keeps TikTok's link.
  • authorMeta.avatar points to the saved avatar, and authorMeta.originalAvatarUrl keeps TikTok's link.
  • musicMeta.coverMediumUrl points to the saved sound cover, and musicMeta.originalCoverMediumUrl keeps TikTok's link.
  • slideshowImageLinks[].downloadLink and videoMeta.subtitleLinks[].downloadLink point to the saved images and subtitle files.

With downloads off, both fields of each pair hold TikTok's link.

The actor saves each avatar and sound cover once, even when the same author or sound appears in many posts. When TikTok refuses to serve a file, the result keeps TikTok's link and the run carries on. Subtitles come in the format TikTok serves them, WebVTT or JSON.

Downloads make a run slower and use more storage, so turn on only what you need.

Scraping profiles

Add usernames to profiles to collect a profile's posts. For each profile you choose:

  • Sections. videos returns the profile's own posts. reposts returns the posts it reposted, so their authorMeta describes the original creators. Take one section or both.
  • Order. latest lists videos newest first, popular most viewed first, and oldest oldest first, the same way TikTok's own Latest, Popular, and Oldest buttons do.

The actor skips profiles that don't exist and private profiles, since logged-out visitors can't see their posts, and says so in the log.

Proxy

By default the actor browses TikTok through Apify datacenter proxy at no extra charge. When TikTok cuts a hashtag or profile short, the actor retries it from a new IP, up to 5 times.

Set proxyCountryCode to a country code such as US, GB, or DE to switch to Apify residential proxy in that country. Use it when you want posts as TikTok shows them to people in a given country, or when hashtags keep coming back short. Residential proxy needs an Apify plan that includes it.

How many posts can I get?

Without a logged-in session, TikTok shows the first 2 or 3 pages of a hashtag, which is about 60 to 90 posts. After that, TikTok returns empty pages, and the actor moves on to the next hashtag. To collect more posts on a topic, add related hashtags. For example, use cats, catsoftiktok, cutecat, and catlover instead of cats alone.

Profiles give less: TikTok shows logged-out visitors about one page of each profile section, around 25 posts. Use popular or oldest to reach videos the latest page doesn't show.

Each hashtag and profile section runs in a fresh browser session. If TikTok blocks one, the others still run.

How fast is it?

In our tests, two hashtags with 40 posts each and every download turned on finished in under a minute. Without downloads, one hashtag takes about 20 seconds. The actor doesn't load the videos while it scrolls, which keeps runs fast and saves proxy traffic.

How much does it cost?

You pay only for what you get:

WhatPrice
Post saved to the dataset$1.00 per 1,000 posts
File saved with the download options (cover, avatar, music cover, slideshow image, or subtitle file)$0.50 per 1,000 files
Post collected through residential proxy$2.00 per 1,000 posts, on top of the post price

With the default settings, 1,000 posts cost $1.00. The same 1,000 posts with covers downloaded cost $1.50. An avatar or sound cover shared by many posts is saved and billed once.

Export and integrations

The results go into an Apify dataset. From there you can:

  • download them as JSON, CSV, Excel, XML, HTML, or RSS from the Output tab;
  • send them to Google Sheets, Slack, Zapier, Make, and other tools through Apify integrations;
  • schedule runs, for example every morning, to track a hashtag over time;
  • start runs and read the results from your own code through the Apify API.

Run it through the API

curl -X POST "https://api.apify.com/v2/acts/<username>~tiktok-hashtag-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"hashtags": ["cats"], "resultsPerPage": 30}'

The call waits for the run to finish and returns the posts as a JSON array. You'll find your API token in the integrations section of Apify Console settings.

FAQ

Do I need a TikTok account?

No. The actor reads public hashtag and profile pages the same way a logged-out visitor sees them.

Can I scrape TikTok profiles?

Yes. Add usernames or profile URLs to profiles. You can take each profile's videos, its reposts, or both, and sort the videos by latest, popular, or oldest.

Can I scrape TikTok search results?

Not with this actor. TikTok's search asks logged-out visitors to solve a captcha, so this actor works with hashtags and profiles, which stay open.

Why did I get fewer posts than I asked for?

TikTok shows logged-out visitors about 60 to 90 posts per hashtag and about 25 per profile section. Small hashtags and profiles can have fewer posts in total. Add related hashtags, or switch a profile's order, to collect more.

Why are some fields missing from some posts?

TikTok doesn't send every field for every post. locationMeta appears only on geotagged posts, subtitleLinks only when TikTok has generated captions, slideshowImageLinks only on photo posts, and musicAlbum only when TikTok knows the album.

TikTok signs its media links for a few hours. Turn on the downloads for covers, avatars, images, or subtitles to get permanent copies.

Are the numbers exact?

The counts match what TikTok shows on its site, and TikTok rounds large ones. That's why you'll see values like 2000000 views or 105000 likes.

The actor collects only public data that anyone can see without logging in. Public posts can still contain personal data, so make sure you have a legitimate reason to collect it and follow the GDPR and other laws that apply to you. If you're not sure, ask a lawyer.

Disclaimer

This actor is provided as is, without warranty. You're responsible for how you use it and for following TikTok's terms of service and the laws that apply to you. TikTok isn't affiliated with this actor.