TikTok Hashtag Scraper - Videos avatar

TikTok Hashtag Scraper - Videos

Pricing

from $0.24 / 1,000 results

Go to Apify Store
TikTok Hashtag Scraper - Videos

TikTok Hashtag Scraper - Videos

Scrape TikTok videos by hashtag. Each row has plays, likes, comments, shares and saves, the caption, author and sound, a link to the video, and a flag on branded posts. The limit covers the whole run, not each tag. $0.25 per 1,000 videos.

Pricing

from $0.24 / 1,000 results

Rating

5.0

(1)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

42

Total users

14

Monthly active users

6 days ago

Last modified

Categories

Share

Scrape the TikTok videos posted under any hashtag: one row per video with plays, likes, comments, shares and saves, the caption, the author, the sound, and a video link. Nothing to log into.

The thing to know before your first run: the limit is run wide, not per tag. Put in three hashtags with a limit of 50 and you get 50 videos in total, and the first tag can use the lot. Run one tag at a time if you need a fair split. A hashtag feed is also what TikTok chooses to show a visitor today, not the full history of the tag.

InputHashtags, or tiktok.com/tag/ links
OutputOne row per video: plays, likes, comments, shares, saves, caption, hashtags, author, sound, branded flag and both video file links
Ceiling2,000 videos per run
Account neededNone
Price$0.25 per 1,000 videos on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 20,000

🔍 What TikTok Hashtag Scraper does

It walks the feed behind each tag and flattens every video into one row. Tags are taken with or without the #, and a /tag/ link works too.

The same video showing up under two of your tags is returned once and billed once. Paging stops when TikTok stops handing out more of the feed, or at your limit, whichever comes first.

A few field names are TikTok's own rather than the words in the app: diggCount is likes, collectCount is saves, and isAd marks branded content, which is handy for keeping promoted posts out of an organic reach read.

📋 What data you get from each TikTok hashtag video

What you getField
Video id and the link a person can openid, webVideoUrl
Caption, and the hashtags in ittext, hashtags
When it went up, and the region TikTok reportscreateTime, region
Plays, likes, comments, shares, saves and downloadsplayCount, diggCount, commentCount, shareCount, collectCount, downloadCount
Branded content flagisAd
Length, still and animated coversvideo.duration, video.cover, video.dynamicCover
The video file linksvideo.playAddr, video.downloadAddr
The sound: id, title, artist, the creator's own or not, lengthmusic
Who posted it: id, handle, display name, avatarauthor

▶️ How to scrape TikTok hashtags

  1. Open TikTok Hashtag Scraper and click Try for free.
  2. Type tags into Hashtags, one per line, or paste links into Hashtag URLs.
  3. Set Max videos per hashtag. It is the total for the run, so start at 50 while you look at the output.
  4. Click Start.
  5. Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.

Give it at least one tag. A run with nothing in either box fails rather than returning a sample.

💰 How much does it cost to scrape TikTok hashtags?

$0.25 per 1,000 videos on the Free plan. Paid plans pay a little less: $0.248 on Starter, $0.246 on Scale and $0.244 on Business. On the free plan, the $5 Apify gives you each month covers about 20,000 videos.

You pay for videos delivered. Diagnostic rows, and a video that turned up under two of your tags in the same run, are not charged. resultsPerPage is the ceiling on both the rows and the spend.

📥 What you give it

{
"hashtags": ["cats", "spacex"],
"resultsPerPage": 50
}
FieldDefaultWhat it is
hashtagsnoneTags, with or without #. The form opens with cats filled in as an example, which is a starting point rather than a default.
startUrlsnoneOr paste links like https://www.tiktok.com/tag/cats. Mix them with hashtags freely. A plain word or #word here counts as a hashtag too. A link that is not a /tag/ link is skipped and named in the run log.
resultsPerPage50Videos for the whole run, 1 to 2,000, despite what the field name suggests. This is also your spend cap.
sessionCookiesnoneOptional: your own session, used only for your run and only for tags that came back empty without it. You are responsible for using it within the site's terms. The field is stored encrypted.
proxyConfigurationoffLeave it off. It is there if you want to send traffic through your own servers.
notionConnector, notionParentIdnoneOptional. Write each video into a Notion database as well as the dataset.

📤 What you get back

A real row from a real run. The caption starts with emoji, so it is cut short here, and the media links are trimmed:

{
"ok": true,
"type": "video",
"id": "7417800442127633707",
"webVideoUrl": "https://www.tiktok.com/@lilpawdrama/video/7417800442127633707",
"text": "...#cat #cutecat #catsoftiktok #catlover #cats #funny #pets #usa_tiktok",
"createTime": "2024-09-23T11:34:25.000Z",
"hashtags": ["cat", "cutecat", "catsoftiktok", "catlover", "cats", "funny", "pets"],
"region": "US",
"playCount": 136727,
"diggCount": 22693,
"commentCount": 127,
"shareCount": 437,
"collectCount": 1968,
"downloadCount": 803,
"isAd": true,
"video": { "duration": 30, "cover": "https://p16-common-sign.tiktokcdn-us.com/...", "playAddr": "https://v45.tiktokcdn-us.com/...", "downloadAddr": "https://v45.tiktokcdn-us.com/..." },
"music": { "id": "7136445672676411393", "title": "Cute", "authorName": "Aurel Surya Lie", "original": false, "duration": 179 },
"author": { "id": "7412528791307715627", "uniqueId": "lilpawdrama", "nickname": "lilpawdrama", "avatar": "https://p19-common-sign.tiktokcdn-us.com/..." }
}
FieldHow to read it
idUnique per video. Use it as your dedupe key across runs.
hashtagsThe tags parsed out of the caption, without the #.
createTimeWhen it was posted, as an ISO timestamp.
playCount and the other countersAs TikTok reports them at read time. A counter TikTok did not send reads 0.
video.playAddr, video.downloadAddrSigned links that stop working after a short while.
musicnull when the video has no sound attached.

🧾 Reading the output

Two kinds of row land in your dataset.

RowHow to spot itBilled
A videook: true and type: "video"yes
A diagnosticok: false and an errorCodeno

Filter on ok == true and you have your data. A tag that fails gets its own row, and the run moves on to the next tag.

CodeWhat it means
NOT_FOUNDTikTok has no such tag.
NO_RESULTSThe tag exists but returned nothing, or nothing came back for the whole run.
RATE_LIMITEDThat tag would not answer this run. Re-running usually clears it.
NOT_SERVEDThis video was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED.
TIME_LIMITThe run neared its time limit and stopped, keeping every video it had delivered. If none had come back by then, the run ends as failed.
BAD_INPUTThe input had no hashtag to look up, so the run ends as failed straight away. The row names anything that was skipped.

One quirk of the Overview table: it shows five columns, so a diagnostic row reads as a nearly blank line there. Open the row itself or download the JSON and everything is present.

💡 What people use it for

  • Watching a niche tag week by week and seeing which posts actually travelled.
  • Pulling the creators behind a tag, since every row carries the author handle and id.
  • Building a swipe file of hooks: caption, sound, length and play count in one table.
  • Separating branded posts from organic ones with isAd before reporting on reach.

From a trending tag to the people behind it, in three runs:

  1. Run TikTok Trending Hashtags for your country and copy the hashtag column.
  2. Paste one of those tags here at a time, and sort the rows on playCount.
  3. Copy author.uniqueId from the videos that travelled into TikTok Profile Scraper to see who is behind them.

🚧 What it does not do

  • No comments and no follower lists. Those are separate actors, in the table below.
  • The feed is not an archive. You get what TikTok serves a visitor under that tag now. Old videos that have dropped out of the feed will not come back.
  • The limit is shared across your tags. One busy tag can use the whole run.
  • Media links expire. They are signed and short lived.
  • A counter TikTok does not send reads as 0. On a fresh video that can mean "not published yet" rather than none.
  • Counts are a snapshot at read time, and TikTok's own figures lag on very new videos.
  • An empty input fails the run instead of returning a sample.
  • It is not an official TikTok tool. Dami's Studio is independent and is not affiliated with or endorsed by TikTok, or by any other company named on this page.

🧭 Which TikTok scraper do you need?

If you wantUse
Videos posted under a hashtagThis one
A profile plus its newest videos, or a keyword searchTikTok Scraper
Videos using one soundTikTok Sound Scraper
Follower and like counts for a list of handlesTikTok Profile Scraper
Comments under a videoTikTok Comments Scraper
The hashtags ranking in a country right nowTikTok Trending Hashtags
Posts and reels under an Instagram hashtagInstagram Hashtag Scraper

❓ Questions people ask

Do I need a TikTok account to scrape hashtags?

No. The cookie field is optional and only comes into play for tags that came back empty without it.

Is the limit per hashtag or per run?

Per run. The field is called "Max videos per hashtag", but the number you set is the total the run will deliver across all your tags.

Why did I get fewer videos than I asked for?

Either TikTok stopped handing out more of that feed, or an earlier tag in your list had already used the run's allowance.

Every row carries both file links. They are signed links that expire.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/tiktok-hashtag-scraper. Either way the run happens on your Apify account at the same price.

This reads public videos only, never private accounts or messages. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Include the hashtags you used and the run ID, and the log is usually enough for us to see what happened.