TikTok Trends Scraper: TikTok Creative Center Hashtags, Top Ads
Pricing
from $1.00 / 1,000 trending hashtags
TikTok Trends Scraper: TikTok Creative Center Hashtags, Top Ads
Scrape TikTok Creative Center trends: TikTok trending hashtags in 27 countries over 7, 30 or 90 days with every industry list, TikTok trending videos with weekly and monthly rankings and comments, and TikTok Top Ads with details. A TikTok ads scraper with exact numbers. No login.
Pricing
from $1.00 / 1,000 trending hashtags
Rating
0.0
(0)
Developer
Hyperbach
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
TikTok Creative Center trends with exact numbers: trending hashtags in 27 countries over 7, 30 or 90 days, top videos by views, engagement or 6-second view rate, and Top Ads with their landing pages and metrics — in one row shape. Logged out, TikTok shows 3 hashtags and 4 videos per list; this Actor reads every list of a country and period (the overall ranking and each of the 15 industry rankings; every sort, content tag and organic switch for videos) and merges them: about 46 hashtags per country and period instead of 3, about 85 videos per ranking instead of 4, each with every rank it holds. TikTok's weekly and monthly video rankings, back to mid-2025, with top comments on US videos. Follow the lists on a schedule and get only the hashtags that are new. Songs, creators and Top Products are gone from the Creative Center: ask for them and you get a labelled row saying so, free, not an empty success. No login, no cookies, proxies handled for you.
Why this scraper, not the other Creative Center actors
- Past TikTok's 3 rows, by its own lists. Logged out, every Creative Center list serves 3 hashtags or 4 videos, page 2 is empty and the page size is ignored. Every filter value is a list of its own, so the Actor reads them all and merges them: 16 hashtag lists gave 46 distinct hashtags for US / 7 days, 84 video lists (all content and 13 content tags × 3 sorts × organic on / off) gave 113 distinct videos for US / Last 7 days (2026-10-02). Each row keeps every rank it holds (
lists) and how many rows each list served (list_served), so a short list is said in the data, not hidden. - Exact numbers and real ids. Posts, views, the popularity curve, the hashtag's own industries and its top creators with handle, followers and user id, as the API gives them, not the page's rounded text. Video ids are strings (19 digits; a float loses the last digits).
- The weekly and monthly rankings, and their history. Besides the rolling Last 7 / 30 days, TikTok keeps weekly (Monday to Sunday) and monthly video rankings — weekly back to 2025-07-27, monthly to 2025-05-31.
videoSnapshots: 12reads the last 12 weeks;videoSnapshotDatesreads the rankings that held given dates. Every video row carries its window's start and end. Ready-made: TikTok's weekly top videos in the US, the last 12 weeks. - Comments and comment keywords on US videos.
videoDetailsadds up to 200 top comments with likes and the keywords TikTok extracts from them, from the Creative Center's own record (open logged out for US videos; other countries are login-only and are said so, not charged). Ready-made: Top TikTok videos in the US this week, with their top comments. - Honest about what TikTok removed. Songs, creators, Top Products and Keyword Insights are gone from the Creative Center (their routes answer
deprecatedor 404). Ask for one and the run checks it live and returns a free labelled row with TikTok's answer, so a pipeline can tell "gone" from "blocked". A run that could read nothing (refused, errors) ends FAILED; a list TikTok answers empty for your filters says so in the status; never a silent "0 rows, SUCCEEDED". - Trend signals from the curve. Direction, momentum, volatility, peak date and a stage (emerging, rising, peaking, declining, steady) computed from TikTok's own 0–100 curve, free;
onlyRising,minPostsandminViewsfilter on them. - Top Ads in the same run. The Creative Center's Top Ads by country, period and sort, with the landing page, countries, likes, comments and shares, the per-second CTR and retention curves, the Spotlight picks, and the sweep past 20 per list. The same columns as our TikTok Ads Library Scraper.
- Rank changes between runs. With
trackChangeseach row gets its previous rank, the change and the change per day, and whether it is new to the list;onlyNewdelivers only entries a task has not delivered before;includeEndedsays what left a list. - Fast and plain. No browser: 407 hashtags (US, UK and Germany × 7 / 30 / 90 days, every industry list) in 55 seconds on one exit. Every proxy exit is checked against TikTok before it is used.
Same competitor, other ad platforms
Our ad library scrapers share their column names — advertiser_name, body_text, cta, destination_url, first_shown, last_shown, days_shown, regions and more — so one competitor's ads from every platform land in one table with no mapping.
- Google Ads Transparency Scraper — every ad an advertiser runs on Google Search, YouTube and Display, with the copy read from image ads, run dates and, for political ads, spend.
- Meta Ad Library Scraper — every ad a page runs on Facebook, Instagram, Messenger, WhatsApp and Threads, with the landing URL, media, run dates and EU reach.
- LinkedIn Ad Library Scraper — every ad a company runs on LinkedIn, with the full detail page: payer, impressions by country and the targeting the advertiser chose.
- TikTok Ads Library Scraper — every ad an advertiser runs in TikTok's Ad Library, with targeting, reach per country, payer and landing page.
Who it's for
- Social media and content teams — what is trending this week in each market and industry, with the curve and the creators behind it, and which videos lead by views, engagement or 6-second retention.
- Performance marketers and agencies — the trends and the Top Ads of a market side by side: hashtags to ride, ads that win, their landing pages and CTR buckets.
- Trend researchers and data teams — a daily or weekly feed of the lists with stable ids, every rank, the window dates and rank changes, ready to join across runs.
- Developers and AI agents — one row shape for every section, a compact output, a typed run summary, and labelled rows for what TikTok does not serve.
Quick start
Trending hashtags in the US, every industry list
{"sections": ["hashtags"],"hashtagCountries": ["US"],"hashtagPeriods": ["7"]}
Hashtags in all 27 countries, 7 and 30 days, overall lists
{"sections": ["hashtags"],"hashtagCountries": ["ALL"],"hashtagPeriods": ["7","30"],"hashtagIndustries": ["Overall"]}
Top videos in the US, last 7 days, with comments
{"sections": ["videos"],"videoCountries": ["US"],"videoPeriods": ["last_7_days"],"videoDetails": true}
The weekly video ranking of the last 12 weeks
{"sections": ["videos"],"videoCountries": ["US"],"videoPeriods": ["weekly"],"videoSortBy": ["views"],"videoContentTags": ["All"],"videoOrganic": "all_views","videoSnapshots": 12}
Top Ads in the US by CTR, with details
{"sections": ["topAds"],"topAdsCountries": ["US"],"topAdsPeriod": "30","topAdsSortBy": "ctr","maxItems": 20}
Everything at once, with a trend digest
{"sections": ["hashtags","videos","topAds"],"hashtagCountries": ["US"],"videoCountries": ["US"],"topAdsCountries": ["US"],"trendDigest": true,"maxItems": 200}
Output
One row per hashtag (per country and period), per video (per country and ranking), per Top Ad; section and row_type say which:
| field | meaning |
|---|---|
record_id | Unique across sections and runs of the same list: hashtag:<country>:<period>:<id>, video:<country>:<period>:<end date>:<id>, top_ad:<id>; free rows carry their own (section:songs, not_listed:…). Deduplicate on this. |
section | hashtags, videos, top_ads, summary, or the name of a section TikTok dropped (songs, creators, products, keywordInsights). |
row_type | hashtag, video, ad (charged rows); section_unavailable, section_returned, not_listed, no_snapshot, not_found, ended, caption_hashtag, advertiser_profile, landing_page (free); digest (the trend digest). |
country | ISO country code of the list the row comes from. |
country_name | The country's name. |
period | Hashtags and Top Ads: the window in days (7, 30, 90, 180); videos: last_7_days, last_30_days, weekly or monthly. |
period_days | Days the window covers. |
period_start | Videos: the first day of the ranking's window. |
period_end | Videos: the last day of the ranking's window — the snapshot TikTok keys the list by. |
rank | Position in list (1 = top). Hashtags: TikTok's rank; videos: the position in the list; Top Ads: the position in the order you asked for. |
list | The list the rank is from: Overall or an industry for hashtags; sort / content tag / organic for videos; the Top Ads list. |
lists | Every list of the slice this entry ranked in, with its rank there (a hashtag can top the overall list and an industry list). |
list_served | Rows TikTok served in that list. Logged out TikTok shows 3 hashtags and 4 videos per list. |
list_total | TikTok's own count for the list (videos: 100 ranked; hashtags: the rows it serves logged out). |
hashtag_id | TikTok's hashtag id, as a string. |
hashtag_name | The hashtag without #. |
hashtag_url | The hashtag's tiktok.com page. |
creative_center_url | The hashtag's Creative Center page for this country and period. |
posts | Videos posted with the hashtag in the period (exact, as the API gives it). |
views | Hashtags: views of the hashtag's videos in the period; videos: the video's views in the window. Exact. |
industries | The hashtag's own industries, by name (TikTok's taxonomy). |
industry_ids | The same industries, by id. |
popularity_curve | TikTok's 0–100 popularity per day (peak = 100) over the window: [{date, value}], one point per day the hashtag was present. |
curve_points | Days in the curve. |
trend_direction | up / down at ±10 % momentum, else flat. |
trend_momentum_pct | Mean of the curve's last 3 points against the 3 before them, in %; when those 3 are all 0, against the mean of every earlier point; null when every earlier point is 0 (not there yet). |
trend_volatility | Standard deviation of the day-to-day changes of the curve, in points. |
trend_stage | emerging (present on fewer than half the window's days and not falling), peaking (latest ≥ 90), rising, declining or steady. |
trend_peak_date | The latest day the curve hit its maximum. |
trend_average | Mean of the curve. |
trend_latest | The curve's last value. |
top_creators | TikTok's top 3 creators for the hashtag: rank, user id, handle, nickname, followers, country, avatar, profile URL (and the stored avatar with downloadMedia). |
video_id | TikTok's video id, as a string (19 digits; never a float). |
video_page_url | The video's tiktok.com page. |
title | The video's caption. |
video_created_at | When the video was posted (UTC). |
views_lifetime | The video's views since it was posted. |
organic_views | Views in the window not from ads. |
organic_views_lifetime | Organic views since it was posted. |
engagement_rate | TikTok's engagement rate in the window (a share, 0.0012 = 0.12 %). |
engagement_rate_lifetime | The same since it was posted. |
six_second_view_rate | Share of views that watched 6 seconds, in the window. |
six_second_view_rate_lifetime | The same since it was posted. |
creator_username | The video creator's handle. |
creator_nickname | The creator's display name. |
creator_url | The creator's tiktok.com page. |
creator_id | The source's creatorID of the video. |
author_id | The source's authorID of the video. |
creator_bio | The creator's bio as TikTok shows it. |
creator_avatar_url | The creator's avatar (a signed link that expires). |
creator_followers | The creator's followers. |
creator_store_region | With videoDetails: the creator's store region (US videos only). |
creator_type | With videoDetails: the source's creator type code. |
content_tags | TikTok's content tags of the video (Beauty & Care, Fashion, Food & Beverage, Lifestyle & Leisure, Technology & Finance). |
content_tag_ids | The same tags, by id. |
top_comments | With videoDetails: the video's top comments with likes, date, comment id, user id and name (US videos). |
top_comments_count | How many comments the detail record held. |
comment_keywords | With videoDetails: the keywords TikTok extracts from the comments, with mentions (when it has them). |
creative_id | The Top Ad's id. |
ad_url | The ad's Creative Center page. |
ad_format | video (the Creative Center renders every Top Ad as a video). |
creative_available | Whether the ad carries a video or a cover. |
advertiser_name | The brand name TikTok shows. |
body_text | The ad's caption. |
hook_text | The caption's first line or sentence. |
objective | The campaign objective. |
objectives | Every objective of the detail record. |
industry | The ad's industry, by name. |
industry_id | The same, by id. |
destination_url | Where the ad leads (detail record). |
landing_domain | The landing page's domain. |
ctr_top_percent | TikTok's CTR rank bucket: 6.0 = "Top 6 %" — lower is better; not a click rate. |
likes | The ad's likes. |
comments | The ad's comments (detail record). |
shares | The ad's shares (detail record). |
cost_level | TikTok's budget tier of the ad (1–3). |
is_search_ad | Whether TikTok marks it a search ad. |
source | The detail record's source (where TikTok took the ad from). |
keyword_list | The detail record's keyword list. |
pattern_labels | TikTok's creative pattern labels. |
voice_over | Whether the ad has a voice-over. |
highlight_text | Spotlight ads: TikTok's expert note. |
regions | Countries the ad ran in (detail record). |
keyframes | With topAdsMetrics: per-second CTR, CVR, clicks, conversions and retention curves. |
keyframe_highlights | The seconds TikTok marks on the curves. |
percentiles | With topAdsMetrics: CTR, CVR, clicks, conversions and impressions percentiles. |
copy_length | Characters in the caption. |
sentiment_score | AFINN sentiment of an English caption (−1…1); null for other languages. |
image_url | The ad's cover image (signed link). |
video_urls | Every rendition of the ad video, best first, with its height. |
video_duration_s | The ad video's length in seconds. |
video_width | Pixels. |
video_height | Pixels. |
cover_url | The video's or the ad's cover (a signed link that expires). |
video_url | The video file (a signed link that expires at media_expires_at). |
media_expires_at | When TikTok's signed video link stops working. |
hashtags | Hashtags written in the video title or the ad caption. |
mentions | @handles written in the title or caption. |
text_language | en when the title or caption is English, else null. |
analysis_angle | tagAds: the persuasion angle (problem_solution, social_proof, scarcity, discount, feature, lifestyle, curiosity, education, comparison, brand, other). |
analysis_cta_intent | tagAds: what the ad asks the viewer to do. |
analysis_tone | tagAds: the tone of the copy. |
analysis_sentiment | tagAds: valence from −1 to 1. |
analysis_offer_type | tagAds: what the ad offers. |
analysis_funnel_stage | tagAds: awareness, consideration or conversion. |
analysis_confidence | tagAds: the confidence of each tag. |
analysis_hook | analyzeAds: the hook line. |
analysis_offer | analyzeAds: the concrete offer. |
analysis_audience | analyzeAds: who the ad is written for. |
analysis_strategy | analyzeAds: what the advertiser is trying to achieve. |
transcript | transcribeVideos: the spoken words. |
transcript_language | transcriptTiming: the language spoken (ISO 639-1). |
hook_3s | transcribeVideos: the first words; with transcriptTiming, the words of the first 3 seconds of speech. |
speech_seconds | transcriptTiming: seconds of speech. |
transcript_segments | transcriptTiming: the transcript with start and end times. |
media_files | downloadMedia: the files stored in the run's key-value store, with links that do not expire. |
image_file_url | downloadMedia: the stored cover. |
video_file_url | downloadMedia: the stored video. |
detail_status | ok, skipped (not asked), login_required (TikTok serves it logged in only), not_found, or failed: …. Only ok is charged. |
source_url | The Creative Center page of the row: a hashtag's own page (= creative_center_url), a video list's page, a Top Ad's page. |
scraped_at | When the run read the row (UTC). |
first_seen_at | With the memory: the day this task first met the entry. |
last_seen_at | With the memory: the last day this task met it. |
ended_at | ended rows: the day a complete read no longer found it. |
times_seen | With the memory: runs of this task that met the entry. |
previous_rank | With the memory: the rank the last earlier run of this task delivered it at (the newest snapshot of that run). |
rank_change | previous_rank − rank: positive = moved up. |
rank_velocity_per_day | rank_change divided by the days since the previous rank; null when the previous rank is from the same day. |
is_new | With the memory: true the first time this task meets the entry. |
change_type | With the memory: new, seen_before, or changed (a Top Ad whose likes or CTR moved). |
changed_fields | The fields that moved. |
note | Free rows: what TikTok answered, or why the row is there. |
source_answer | Free rows of a dropped section: the head of TikTok's answer. |
run_tag | Your runTag, copied onto every row. |
summary_video_count | Summary rows: videos that carry it. |
summary_ad_count | Summary rows: Top Ads that carry it. |
summary_is_trending | caption_hashtag rows: the same run delivered it as a trending hashtag. |
summary_record_ids | Summary rows: the rows behind it. |
summary_advertisers | Summary rows: the brands behind it. |
summary_landing_domains | advertiser_profile rows: the brand's landing domains. |
summary_countries | advertiser_profile rows: ads per country. |
digest_summary | trendDigest: what is trending in the lists the run read. |
digest_themes | trendDigest: themes with the entries behind each. |
digest_rising | trendDigest: hashtags with rising curves, by name. |
digest_watch | trendDigest: concrete things to act on, each tied to an entry. |
Example record:
{"record_id": "hashtag:US:7:1513566","section": "hashtags","row_type": "hashtag","country": "US","country_name": "United States","period": "7","period_days": 7,"period_start": null,"period_end": null,"rank": 1,"list": "Overall","lists": [{"list": "Overall","industry_id": null,"rank": 1},{"list": "Education","industry_id": "10000000000","rank": 1}],"list_served": 3,"list_total": 3,"hashtag_id": "1513566","hashtag_name": "cornell","hashtag_url": "https://www.tiktok.com/tag/cornell","creative_center_url": "https://ads.tiktok.com/creative/creativeCenter/trends/hashtag/1513566?period=7®ion=US","posts": 27353,"views": 344944638,"industries": ["Education"],"industry_ids": ["10000000000"],"popularity_curve": [{"date": "2026-09-24","value": 0.0},{"date": "2026-09-25","value": 10.2},{"date": "2026-09-26","value": 36.07},{"date": "2026-09-27","value": 52.63},{"date": "2026-09-28","value": 68.26},{"date": "2026-09-29","value": 88.81},{"date": "2026-09-30","value": 100.0}],"curve_points": 7,"trend_direction": "up","trend_momentum_pct": 159.9,"trend_volatility": 5.36,"trend_stage": "peaking","trend_peak_date": "2026-09-30","trend_average": 50.85,"trend_latest": 100.0,"top_creators": [{"rank": 1,"user_id": "7246021639602144302","handle": "followmyquotes","nickname": "quoteme","followers": 2734,"country": "US","avatar_url": "https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/cd5e59161f18c58bf68fe7981fbff774~tplv-tiktokx-cropcenter:300:300.jpeg?dr=14577&refresh_token=789e0e35&x-expires=1791090000&x-signature=V0%2BbEWewbUPdQjY0QjjWcMqihqw%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=429d27ce&idc=my2","profile_url": "https://www.tiktok.com/@followmyquotes"},{"rank": 2,"user_id": "7446288931253568555","handle": "nudf29","nickname": "nudf29","followers": 12824,"country": "US","avatar_url": "https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/06634f1828ac8758a4bec43a0c7ebd35~tplv-tiktokx-cropcenter:300:300.jpeg?dr=14577&refresh_token=1daa1846&x-expires=1791090000&x-signature=3MxYoRzzyA6Mi8YnkSmbNAZyOKw%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=429d27ce&idc=my2","profile_url": "https://www.tiktok.com/@nudf29"},{"rank": 3,"user_id": "7558704309278409742","handle": "ajyaps69_","nickname": "aj","followers": 585749,"country": "US","avatar_url": "https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/f586357f37a6db82177803fba20c4c9d~tplv-tiktokx-cropcenter:300:300.jpeg?dr=14577&refresh_token=e26c64b4&x-expires=1791090000&x-signature=2%2BSIU8%2BrtkRpQ2vM%2BWuvVLPmA%2Fk%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=429d27ce&idc=my2","profile_url": "https://www.tiktok.com/@ajyaps69_"}],"video_id": null,"video_page_url": null,"title": null,"video_created_at": null,"views_lifetime": null,"organic_views": null,"organic_views_lifetime": null,"engagement_rate": null,"engagement_rate_lifetime": null,"six_second_view_rate": null,"six_second_view_rate_lifetime": null,"creator_username": null,"creator_nickname": null,"creator_url": null,"creator_id": null,"author_id": null,"creator_bio": null,"creator_avatar_url": null,"creator_followers": null,"creator_store_region": null,"creator_type": null,"content_tags": null,"content_tag_ids": null,"top_comments": null,"top_comments_count": null,"comment_keywords": null,"creative_id": null,"ad_url": null,"ad_format": null,"creative_available": null,"advertiser_name": null,"body_text": null,"hook_text": null,"objective": null,"objectives": null,"industry": null,"industry_id": null,"destination_url": null,"landing_domain": null,"ctr_top_percent": null,"likes": null,"comments": null,"shares": null,"cost_level": null,"is_search_ad": null,"source": null,"keyword_list": null,"pattern_labels": null,"voice_over": null,"highlight_text": null,"regions": null,"keyframes": null,"keyframe_highlights": null,"percentiles": null,"copy_length": null,"sentiment_score": null,"image_url": null,"video_urls": null,"video_duration_s": null,"video_width": null,"video_height": null,"cover_url": null,"video_url": null,"media_expires_at": null,"hashtags": null,"mentions": null,"text_language": null,"analysis_angle": null,"analysis_cta_intent": null,"analysis_tone": null,"analysis_sentiment": null,"analysis_offer_type": null,"analysis_funnel_stage": null,"analysis_confidence": null,"analysis_hook": null,"analysis_offer": null,"analysis_audience": null,"analysis_strategy": null,"transcript": null,"transcript_language": null,"hook_3s": null,"speech_seconds": null,"transcript_segments": null,"media_files": null,"image_file_url": null,"video_file_url": null,"detail_status": null,"source_url": "https://ads.tiktok.com/creative/creativeCenter/trends/hashtag/1513566?period=7®ion=US","scraped_at": "2026-10-02T05:31:34Z","first_seen_at": null,"last_seen_at": null,"ended_at": null,"times_seen": null,"previous_rank": null,"rank_change": null,"rank_velocity_per_day": null,"is_new": null,"change_type": null,"changed_fields": null,"note": null,"source_answer": null,"run_tag": null,"summary_video_count": null,"summary_ad_count": null,"summary_is_trending": null,"summary_record_ids": null,"summary_advertisers": null,"summary_landing_domains": null,"summary_countries": null,"digest_summary": null,"digest_themes": null,"digest_rising": null,"digest_watch": null}
Pricing
Pay only for what a run actually returns, with no start fee and no platform usage billed to you. Prices fall with your Apify plan.
| per 1,000 rows | Free | Starter | Scale | Business |
|---|---|---|---|---|
Trending hashtag (hashtag) | $2.00 | $1.70 | $1.40 | $1.00 |
Top video (video) | $2.00 | $1.70 | $1.40 | $1.00 |
Comments and keywords on that video (video_details) | +$1.00 | +$0.85 | +$0.70 | +$0.50 |
Ad (ad) | $0.80 | $0.68 | $0.56 | $0.40 |
Ad detail record on that ad (ad_details) | +$1.20 | +$1.02 | +$0.84 | +$0.60 |
Top Ads curves and percentiles (ad_metrics) | +$3.00 | +$2.55 | +$2.50 | +$2.50 |
Typed tags on that ad (ad_tags) | +$1.00 | +$0.85 | +$0.70 | +$0.70 |
Written analysis of that ad (ad_analysis) | +$6.00 | +$5.10 | +$4.20 | +$3.00 |
| per one | Free | Starter | Scale | Business |
|---|---|---|---|---|
Transcript, per started minute of video (transcript) | $0.02 | $0.017 | $0.015 | $0.0125 |
Stored image or cover (media_file) | $0.002 | $0.0017 | $0.0014 | $0.001 |
Stored video (media_video) | $0.02 | $0.017 | $0.015 | $0.014 |
Trend digest (trend_digest) | $0.05 | $0.045 | $0.04 | $0.04 |
A trending hashtag or a top video is $2.00 per 1,000 on the Free plan and $1.00 on Business; a Top Ad with its detail record is $2.00 per 1,000 (the same price as in our TikTok Ads Library Scraper). + fees are charged per row that actually carries the thing: a video detail or a Top Ads detail that is login-only or could not be read is delivered marked (detail_status) and not billed; a silent video is not billed a transcript; the image and video links are in every row free, and a stored copy (downloadMedia) is billed once per file, never again for a file two rows share. Labelled rows for removed sections, watched hashtags not in the lists, ended entries and summary rows are free. maxItems is exact and never overshot; before the first request the log says the most the run can cost at your plan's prices. Nothing is billed for a run that failed. Enterprise plans have their own rates — the Actor's Pricing tab shows the price for your plan.
Usage patterns
- A daily trends feed — Save a task with your countries, periods and
trackChanges, and schedule it daily: every row carries its rank, the previous rank and the change per day, andis_newmarks entries new to the list. AddonlyNewto receive and pay for only what a task has not delivered before. Apify's integrations on the task send the result to Slack, e-mail or a sheet. Ready-made: Monitor new trending TikTok hashtags daily. - Market and industry research —
hashtagCountries: ["ALL"]with the industry lists gives every country's top hashtags per industry;industrieson each row is the hashtag's own industries, andlistssays which rankings it tops.minPosts,minViewsandonlyRisingnarrow it to what moves. Ready-made: Rising TikTok hashtags with 1M+ views in the US, UK and Germany. - Video ranking history — The weekly and monthly rankings are kept by TikTok:
videoSnapshotsreads the last N,videoSnapshotDatesthe ones that held given dates. Rows of different weeks have differentrecord_ids and the samevideo_id, so a sheet shows how long a video stayed on top. - Watching hashtags —
hashtagskeeps only the hashtags you name. One that is not in TikTok's logged-out lists for a country and period comes back as a freenot_listedrow, so absence is a fact in the data. Ready-made: Check whether your hashtags are trending on TikTok, per country. - Creative research — Top Ads with
topAdsMetricscarry the per-second CTR and retention curves;transcribeVideosadds the spoken words (charged per started minute of video) and, withtranscriptTiming, the timed first three seconds,tagAdstyped angle and offer tags,summaryRowsthe hashtags used across video titles and ad captions and whether they are also trending.downloadMediastores the covers and videos under links that do not expire. Ready-made: Store TikTok Top Ads videos and covers with links that last.
Input configuration
| field | type | default | what it does |
|---|---|---|---|
sections | array | [] | The Creative Center lists to read, in one run and one row shape (section says which). Empty = trending hashtags, unless you give startUrls, adIds or the Spotlight. Songs, creators, Top Products and Keyword Insights are gone from TikTok's Creative Center: asking for one checks its old route on the run and returns a free labelled row with TikTok's answer, never an empty success. |
hashtagCountries | array | ["US"] | The 27 markets the Creative Center ranks hashtags in. Each country × period is its own set of lists. |
hashtagPeriods | array | ["7"] | Ranking windows. TikTok ranks hashtags over 7, 30 or 90 days (120 and 180 are gone). |
hashtagIndustries | array | [] | Empty = every list: the overall ranking plus each of the 15 industry rankings, merged into one row per hashtag with its rank in each (lists). Logged out, TikTok shows 3 hashtags per list, so the full sweep gives about 46 hashtags per country and period instead of 3. Pick lists to read only those. |
hashtags | array | [] | Keep only these hashtags (#skincare, skincare, or a tiktok.com/tag/ link). A watched hashtag that is not in TikTok's logged-out lists for a country and period comes back as a free not_listed row. |
minPosts | integer | 0 | Keep hashtags with at least this many posts in the period. 0 = all. |
minViews | integer | 0 | Keep hashtags with at least this many views in the period. 0 = all. |
onlyRising | boolean | false | Keep hashtags whose popularity curve is rising (trend_direction: up). |
videoCountries | array | ["US"] | The five markets the Creative Center ranks videos in. |
videoPeriods | array | ["last_7_days"] | The rolling 7 / 30-day windows, or TikTok's weekly and monthly rankings. Every row carries the window's start and end dates (period_start, period_end). |
videoSortBy | array | [] | Empty = all three. Each sort is its own list of 4 (logged out). |
videoContentTags | array | [] | Empty = all content plus each of the 13 content tags (the 5 the page offers and 8 more TikTok serves). Each is its own list. |
videoOrganic | both / all_views / organic_only | "both" | TikTok ranks videos on all views or on organic views only; both reads both lists. |
videoSnapshots | integer | 1 | How many rankings to read per country and period, newest first: 12 with the weekly ranking = the last 12 weeks. TikTok keeps weekly rankings back to 2025-07-27, monthly to 2025-05-31, the rolling windows about 31 days; an end it does not keep comes back as a free no_snapshot row. |
videoSnapshotDates | array | [] | Read the rankings that hold these dates (YYYY-MM-DD) instead: the week ending on the Sunday on or after a date, the month of a date, or the rolling window ending on it. |
videoDetails | boolean | false | One more call per video: up to 200 top comments with likes, the comment keywords TikTok extracts, the creator's store region. TikTok serves this record logged out for US videos only; other countries' rows say detail_status: login_required and are not charged for it. |
topAdsCountries | array | ["US"] | Used when sections has Top Ads. An ad seen in several countries' lists comes once. |
topAdsPeriod | 7 / 30 / 180 | "30" | The Top Ads period. |
topAdsSortBy | for_you / ctr / like / impression / play_2s_rate / play_6s_rate / cvr | "ctr" | TikTok's own order of the list. for_you changes between sessions; ctr is stable. rank on each row is the position in this order. |
topAdsIndustries | array | [] | Creative Center industries by name (Apparel & Accessories, Games) or id. |
topAdsObjectives | array | [] | Campaign objectives. Product sales (and Conversions) give the commerce ads rivals sell as "trending products". |
topAdsLanguages | array | [] | Ad languages (ISO 639-1). |
topAdsFormat | all / video / image | "all" | The ad format filter. |
topAdsLikes | all / top_20 / top_40 / top_60 / top_80 / top_100 | "all" | TikTok's likes tier filter. |
topAdsKeyword | string | Keep ads whose caption or brand contains these words. The Creative Center serves no keyword search logged out, so the lists are swept and matched (this switches topAdsSweep on). | |
topAdsSweep | boolean | false | Logged out a Top Ads list holds 20 ads. The sweep reads the same country and period under every sort, objective, likes tier, industry and language and keeps the new ads. |
topAdsDetails | boolean | true | One more call per ad: landing page, countries, comments, shares, objectives, keyword list. |
topAdsMetrics | boolean | false | Ten more calls per ad: the per-second CTR, CVR, clicks, conversions and retention curves and the five percentiles TikTok shows on the ad page. |
topAdsSpotlight | boolean | false | The hand-picked Spotlight ads with TikTok's expert note. |
startUrls | array | [] | Creative Center URLs copied from the browser: a trends hashtag list (its country, period and industry are kept), a hashtag's page, the top videos page, a Top Ads list or ad page, the Spotlight page. A text file, CSV or published Google Sheet with one URL per line works too. |
adIds | array | [] | Creative Center Top Ads ids (or their page URLs) to fetch with their detail record. An id TikTok no longer has comes back as a free not_found row. |
maxItems | integer | 0 | The most charged rows (hashtags, videos, Top Ads together) this run delivers. 0 = no limit. Free rows (labels, summaries) do not count. |
trackChanges | boolean | false | Remember this task's lists between runs: every row gets previous_rank, rank_change, rank_velocity_per_day, is_new, first_seen_at and times_seen. |
onlyNew | boolean | false | Deliver and charge only hashtags, videos and Top Ads this task has not delivered before (a Top Ad whose likes or CTR changed comes back as changed). Turns the memory on. |
includeEnded | boolean | false | A free ended row for each entry an earlier run delivered that a complete read of the same list no longer returns. Turns the memory on. |
stateStoreName | string | Name of the memory between runs. Empty = derived from the lists (not the dates), so the same task always meets its own memory. | |
summaryRows | boolean | false | Free rows after the data: each hashtag used in the run's video titles and ad captions (and whether it is also trending), each Top Ads brand, each landing page. |
outputFormat | full / compact | "full" | compact is for sheets and AI agents; billing is the same. With downloadMedia it keeps the stored files' links (image_file_url, video_file_url, media_files). |
downloadMedia | none / images / all | "none" | TikTok's media links expire (media_expires_at). Store the files in the run's key-value store and get links that do not; a file two rows share is stored and billed once per run. |
transcribeVideos | boolean | false | The spoken words of each top video and Top Ad, with the language and the first three seconds (hook_3s). A video without speech is not charged. |
transcriptTiming | boolean | false | With transcribeVideos: word timestamps from a second model call, so hook_3s is the words of the first three seconds of speech and speech_seconds and transcript_segments are filled. Without it the transcript is the spoken words and hook_3s its first eight words. |
tagAds | boolean | false | Typed tags from the caption: angle, CTA intent, tone, offer type, funnel stage and sentiment, each with its confidence (analysis_*). The same tags as our other ad library actors. |
analyzeAds | boolean | false | A short written read of each Top Ad: hook, offer, audience, strategy. |
trendDigest | boolean | false | One digest row at the end: what is trending in the lists this run read, the themes, the rising hashtags and what to act on, written from the rows' own numbers. |
openaiApiKey | string | Your own key for transcribeVideos, analyzeAds and trendDigest, if you want the model usage on your account. Not needed: the Actor has its own. | |
runTag | string | Your own label, copied onto every row (run_tag). | |
resumeFromRunId | string | The id of a run of this Actor with the same input that stopped early (timeout, abort): this run continues where it stopped, without delivering or billing its rows again. |
FAQ
Why 3 hashtags per list? The Creative Center page shows more.
Logged out, TikTok's API serves 3 hashtags and 4 videos per list; the page shows more only to signed-in TikTok accounts. This Actor does not use accounts or cookies. It reads every list TikTok has for a country and period and merges them, which gives about 46 hashtags and 85 videos instead of 3 and 4, and each row says how many rows its lists served.
Where are songs, creators and Top Products?
TikTok removed them from the Creative Center: the old routes answer deprecated (songs, creators, Keyword Insights) or 404 (Top Products), and the pages redirect. Ask for them in sections and the run checks the route again and returns a free labelled row with TikTok's answer; if TikTok brings a section back, that row says so.
Why are comments only on US videos?
TikTok serves the video's detail record (comments, comment keywords) to logged-out readers for US videos only; for Japan, Vietnam, Thailand and Indonesia it answers "login required". Those rows say detail_status: login_required and are not charged for the detail.
What do the period dates mean for videos?
period_end is the snapshot TikTok keys the list by: the Sunday of a weekly ranking, the last day of a monthly one, the last day of a rolling window. period_start is the first day of the window.
What is never charged?
Labelled rows for removed sections, watched hashtags not in the lists, snapshots TikTok does not keep, Top Ads ids TikTok no longer has, entries that left a list, summary rows; a video detail that is login-only or failed; a repeat of a file two rows share (stored and billed once); and any run that failed.
How is the CTR of a Top Ad shown?
As TikTok's rank bucket: ctr_top_percent 6.0 means "CTR Top 6 %" in the Creative Center — lower is better. It is not a click-through rate.
Integration
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('hyperbach/tiktok-creative-center-scraper').call({"sections": ["hashtags"], "hashtagCountries": ["US"], "hashtagPeriods": ["7"]});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('hyperbach/tiktok-creative-center-scraper').call(run_input={'sections': ['hashtags'], 'hashtagCountries': ['US'], 'hashtagPeriods': ['7']})items = client.dataset(run['defaultDatasetId']).list_items().items
CLI
$apify call hyperbach/tiktok-creative-center-scraper --input '{"sections": ["hashtags"], "hashtagCountries": ["US"], "hashtagPeriods": ["7"]}'
REST
curl -X POST "https://api.apify.com/v2/acts/hyperbach~tiktok-creative-center-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H 'Content-Type: application/json' -d '{"sections": ["hashtags"], "hashtagCountries": ["US"], "hashtagPeriods": ["7"]}'
Support
This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.