TikTok Hashtag Scraper: Posts, Free Date Filter avatar

TikTok Hashtag Scraper: Posts, Free Date Filter

Pricing

from $0.80 / 1,000 posts

Go to Apify Store
TikTok Hashtag Scraper: Posts, Free Date Filter

TikTok Hashtag Scraper: Posts, Free Date Filter

Scrape TikTok hashtag feeds with no login: posts under a tag with play, like, comment, share and save counts, caption, author stats, music and media URLs, plus the exact video and view count of the tag. Date window, minimum plays, per tag cap and ad exclusion are free. JSON, CSV, API. Pay per post.

Pricing

from $0.80 / 1,000 posts

Rating

0.0

(0)

Developer

Automation Craft

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

Share

TikTok Hashtag Scraper: Posts, Free Date Filter

TikTok Hashtag Scraper: give it one or more hashtags (nike, #nike or https://www.tiktok.com/tag/nike) and get the posts TikTok's public web feed shows under each tag, with no login, no cookies and no API key. Every post row carries the play, like, comment, share and save counts, the caption with its hashtags and mentions, the author with follower and like counts, the music, TikTok's content category, related searches, caption track links and the media URLs with the time they expire. Each hashtag also gets a free card row with the exact video count and view count TikTok reports for the tag.

Every filter is free: a date window, minimum plays, "only posts that carry the tag", ad exclusion and slideshows only. You pay per post delivered, never for a filtered post, a duplicate, a missing tag or a status row.

Quick start

  1. Open the Actor and type your hashtags into Hashtags, one per line: nike, #nike and tag URLs all work.
  2. Set Maximum posts per hashtag (30 by default; 0 takes everything the web feed serves, see the ceiling below) and, if you want, Maximum posts in total.
  3. Add free filters under Filters (free): Posted on or after, Minimum plays, Only posts that carry the hashtag, Exclude ads.
  4. Run it. Download the Posts view as JSON, CSV or Excel, or read the dataset through the API.
  5. For a hashtag you re-check on a schedule, set a Memory name: posts delivered in an earlier run under that name are skipped for free, so each run pays only for new posts.

What you get

A delivered post (type: "post", status: "ok") uses the same field names as the most used TikTok scrapers (authorMeta, musicMeta, videoMeta, diggCount, playCount, webVideoUrl), so you can swap without rewriting your pipeline. On top of them every row has hashtag (the tag it came from), feedPosition (its place in the feed as TikTok served it), containsTagInCaption, pageCursor and exitRegion. Fill rates measured on the Apify platform on 2026-09-25:

FieldFilled in 1,260 unique posts from 33 platform runs
playCount, diggCount, commentCount, shareCount, collectCount1,260 of 1,260
authorMeta.fans, authorMeta.heart (author at the time of the run)1,260 of 1,260
categoryType, textLanguage, mediaExpiresAt, musicMeta.musicId1,260 of 1,260
videoMeta.vqScore1,256 of 1,260
videoMeta.downloadAddr1,246 of 1,260
hashtags1,141 of 1,260
musicMeta.playUrl1,109 of 1,260
effectStickers1,067 of 1,260
videoMeta.captionsEnabled true1,027 of 1,260
containsTagInCaption true561 of 1,260
musicMeta.dspLinks (streaming links)551 of 1,260
videoMeta.subtitleLinks (caption track links)389 of 1,260
poi (tagged place)256 of 1,260
mentions224 of 1,260
suggestedWords (related searches)146 of 1,260
isAd true129 of 1,260
isSlideshow true4 of 1,260
diversificationLabels, locationCreated, authorMeta.bioLink0: the feed does not carry them (null)
FieldWhat it is
id, webVideoUrlTikTok's post id (a string) and the post URL (/photo/ for slideshows)
text, textLanguage, hashtags, mentions, detailedMentionscaption, its language, hashtags with ids, mentioned accounts with ids
createTime, createTimeISOwhen the post was published
playCount, diggCount, commentCount, shareCount, collectCount, repostCountthe counts from TikTok's statsV2 block (see the note below); null, never 0, when TikTok sends none
authorName, authorMetathe author with follower, following, like and video counts at the time of the run, verified flag and account settings
musicMetasong id, title, artist, original or not, copyright and commerce flags, audio URL and streaming links
videoMetaduration, size, cover URLs, downloadAddr, renditions, TikTok's video quality score, loudness, caption track links (subtitleLinks) with their expiry
categoryType, suggestedWords, poiTikTok's content category number, related searches, the tagged place
isAd, isSlideshow, imagePost, isAigc, duetEnabled, stitchEnabledflags and the slideshow images
mediaUrls, mediaExpiresAtthe signed media URLs and the earliest moment one stops working (about 6 hours after the run for video URLs)

About the counts. TikTok's hashtag feed gives play, like, comment and share counts to 4 significant digits once they reach 10,000 (390,500, not 390,512), and the author's follower and like counts the same way; below 10,000 they are exact. Saves (collectCount) are exact at every size (93 of the 99 save counts above 10,000 in our sample had more than 4 significant digits), and so are the hashtag card's videoCount and viewCount. The Actor returns TikTok's figures as numbers, never estimates.

This listing does not download captions: videoMeta.subtitleLinks gives TikTok's caption track links with their expiry. The TikTok Video Scraper returns the transcript text inline.

The hashtag card (type: "hashtag", free, on by default) has the tag id, description, commerce flag, videoCount and viewCount. The hashtag summary (type: "hashtag-summary", free) says for each tag how many feed pages and posts TikTok served, how many were delivered, filtered (by reason), repeated or already known, how many page sessions were retired, and why it stopped (stopReason: end-of-results, max-per-input, max-total, charge-limit, blocked, not-found). Status rows (type: "status", free): not_found (the tag does not exist), empty_feed (the tag exists but TikTok's web feed shows no posts for it, often a brand tag such as #adidas), blocked, invalid and skipped. The last row is the run summary.

How many posts one hashtag returns (measured ceiling)

TikTok's web feed for a hashtag is not the full list of posts that use the tag. Measured on 2026-09-25: one page session scrolled to the end of the feed got 81 to 161 distinct posts per hashtag (median 101, 38 walks) before TikTok stopped serving pages. When you ask for more than one walk gives, the Actor walks the tag again on a fresh page session, which returns mostly the same feed plus new posts: #nike grew to 98, 116, 140 and 161 posts over four walks, #puma to 133, 154, 188 and 196, #fitness to 93, 122, 146 and 164. It walks again only while the last walk delivered enough new posts (50 on the first walk, 10 on later ones), and at most 5 extra times, so a heavily filtered tag is not walked again for a handful of posts. Expect roughly 100 to 200 posts per hashtag, not thousands.

The feed also mixes in posts TikTok relates to the tag: 53 percent of the posts we delivered carry the tag in their caption or hashtag list, and far fewer on small tags (0 of 210 posts on a tag with 22 videos, 35 of 152 on a tag with 106 videos, 51 of 199 on a tag with 3,154 videos). Every row carries containsTagInCaption; turn on Only posts that carry the hashtag to keep only those. The feed is not in date order, so the date window skips posts rather than stopping early. Ads were 129 of 1,260 posts (10 percent); slideshows were 4 of 1,260 posts, so the slideshow filter rarely finds anything in a hashtag feed.

Region. Every page TikTok served was its US web app (exitRegion: "US"), whatever the exit. Exits that TikTok answers with its non US app get an empty feed, so the Actor retires them and tries another; there is no country selector. Counts such as plays and likes are the post's global counts.

How much does it cost to scrape TikTok hashtags?

EventFREE and BRONZESILVERGOLDPLATINUMDIAMONDWhen it is charged
Post$1.00 per 1,000$0.90$0.80$0.55$0.50once per unique post delivered that passed your filters
Actor start$0.010 per GB of memorysamesamesamesameonce per run; with the default 4,096 MB that is 4 x $0.010

The Store pricing card shows these same prices per 1,000 events: "$1.00 / 1,000" on the Post row means one post costs a tenth of a cent. Filtered posts, duplicates, posts already in your memory, the hashtag card, status rows and the summaries are free. A run with 3 hashtags and 60 posts each (180 posts) costs 180 x $0.001 plus the $0.04 start event, about $0.22 on BRONZE. The start event pays for the headless page load TikTok requires before its feed answers, and it is the same whether 3 or 60 posts pass your filters: a very strict filter over one or two tags (for example 9 posts kept of 250 seen) is the one shape where the start event is most of what you pay, so widen the window or add tags rather than filtering a single tag hard. Platform usage is included: the Actor runs at 4,096 MB because TikTok's web app is CPU bound, and measured runs took 37 to 68 seconds for 3 hashtags.

Input

FieldDefaultWhat it does
hashtagstags, #tags or tag URLs
maxPostsPerHashtag30posts per tag; 0 takes everything the feed serves (re-walks included)
maxPostsnonetotal cap across tags; 0 means none
includeHashtagCardtruethe free card row per tag
postedAfter, postedBeforefree date window, YYYY-MM-DD (UTC). An unreadable date stops the run before anything is charged
minPlaysfree minimum play count
requireTagInCaptionfalsefree: only posts whose caption or hashtag list names the tag
excludeAds, slideshowsOnlyfalsefree filters
memoryName, resetMemorycross run memory of delivered post ids
tryDirectFirsttruethe first page session uses the Apify platform's own IP, the cheapest and fastest exit we measured (56 of 56 sessions alive)
proxyConfigurationdatacenterthe proxy for later and replacement sessions (38 of 53 datacenter sessions alive; dead and non US exits are retired at once, never reloaded). Residential works but is never chosen automatically
maxConcurrency1page sessions in parallel, 1 to 3. One is the measured fastest and cheapest

Example input:

{
"hashtags": ["nike", "#puma", "https://www.tiktok.com/tag/fitness"],
"maxPostsPerHashtag": 60,
"postedAfter": "2026-08-01",
"minPlays": 10000,
"requireTagInCaption": true,
"excludeAds": true
}

FAQ

Do I need a TikTok account or an API key?

No. The Actor opens the public hashtag page in a headless browser the way a signed out visitor does and reads the feed TikTok serves to that page. Nothing in the input asks for a credential.

How many posts can one hashtag return?

One page session gets about 80 to 160 posts per hashtag before TikTok's web feed stops serving pages (measured 2026-09-25); the Actor walks the tag again on fresh sessions while each walk still adds new posts, which reached 115 to 210 per tag. The per hashtag summary row reports where each tag stopped and why.

Is the date filter free?

Yes. The date window, minimum plays, tag in caption, ad exclusion and slideshow filters are applied inside the run and cost nothing; you pay only for the posts that pass them.

Why do some posts under a hashtag not mention it?

TikTok's feed also ranks posts it relates to the tag. Every row carries containsTagInCaption, and the requireTagInCaption filter keeps only posts whose caption or tag list carries the hashtag.

Does it return comments or keyword search results?

No. Comments sit behind a slide puzzle and a login on the web, and keyword search is login walled. The Actor returns hashtag feeds with counts, captions, author stats, music and media URLs.

Which country does the feed come from?

TikTok's US web feed. Every page TikTok served during our measurements was its US web app on every exit; exits that get the non US app receive an empty feed and are retired automatically, so there is no country selector. Every row records exitRegion.

Why does this Actor run with limited permissions?

Least privilege. It reads and writes only its own run storages, and the optional cross run memory is a named key value store it creates itself.

What this Actor does NOT do

  • No comments: TikTok shows comments on the web only after a slide puzzle and a login prompt.
  • No keyword search: TikTok's search is login walled on the web.
  • No full history of a hashtag: the web feed stops at roughly 100 to 200 posts per tag (measured above).
  • No country selection: TikTok serves its US web feed to every exit that gets a feed.
  • No transcripts inline: caption track links only (use the TikTok Video Scraper for transcript text).
  • No login, no cookies, no private content.

API examples

Run it from the command line:

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

Node.js:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation_craft/tiktok-hashtag-scraper').call({ hashtags: ['nike', 'puma'], maxPostsPerHashtag: 60, excludeAds: true });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((i) => i.type === 'post').length, 'posts');

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("automation_craft/tiktok-hashtag-scraper").call(run_input={"hashtags": ["nike"], "postedAfter": "2026-09-01"})
posts = [i for i in client.dataset(run["defaultDatasetId"]).iterate_items() if i["type"] == "post"]

More data tools by Automation Craft