TikTok [only $0.9💰] Ad Library & Hashtag Trends Scraper
Pricing
from $0.90 / 1,000 results
TikTok [only $0.9💰] Ad Library & Hashtag Trends Scraper
💰$0.9 per 1,000 results. Unlock TikTok's viral potential with real-time hashtag analytics, audience insights, and trend data—transform raw metrics into winning strategies with precision-scraped engagement stats, demographic breakdowns, and competitive intelligence that keep you ahead in the game.
Pricing
from $0.90 / 1,000 results
Rating
5.0
(1)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
8
Bookmarked
129
Total users
6
Monthly active users
a day ago
Last modified
Categories
Share
TikTok Ads & Trends Scraper
Three scrapers in one actor. Pick a mode and run:
- 📊 Trends mode — the top trending hashtags from the TikTok Creative Center, each with rank, post count, total views, a popularity curve, and top creators. Leave the country empty to sweep 27 markets in one run.
- 🏆 Top Ads mode — the best-performing ad creatives from the TikTok Creative Center, ranked by CTR / likes / spend, with CTR, cost, likes, comments, shares, campaign objective, target countries, landing page and video URLs (37 fields per ad).
- 🔍 Ad Library mode — individual ad creatives from the official TikTok Ad Library (
library.tiktok.com): advertiser, video + cover, images, first/last-shown dates, estimated audience size, and moderation/rejection info. Searchable by keyword or advertiser, across the EU/EEA + UK + TR.
Overview
Three distinct TikTok data sources, one actor:
| Mode | Data source | Best for |
|---|---|---|
| Trends | ads.tiktok.com/business/creativecenter (hashtags) | Discovering what's organically popular — for content strategy, hashtag research, industry benchmarking |
| Top Ads | ads.tiktok.com/creative_radar_api (Top Ads board) | Studying the best-performing paid creatives — for hook research, swipe files, CTR benchmarking |
| Ad Library | library.tiktok.com (Ad Library + Other Commercial Content) | Auditing what paid ads a brand is running, and disclosed branded creator posts — for competitive analysis and ad-transparency research |
Choose your mode with the mode input field. The relevant filter group is the only one you need to fill in — fields outside the active mode are ignored.
⚠️ Ad Library availability: TikTok's Ad Library is a DSA-compliance transparency tool, so it only covers ads shown in EU/EEA + United Kingdom + Türkiye (33 regions: AT, BE, BG, CH, CY, CZ, DE, DK, EE, ES, FI, FR, GB, GR, HR, HU, IE, IS, IT, LI, LT, LU, LV, MT, NL, NO, PL, PT, RO, SE, SI, SK, TR). Other country values silently fall back to all regions with a warning in the log.
Features
All modes
- Mode switch: pick Trends, Top Ads, or Ad Library with one input field
- Country / region filter shared across modes
resultsLimitcaps the dataset for cost control- Proxy support with built-in Apify Proxy integration
- Concurrency tuning (
maxConcurrency/minConcurrency) - Retry control with graceful skip on TikTok-side errors
Trends mode
- Time window of 7 / 30 / 120 days
- Multi-market sweep — leave
countryempty to collect all 27 supported markets in one run - Rich rows — rank, post count, total views, popularity time-series, top creators, direct Creative Center link
Top Ads mode
- Ranking window of 7 / 30 / 180 days
- Rank by For You / CTR / 2-second play rate / 6-second play rate / conversion rate (CVR) / likes / impressions / spend
- Industry filter incl. sub-categories — the full Creative Center taxonomy (21 top-level industries + 267 sub-categories, e.g. Beauty & Personal Care > Skincare), applied server-side
- More filters — target country, campaign objective, ad language, Spark vs Non-Spark ad format
- Client-side refinement —
keyword(title/brand contains) andminLikes - Full engagement + performance per ad — CTR (with computed benchmark tier), cost, likes, comments, shares, favorites
- Full detail toggle (
extractDetails) — adds target country list, landing page, keyword list and objectives from each ad's detail page - Video URLs in up to five renditions (360p–1080p) plus
videoUrlBest, cover image, and the Creative Center link
Ad Library mode
- Paste-a-URL shortcut (
startUrl) — copy a filtered URL straight fromlibrary.tiktok.comand the actor parses region, search terms, advertiser, sort, and date range out of it - Two library surfaces (
sourceType) — Ad Library (paid ads with transparency data) or Other Commercial Content (disclosed branded creator posts) - Search by keyword or advertiser name (with
"…"for exact-phrase match) - Date range (
startDate/endDate— defaults to the last 30 days) - Sort by last-shown / first-shown date, or by reach / views (largest or smallest first)
- API-first extraction — reads a pre-warmed signing token, then pages the library APIs over plain HTTP (fast, no browser-per-ad)
- Full pagination with dedupe across all matching items up to
resultsLimit
How to Use
- Pick a mode: choose Trends, Top Ads, or Ad Library via the
modefield. - Fill in the matching filter group — the input form groups fields under each mode's section.
- Run on Apify (or locally with
npm start). - Export results as JSON, CSV, or Excel from the Apify dataset view.
Input Configuration
Example — Trends mode
{"mode": "trends","country": "","days": 7,"resultsLimit": 100,"proxy": { "useApifyProxy": true }}
Set
countryto a two-letter code (e.g."US") for a single market, or leave it empty to sweep all 27 supported markets.daysis the trend window (7 / 30 / 120). Each hashtag row includesrank,publishCount,views, apopularityCurvetime-series andtopCreators.
Example — Top Ads mode
{"mode": "topAds","country": "US","period": 30,"orderBy": "ctr","industryId": "14103000000","adFormat": "spark_ads","extractDetails": true,"resultsLimit": 100,"proxy": { "useApifyProxy": true }}
industryIdaccepts the full Creative Center taxonomy — the example narrows the board to Beauty & Personal Care > Skincare. Leave it unset for all industries.
Example — Ad Library mode
{"mode": "adLibrary","country": "DE","searchQuery": "nike","advertiserName": "","startDate": "2026-04-01","endDate": "2026-05-07","sortBy": "last_shown_date,desc","resultsLimit": 60,"proxy": { "useApifyProxy": true }}
Example — Ad Library via pasted URL
{"mode": "adLibrary","startUrl": "https://library.tiktok.com/ads?region=FR&adv_name=adidas&sort_type=last_shown_date,desc","resultsLimit": 60,"proxy": { "useApifyProxy": true }}
Copy the URL straight out of your browser with filters applied — the actor parses region, search terms, advertiser, sort and date range from it (and auto-detects Ad Library vs Other Commercial Content). Discrete filter fields are ignored when
startUrlis set.
Example — Other Commercial Content (branded creator posts)
{"mode": "adLibrary","sourceType": "other_commercial_content","country": "DE","sortBy": "views_high","resultsLimit": 50,"proxy": { "useApifyProxy": true }}
Input Parameters
🎯 Start here — all modes
| Parameter | Type | Description | Default |
|---|---|---|---|
| mode | String | "trends" / "topAds" / "adLibrary" | "trends" |
| country | String | Two-letter country code, or "" for all. Trends sweeps 27 markets when empty; Top Ads supports most major markets; Ad Library is restricted to EU/EEA + UK + TR (see Overview). | "US" |
📊 Trends mode — only used when mode = "trends"
| Parameter | Type | Description | Default |
|---|---|---|---|
| days | String | Look-back window: "7" / "30" / "120" | "7" |
🏆 Top Ads mode — only used when mode = "topAds"
| Parameter | Type | Description | Default |
|---|---|---|---|
| period | String | Ranking window: "7" / "30" / "180" days | "30" |
| orderBy | String | for_you / ctr / play_2s_rate / play_6s_rate / cvr / like / impression / cost | for_you |
| industry | String | Top-level industry (18 options) or "all" | "all" |
| industryId | String | Full-taxonomy industry pick incl. sub-categories (289 options, e.g. Beauty & Personal Care > Skincare). Overrides industry when set. | — |
| objective | String | Campaign objective (traffic, conversion, reach, app install, video views, lead gen, product sales, engagement) | all |
| adLanguage | String | Two-letter language code of the ad copy | all |
| adFormat | String | spark_ads / non_spark_ads (empty = all) | all |
| keyword | String | Client-side filter — keeps ads whose title or brand contains this text | — |
| minLikes | Integer | Client-side filter — keeps ads with at least this many likes | — |
| extractDetails | Boolean | Fetch each ad's detail endpoint for target countries, landing page, keyword list, objectives | true |
🔍 Ad Library mode — only used when mode = "adLibrary"
| Parameter | Type | Description | Default |
|---|---|---|---|
| startUrl | String | Paste a filtered library.tiktok.com URL — filters are parsed from it and the fields below are ignored | — |
| sourceType | String | ad_library (paid ads) or other_commercial_content (branded creator posts) | ad_library |
| searchQuery | String | Keyword or advertiser name to search. Wrap in "…" for exact-phrase match. In Other Commercial Content mode this matches the creator's username. | "nike" |
| advertiserName | String | Optional filter by registered advertiser name (Ad Library only) | — |
| startDate | String | Earliest last-shown / posted date (YYYY-MM-DD) | 30 days ago |
| endDate | String | Latest last-shown / posted date (YYYY-MM-DD) | today |
| sortBy | String | last_shown_date,desc / last_shown_date,asc / first_shown_date,desc / first_shown_date,asc / reach_high / reach_low / views_high / views_low | last_shown_date,desc |
📦 Output & limits — all modes
| Parameter | Type | Description | Default |
|---|---|---|---|
| resultsLimit | Integer | Hard cap on dataset rows | 100 |
| maxConcurrency | Integer | Maximum parallel requests | 10 |
| minConcurrency | Integer | Minimum parallel requests | 1 |
| maxRequestRetries | Integer | Retries per failed request before skipping | 8 |
| proxy | Object | Proxy configuration (Apify Proxy recommended) | Apify Proxy |
Output Structure
The actor produces a different row shape per mode, distinguishable by the type field:
- Trends rows (
type: "hashtag_trend"):hashtagName,rank,country,period,publishCount,views,industryIds, apopularityCurvetime-series, andtopCreators. See Trends mode output. - Top Ads rows (
type: "top_ad"): 37 fields per ad — rank, title, brand, CTR (+ computed tier), cost, likes/comments/shares, objective, industry, target countries, landing page, and video URLs in up to five renditions. See Top Ads mode output. - Ad Library rows (
type: "ad"):adId,advertiserName,adTitle,videoUrl,videoCover,imageUrls,firstShownDate/lastShownDate,estimatedAudience,rejectionInfo,region. See Ad Library mode output. - Other Commercial Content rows (
type: "commercial_content"): creator username, view buckets, posted date, video/cover URLs. See Other Commercial Content output.
If you need several row shapes in one place, run the actor once per mode and join on whatever business key you need (e.g. advertiser name).
Trends mode output
The Trends-mode scraper provides detailed information for each hashtag. Here's the complete field documentation based on the JSON structure:
Sample row
{"type": "hashtag_trend","hashtagId": "7659867926865903649","hashtagName": "marvelrivalss9","rank": 1,"country": "US","period": 7,"publishCount": 133653,"views": 37575559,"industryIds": ["25000000000"],"popularityCurve": [{ "timestamp": 1783382400, "value": 0 },{ "timestamp": 1783555200, "value": 24.68 },{ "timestamp": 1783728000, "value": 100 }],"topCreators": [{ "creatorId": "0", "nickname": null, "avatarUrl": "https://p16-common-sign.tiktokcdn.com/..." }],"link": "https://ads.tiktok.com/business/creativecenter/hashtag/marvelrivalss9/pc/en?countryCode=US&period=7","scrapedAt": "2026-07-16T07:15:00.000Z"}
Field descriptions — Trends mode
| Field | Type | Description |
|---|---|---|
type | string | Always "hashtag_trend". |
hashtagId / hashtagName | string | TikTok's hashtag identifier and name (without the #). |
rank | number | Rank within the country + period slice (1 = top). |
country / period | string / number | The market and trend window (7 / 30 / 120 days) this row came from. |
publishCount | number | Number of posts using the hashtag. |
views | number | Total video views for the hashtag. |
industryIds | string[] | Creative Center industry IDs the hashtag maps to. |
popularityCurve | array | Popularity time-series — [{ timestamp (unix s), value (0–100 index) }]. |
topCreators | array | Notable creators using the hashtag — [{ creatorId, nickname, avatarUrl }]. |
link | string | Direct Creative Center page for the hashtag. |
scrapedAt | string | ISO timestamp of extraction. |
Note on volume: the Creative Center's public (logged-out) hashtag surface exposes the top 3 hashtags per country × period. Leaving
countryempty sweeps all 27 supported markets in one run to build a larger dataset. (TikTok deprecated the older bulk hashtag endpoint in 2026.)
Top Ads mode output
One row per ad from the Creative Center Top Ads board, in true ranking order.
Sample row (abridged)
{"type": "top_ad","adId": "7069234203623735297","rank": 1,"adTitle": "Shop the viral serum everyone's talking about","brandName": "medicube","ctr": 1.84,"ctrTier": "high","cost": 2,"likes": 40719,"comments": 212,"shares": 1183,"favorite": 3216,"objectiveKey": "campaign_objective_conversion","industryKey": "label_14103000000","industryName": "Skincare","keywordList": ["serum", "skincare"],"countryCodes": ["US"],"landingPage": "https://…","videoDuration": 27.5,"videoCover": "https://p16-….jpeg","videoUrl720p": "https://v16m-….mp4","videoUrl1080p": "https://v16m-….mp4","videoUrlBest": "https://v16m-….mp4","period": 30,"orderBy": "for_you","countryCode": "US","creativeCenterUrl": "https://ads.tiktok.com/business/creativecenter/topads/7069234203623735297/pc/en","detailFetched": true,"scrapedAt": "2026-07-31T21:00:00.000Z"}
Field notes — Top Ads mode
| Field | Description |
|---|---|
rank | The ad's true position in TikTok's ranking, independent of client-side filters. |
ctr / ctrTier | Click-through rate (%) and a benchmark band (low / average / high / exceptional) computed by the actor from fixed CTR thresholds. |
cost | TikTok's relative spend score (1–5), not a currency amount. |
industryKey / industryName | TikTok's opaque industry code and its human-readable label, resolved via the full 549-entry Creative Center taxonomy (sub-categories included). |
countryCodes, landingPage, keywordList, objectives | Populated when extractDetails is on (one extra request per ad). |
videoUrl360p–videoUrl1080p, videoUrlBest | All renditions TikTok returns; videoUrlBest is the highest available. CDN links are signed and typically expire within 24–48 h — download promptly if you archive. |
Note on volume: the anonymous Top Ads surface serves only the first page (~20 ads) per (ranking × industry × country × period) combination — deeper pages require TikTok login. To build bigger datasets, sweep multiple industries (289 taxonomy options), rankings (8
orderByvalues), and periods.
Ad Library mode output
Each row is one ad from the official TikTok Ad Library, retrieved over the public API (the actor warms one signing token via a single headless page-load, then pages the search endpoint over plain HTTP).
Sample row
{"type": "ad","adId": "1870848124471298","advertiserName": "S.F. TRADING S.R.L.","adTitle": "Relax Your Body with a Professional Massage","adType": "2","auditStatus": "1","sorAuditStatus": "1","firstShownDate": 1784179992000,"lastShownDate": 1784179992000,"estimatedAudience": "0-1K","impressions": 0,"spent": "","showMode": 1,"videoUrl": "https://library.tiktok.com/api/v1/cdn/.../video/...","videoCover": "https://p16-common-sign.tiktokcdn.com/...","imageUrls": [],"rejectionInfo": null,"region": "DE","matchedQuery": "nike","matchedAdvertiser": null,"adDetailUrl": "https://library.tiktok.com/ads/detail?ad_id=1870848124471298®ion=DE","scrapedAt": "2026-07-16T07:57:00.000Z"}
Field descriptions — Ad Library mode
| Field | Type | Description |
|---|---|---|
type | string | Always "ad". |
adId | string | TikTok's ad identifier. |
advertiserName | string | The advertiser / page name. |
adTitle | string | The ad's creative title / caption (when present). |
adType | string | TikTok's internal ad-type code. |
auditStatus / sorAuditStatus | string | Moderation status codes. |
firstShownDate / lastShownDate | number | Unix ms timestamps for the ad's active window. |
estimatedAudience | string | Audience-size bucket (e.g. "0-1K"). |
impressions | number | Reported impressions (often 0 for small ads). |
spent | string | Reported spend bucket, when disclosed. |
videoUrl / videoCover | string | Ad video and cover image URLs. |
imageUrls | string[] | Static image creatives, when present. |
rejectionInfo | object | null | Policy-rejection detail — reasons, affected_regions, when the ad was actioned. |
region | string | The Ad Library region the ad was matched in. |
matchedQuery / matchedAdvertiser | string | The keyword / advertiser filter that surfaced this ad. |
adDetailUrl | string | Link to the ad's Ad Library detail page. |
scrapedAt | string | ISO timestamp of extraction. |
Coverage: the TikTok Ad Library only covers EU/EEA + UK + Turkey. Set
countryto a supported code (e.g.DE,FR,GB) — other values fall back toall. Per-ad audience targeting (age/gender/interest breakdown) lives behind a separate per-ad-signed endpoint and is not included in this bulk export.
Other Commercial Content output
When sourceType is other_commercial_content (or the pasted startUrl points at that surface), each row is one disclosed branded creator post.
Sample row
{"type": "commercial_content","contentId": "v26044gc0000d92o8tvog65laio69740","creatorUsername": "nikolaisavic","creatorProfileUrl": "https://www.tiktok.com/@nikolaisavic","brandNames": [],"contentLabel": "1","auditStatus": "1","showMode": "1","postedTime": "1782941168","postedAt": "2026-07-01T21:26:08.000Z","videoViews": "20M-30M","contentViews": "20M-30M","videoUrl": "https://library.tiktok.com/api/v1/cdn/…/video/…","videoCover": "https://p16-common-sign.tiktokcdn.com/…","imageUrls": [],"region": "DE","matchedQuery": null,"scrapedAt": "2026-07-31T21:06:49.101Z"}
Field notes — Other Commercial Content
| Field | Description |
|---|---|
contentId | TikTok video id — empty for photo posts (showMode: "2"). |
creatorUsername / creatorProfileUrl | The posting creator. TikTok's transparency surface exposes only the username (no display name / follower count at this level). |
brandNames | Disclosed partner brands. TikTok returns this field but it is empty on the vast majority of posts. |
showMode | "1" = video post, "2" = photo post. |
videoViews / contentViews | View-count buckets (e.g. "0-1K", "20M-30M") — TikTok does not expose exact counts. |
postedTime / postedAt | Post date as unix seconds and ISO timestamp. |
Search behaviour: on this surface,
searchQuerymatches the creator's username (brand-keyword search is not supported by TikTok's API and returns 0 results). Sorting supports posted date and video views (views_high/views_low); reach options map to the views sort.
Key Notes
- Data Freshness: All three sources update frequently — Trends near real-time, Top Ads as the board refreshes, Ad Library when ads are submitted/audited.
- Rate Limits: The actor handles TikTok's rate limiting gracefully — failed requests are retried with backoff, and TikTok-side error codes are treated as skip-not-retry where retrying can't help, to avoid retry storms.
- Proxies Recommended: Using residential proxies helps avoid IP-based rate limiting on the Creative Center endpoints.
- Ad Library coverage: The Ad Library (both surfaces) is only available for EU/EEA + UK + TR. Country values outside that list fall back to all.
- Top Ads depth: The anonymous Creative Center serves only the first ~20 ads per filter combination — sweep industries/rankings/periods for volume (deeper pages and keyword search are login-gated by TikTok).
- Data Availability: Some metrics are bucketed by TikTok (audience and view ranges like
"10M-20M"), spend is a relative 1–5 score in Top Ads, and signed CDN video links typically expire within 24–48 hours.
Explore More Scrapers
If you found this TikTok Ads Scraper useful, check out the rest of the TikTok toolkit:
- TikTok Followers & Following Scraper — followers, following, and suggested accounts with per-account stats
- TikTok Hashtag Scraper — every video posted under a hashtag, with engagement stats and creator follower counts
- TikTok Search Scraper — TikTok's ranked search results for any keyword
- Social Video Transcript Scraper — captions and AI transcripts for TikTok and Instagram videos
Browse the full portfolio at memo23's Apify profile.
Support
- For issues or feature requests, please use the Issues section of this actor.
- If you need customization or have questions, feel free to contact the author:
- Author's website: https://muhamed-didovic.github.io/
- Email: muhamed.didovic@gmail.com
Additional Services
- Request customization or whole dataset: muhamed.didovic@gmail.com
- If you need anything else scraped, or this actor customized, email: muhamed.didovic@gmail.com
- For API services of this scraper (no Apify fee, just usage fee for the API), contact: muhamed.didovic@gmail.com
- Email: muhamed.didovic@gmail.com
