TikTok Scraper (Super) - Profiles, Search, Comments, Ads & Shop
Pricing
$0.30 / 1,000 result rows
TikTok Scraper (Super) - Profiles, Search, Comments, Ads & Shop
TikTok scraper for public profiles, videos, keyword search, comments, downloads, ads and Shop products. Export one dataset with source labels for marketing, creator research and price tracking.
Pricing
$0.30 / 1,000 result rows
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
15 days ago
Last modified
Categories
Share
TikTok Scraper: TikTok Super for Profiles, Comments, Ads & Shop
This TikTok scraper collects public profiles, videos, comments, ads and Shop products for marketing research, creator analysis and price tracking. TikTok Super combines profiles, keyword search, comments, downloads, related videos, the Explore feed, hashtag reach, the TikTok Ad Library and TikTok Shop in one dataset.
Give it a mix of handles, keywords, video links, advertisers or shop terms and get one combined dataset. Each result row identifies its source, so you can separate a creator's videos from keyword matches, comments, ads and products. The Actor combines records; it does not infer relationships between a creator, an advertiser and a Shop seller. Use the returned identifiers for your own joins.
What the TikTok Super Scraper gives you
- Account data: handle, display name, follower and like counts for any
public TikTok account — on search account rows (
result_type: "account"), and handle plus follower count on every video row. - Videos: caption, play/like/comment/share/save counts, duration, sound, hashtags and posting date, per account, per keyword, per related seed, or from the public Explore feed.
- Comments: one row per comment (and reply, when enabled) with text, like count, reply count and author.
- Related videos: for any seed video, the videos TikTok surfaces as related,
about sixteen per seed (fewer once
max_per_sourceis reached), each a full record, to widen coverage from a starting point. - Hashtag reach: how many videos carry a hashtag and how many views they have between them.
- Ads: matching TikTok Ad Library records up to your requested limit, with format, first/last shown dates, media links, impressions and spend fields. Zero impressions or an empty spend field do not establish campaign performance.
- Shop products: title, sale and original price, currency, brand, rating, reviews, units sold, images and seller for TikTok Shop listings.
Every result row carries source and source_actor. The separate run summary
has its own shape and does not carry these two result labels.
Why scrape TikTok
Public TikTok content is spread across profile pages, search results, comment threads, the ad library and Shop listings. A TikTok data scraper makes those records available for spreadsheets, scheduled reports and analysis from code. Use this Actor when a research task needs several of those sources together. Counts, captions, dates and prices retain their source-specific fields rather than being reduced to a single generic metric. Availability varies by source, region and target, and a run does not promise a complete historical archive.
Two ways to run it
Auto mode. Set query to a single term and it fans out to every term-driven
source at once, the same string is used as the account handle, the search
keyword, the advertiser name, the shop keyword and the hashtag. One input gives
you the account, its search landscape, the ads that brand runs and matching Shop
products in one dataset.
Flexible mode. Leave query empty and fill only the per-source fields you
want. Each source runs on its own input and only the fields you fill are run.
The two modes combine: any non-empty per-source field overrides query for
that source. Comments, downloads and related videos always need explicit video
links or IDs. An account in profiles does not automatically populate
comment_videos; provide the video links whose comments you want to collect.
Input
Provide a query (auto mode) and/or the per-source fields (flexible mode).
List inputs also accept comma-separated or newline-separated strings. Empty
list entries are ignored. The Console prefills profiles with @nasa; this is
a form suggestion, not an account silently added to API requests. Numeric and
boolean defaults apply when omitted. Input with no usable target fails with
an English explanation.
| Field | Type | What it does |
|---|---|---|
query | string | Auto mode: one term used as handle, keyword, advertiser, shop term and hashtag at once |
profiles | array, string or null | Handles or profile links; returns recent videos with creator details; Console prefill is @nasa |
keywords | array, string or null | Keyword search; returns matching videos per keyword |
comment_videos | array, string or null | Video links/ids; returns comments (and replies) per video |
download_videos | array, string or null | Video links/ids; returns the media file/URL and quality ladder |
advertisers | array, string or null | Advertiser names; returns ads from the TikTok Ad Library |
shop_keywords | array, string or null | Keywords; returns TikTok Shop products |
hashtags | array, string or null | Hashtags; returns reach figures |
related_to | array, string or null | Seed video links/ids; returns related videos per seed |
explore | integer | Explore videos requested, 0–30; default 0 disables it |
explore_category | string | Explore category ID; default "0" selects the mixed feed |
sources | array, string or null | Select profile, search, comments, downloads, ads or shop; empty means all sources with input |
region | string | Market code, such as US or NL; default "US"; unsupported ad-library regions fall back to all |
max_per_source | integer | Hard row cap per source call, 1–500; default 50; several calls can each reach this limit |
include_replies | boolean | Fetch comment replies; default false |
quality | string | Download quality: highest, 1080p, 720p, 540p or lowest; empty uses the default, unknown values use highest |
concurrency | integer | Concurrent source calls, 1–6; default 3 |
actor_ids | object | Advanced per-source Actor IDs; the specified Actor is called with the source input. Public HTTP(S) endpoint overrides are also accepted |
cursor | string | Continuation cursor from a previous response's next_cursor; leave empty for a fresh run |
The list fields accept arrays of strings or strings separated by commas or
newlines. A null list is treated as empty. Use the exact sources values
profile, search, comments, downloads, ads and shop; unknown names are
ignored. Only an empty or omitted selection uses all sources with input. A
non-empty selection with no recognised names fails with an English explanation
because it has no usable source plan.
Hashtags, related videos and Explore belong to profile for source selection.
Start with a measured profile input
This input was used in a real validation run that returned five NASA videos:
{"profiles": ["@nasa"],"max_per_source": 5}
Set only the targets you need, check the returned source counts, then increase
max_per_source. A run with several keywords or advertisers can return more
than that number in total because the cap applies to each call, not the whole run.
Output
The default dataset holds one tiktok_super_summary row (rows per source,
which sources returned data, and any per-source errors) followed by one row per
result, each tagged with its source: profile, search, comments,
downloads, ads or shop. hashtags, related_to and the Explore feed all
come back as profile rows. Profile mode delivers video rows containing creator
details; account records from search use result_type: "account".
The following video excerpt comes from the same NASA run as the input above
(Apify run aFDglCs7DGMyuiIvb). Values are copied from its saved response, not
estimates, and current engagement counts may differ:
{"source": "profile","source_actor": "tiktok-profile","video_id": "7665075736742530317","url": "https://www.tiktok.com/@nasa/video/7665075736742530317","description": "Something big just landed on TikTok.","created_at": "2026-07-21T20:09:02Z","play_count": 1500000,"like_count": 100200,"comment_count": 2942,"share_count": 3205,"handle": "nasa","follower_count": 2000000,"hashtags": null}
Output fields and record types
The summary contains _type: "tiktok_super_summary", sources_requested and
sources_with_rows as lists, rows_per_source as an object of integer counts,
total_rows as an integer and errors as a list. Each error contains source,
actor, input and error. The same summary and error list remain available
in the run's key-value store as summary and errors.
Video records preserve IDs, URLs, dates and the count fields in the example.
They also carry saves, duration, dimensions, cover links and music metadata
when available. Existing aliases remain available, including video_id/post_id,
url/post_url, description/text, created_at/posted_at, play_count/views,
like_count/likes, comment_count/comments_count, share_count/shares,
handle/author_handle and author_id/account_id. Counts are numbers, IDs
are strings, and an unavailable value may be null; a video without hashtags
can have hashtags: null.
Comment rows contain comment and video IDs, text, author details, like and reply
counts, and reply flags. Hashtag rows contain reach counts rather than a video
list. Ad rows retain videos as a list and video_url as a string or null;
nested video objects carry video_url and cover_image. Download rows retain
file_url and file_size_bytes, including null when a file is unavailable,
plus selected_media_url, selected_quality and qualities. Each quality
entry retains label, resolution, bitrate, codec, dimensions, byte size and URL.
Shop rows retain product identifiers, title, sale and original prices, currency,
brand, rating, reviews, units sold, images and seller fields.
For large jobs, the Apify run follows continuation pages and assembles the
dataset. The summary row appears once at the front of that assembled dataset.
The additional OUTPUT record reports warnings and partial results. If you
explicitly resume from a returned next_cursor, pass it unchanged as cursor
with the same targets. A final failed media transfer can still deliver real
video metadata with an unavailable file, accompanied by a warning.
Complete field reference
The tables preserve the exact field names from the saved legacy responses and
the source row builders. Fields vary by record type and enabled options; a
null value means unavailable. Added aliases accompany the existing fields.
Arrays contain the element type shown below. Dates and fetched_at are strings;
fetched_at uses ISO 8601 UTC. Source-specific identifiers stay strings.
Video rows
| Field | JSON type |
|---|---|
_type | string |
account_id | string or null |
author_avatar_url | string or null |
author_bio | string or null |
author_handle | string or null |
author_id | string or null |
author_private | boolean or null |
author_sec_uid | string or null |
author_verified | boolean or null |
author_video_count | integer or null |
avatar_file_key | string or null |
avatar_file_url | string or null |
collect_count | integer or null |
comment_count | integer or null |
comments_count | integer or null |
cover_file_key | string or null |
cover_file_url | string or null |
cover_url | string or null |
created_at | string or null |
description | string or null |
duration_seconds | integer or null |
fetched_at | string or null |
follower_count | integer or null |
handle | string or null |
hashtags | array |
hashtags_normalized | array |
height | integer or null |
is_ad | boolean or null |
like_count | integer or null |
likes | integer or null |
music_author | string or null |
music_cover_file_key | string or null |
music_cover_file_url | string or null |
music_id | string or null |
music_title | string or null |
nickname | string or null |
platform | string or null |
play_count | integer or null |
position | integer or null |
post_id | string or null |
post_url | string or null |
posted_at | string or null |
record_type | string or null |
search_page | integer or null |
search_term | string or null |
seed_video_id | string or null |
share_count | integer or null |
shares | integer or null |
slideshow_file_keys | array |
slideshow_file_urls | array |
source | string or null |
source_actor | string or null |
text | string or null |
url | string or null |
video_file_key | string or null |
video_file_url | string or null |
video_id | string or null |
views | integer or null |
width | integer or null |
Hashtag rows
| Field | JSON type |
|---|---|
_type | string |
description | string or null |
fetched_at | string or null |
hashtag | string or null |
hashtag_id | string or null |
is_commerce | boolean or null |
platform | string or null |
position | integer or null |
record_type | string or null |
source | string or null |
source_actor | string or null |
url | string or null |
video_count | integer or null |
view_count | integer or null |
Comment rows
| Field | JSON type |
|---|---|
_type | string |
author_handle | string or null |
author_id | string or null |
avatar_url | string or null |
comment_id | string or null |
created_at | string or null |
fetched_at | string or null |
handle | string or null |
is_author | boolean or null |
is_pinned | boolean or null |
is_reply | boolean or null |
language | string or null |
like_count | integer or null |
liked_by_author | boolean or null |
likes | integer or null |
nickname | string or null |
parent_comment_id | string or null |
platform | string or null |
position | integer or null |
post_id | string or null |
posted_at | string or null |
reply_count | integer or null |
source | string or null |
source_actor | string or null |
text | string or null |
user_id | string or null |
user_region | string or null |
user_signature | string or null |
user_url | string or null |
video_comment_total | integer or null |
video_id | string or null |
Download rows
| Field | JSON type |
|---|---|
_type | string |
author_id | string or null |
collect_count | integer or null |
comment_count | integer or null |
cover_url | string or null |
created_at | string or null |
description | string or null |
download_url | string or null |
duration_seconds | integer or null |
dynamic_cover_url | string or null |
fetched_at | string or null |
file_size_bytes | integer or null |
file_url | string or null |
handle | string or null |
hashtags | array |
hashtags_normalized | array |
height | integer or null |
is_ad | boolean or null |
like_count | integer or null |
media_cookie_header | string or null |
music_author | string or null |
music_id | string or null |
music_title | string or null |
music_url | string or null |
nickname | string or null |
platform | string or null |
play_count | integer or null |
play_url | string or null |
position | integer or null |
qualities | array |
selected_media_url | string or null |
selected_quality | string or null |
share_count | integer or null |
source | string or null |
source_actor | string or null |
source_url | string or null |
url | string or null |
video_id | string or null |
width | integer or null |
Shop rows
| Field | JSON type |
|---|---|
_type | string |
brand | string or null |
category_path | array |
country | string or null |
currency | string or null |
currency_symbol | string or null |
description | string or null |
discount_percent | number or null |
fetched_at | string or null |
found_on | string or null |
image_url | string or null |
original_price | number or null |
platform | string or null |
position | integer or null |
price | integer or number or null |
price_masked | string or null |
product_id | string or null |
promotion_labels | array |
rating | number or null |
review_count | integer or null |
saving | number or null |
seller | string or null |
seller_followers | integer or null |
seller_id | string or null |
seller_product_count | integer or null |
seller_sold_count | integer or null |
sku_id | string or null |
slug | string or null |
sold_count | integer or null |
source | string or null |
source_actor | string or null |
title | string or null |
url | string or null |
Ad rows
| Field | JSON type |
|---|---|
_next_offset | integer or null |
_next_search_id | string or null |
_type | string |
ad_id | string or null |
ad_status | string or null |
ad_text | string or null |
ad_type | string or null |
advertiser_name | string or null |
audit_status | string or null |
creative_id | string or null |
days_active | integer or null |
days_shown | integer or null |
deeplink | string or null |
estimated_audience | string or null |
fetched_at | string or null |
first_seen | string or null |
first_shown | string or null |
format | string or null |
image_url | string or null |
image_urls | array |
impression | integer or null |
last_seen | string or null |
last_shown | string or null |
pages_fetched | integer or null |
platform | string or null |
query | string or null |
region | string or null |
region_code | string or null |
result_type | string or null |
sort | string or null |
source | string or null |
source_actor | string or null |
spent | string or null |
text | string or null |
total_ads_in_search | integer or null |
video_url | string or null |
videos | array |
Account rows
| Field | JSON type |
|---|---|
_type | string |
author_id | string or null |
author_verified | boolean or null |
avatar_url | string or null |
bio | string or null |
fetched_at | string or null |
follower_count | integer or null |
handle | string or null |
is_live | boolean or null |
nickname | string or null |
platform | string or null |
position | integer or null |
search_term | string or null |
sec_uid | string or null |
source | string or null |
source_actor | string or null |
total_likes | integer or null |
url | string or null |
verified_reason | string or null |
Summary rows
| Field | JSON type |
|---|---|
_type | string |
errors | array |
rows_per_source | object |
sources_requested | array |
sources_with_rows | array |
total_rows | integer |
Nested fields
| Field | JSON type |
|---|---|
videos[].video_url | string |
videos[].cover_image | string |
qualities[].label | string |
qualities[].resolution | integer |
qualities[].bitrate | integer |
qualities[].codec | string |
qualities[].width | integer |
qualities[].height | integer |
qualities[].size_bytes | integer |
qualities[].url | string |
errors[].source | string |
errors[].actor | string |
errors[].input | object |
errors[].error | string |
rows_per_source.<source> | integer |
The errors list in the summary uses the same nested shape. input contains
the exact source-call input. source_actor retains the source label, including
when actor_ids selects another Actor. Download file fields can be null
after a failed transfer; ad videos remains an array when no video is available.
Use cases
Competitor content intelligence. Marketing and social teams give the actor a
competitor's handle plus a set of keywords and get the competitor's recent
videos, the engagement on each, and the videos ranking for those keywords in one
table. Grouping by source separates the account's own output from the wider
keyword landscape, so you can see both what they post and what they compete
against.
Ad and campaign monitoring. Growth and paid-media teams pass a list of advertisers and get matching TikTok Ad Library records within their row limit. Compare formats and publication dates across scheduled runs to spot creative changes. Retain impressions and spend as returned; sparse values do not support estimates of campaign budgets, conversions or return on advertising spend.
Creator research and outreach. Agencies and brand teams pass a set of handles and get follower counts, video output and per-video engagement, the numbers you need to size a creator before a partnership, without opening TikTok forty times.
Product and price tracking on TikTok Shop. E-commerce teams pass shop
keywords and get products with prices, ratings, review counts and units sold,
for catalogue research or competitor price monitoring in the market you set with
region.
TikTok profile scraper and video research
Use TikTok Super as a TikTok profile scraper when you need recent public videos
and their creator details alongside other sources. A TikTok video scraper
workflow starts with profiles for known creators or keywords for discovery.
Compare captions, posting dates and returned engagement counts, using video_id
or post_id to identify videos across scheduled runs. With the default sources,
profile input produces video records with creator fields, rather than a separate
account row for each handle. Search can also return account records, identified
by result_type: "account".
TikTok scraper API
A TikTok scraper API lets you collect TikTok data as JSON from code. Start this Actor through the Apify API with the same input as the Console and read the dataset when the run finishes. Authenticate to Apify with your Apify token; no TikTok account or TikTok credentials are required.
{"query": "nike", "max_per_source": 3}
This auto-mode input also comes from a real validation run. The same term drives the account, keyword search, advertiser, Shop search and hashtag unless you provide explicit per-source targets. Flexible mode uses the same JSON structure with those targets instead. Poll the run and download its dataset as JSON, CSV or Excel. Billing follows delivered result rows.
How this TikTok scraper compares
Clockworks' TikTok Scraper already covers profiles, search, hashtags, downloads and related videos, with options such as subtitles and follower lists. API Dojo's TikTok Scraper also offers several TikTok record types and a pay-per-result model. Check their input schemas when you need those specific features.
TikTok Super focuses on combining profiles, search, comments, downloads, ads
and Shop results under the existing query and per-source inputs, with one
summary and source labels. Its hashtag mode returns reach figures, and it does
not collect follower lists or subtitles. For dedicated controls on one source,
use our TikTok Ads Library Scraper,
TikTok Profile Scraper, comment or Shop
Actors linked below. A mixed dataset still needs your own analysis to connect
records across sources.
Pricing
The existing pay-per-event price is $0.0003 per delivered result row, or
$0.30 per 1,000 results, across all sources. The event is named item.
There is no run fee, the summary row is not billed, and a valid search with no
results incurs no result charge. You pay for delivered records, including video
metadata when a requested media file could not be transferred.
For users on Apify's free plan, delivery is capped at ten dataset rows per run,
including the summary row: at most nine result rows. Their max_per_source
input is also capped at ten. This is a delivery limit; it does not change the
result price. Paying users retain their requested cap. max_per_source is per
call, so a mixed run can contain several separately capped result groups.
Limits and gotchas
- Source availability varies. Explore is best-effort, and any source can
return fewer results or become temporarily unavailable. Check
rows_per_source,errorsand warnings before treating a missing result as a market signal. - Hashtags return reach, not the video list. TikTok does not serve a hashtag's videos to logged-out visitors, so the hashtag source returns counts and says so, rather than an empty list.
- Login-gated data is out of scope. A logged-out visitor's view is what you get; private accounts, follower lists and anything behind a login are not available.
- Set
regionto the market you want. Prices, currency and some feeds vary by country. The ad library supports its own regional selection; unsupported values, including US, use its globalallsetting. max_per_sourcelimits each call. Multiple keywords, videos or advertisers can generate several calls. It is not a total spending limit; use Apify's maximum total charge setting to limit the run's overall spend.- Media availability varies. Media links can expire, and video metadata can be returned even when a file is unavailable. Download needed files while their links are valid.
FAQ
Can I scrape TikTok without an API key? No TikTok API key or account is needed. Console runs use your Apify account, and API runs require your Apify token.
Can I get TikTok videos and their comments in one run? Yes. Put account
handles or profile links in profiles and explicit video links or IDs in
comment_videos. The Actor does not discover comment targets from profile results.
Does this TikTok comment scraper collect replies? Set include_replies to
true with comment_videos to request replies. The default is false. Returned
comment records retain is_reply, parent_comment_id, reply_count and author
fields, so you can distinguish replies from top-level comments. The requested
limit and source availability still apply.
Does it scrape the TikTok Ad Library? Yes. Use advertisers for matching
library ads, limited by max_per_source and the library's regional coverage.
Can I scrape TikTok Shop prices? Yes, via shop_keywords, with price,
rating, reviews and units sold per product.
Is there a TikTok hashtag scraper? Yes, via hashtags: each one comes back
with how many videos carry the tag and how many views those videos have in
total, tagged profile like the rest of the account data.
Can I limit which sources run? Yes. Fill only the fields you need, or set
sources to an explicit list. With query enabled, restrict sources when you
want only some of the term-driven sources.
Is there a TikTok scraper API? Yes. Start the Actor with JSON input through the Apify API, poll the run and read the dataset. Input fields and result pricing are the same as in the Console.
What happens when one source returns nothing? Other sources can still deliver records. Check the summary's source counts and errors. A valid run with no matches succeeds without billed results; input with no target fails validation.