TikTok Scraper (Super) - Profiles, Search, Comments, Ads & Shop avatar

TikTok Scraper (Super) - Profiles, Search, Comments, Ads & Shop

Pricing

$0.30 / 1,000 result rows

Go to Apify Store
TikTok Scraper (Super) - Profiles, Search, Comments, Ads & Shop

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

SR

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

15 days ago

Last modified

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_source is 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.

FieldTypeWhat it does
querystringAuto mode: one term used as handle, keyword, advertiser, shop term and hashtag at once
profilesarray, string or nullHandles or profile links; returns recent videos with creator details; Console prefill is @nasa
keywordsarray, string or nullKeyword search; returns matching videos per keyword
comment_videosarray, string or nullVideo links/ids; returns comments (and replies) per video
download_videosarray, string or nullVideo links/ids; returns the media file/URL and quality ladder
advertisersarray, string or nullAdvertiser names; returns ads from the TikTok Ad Library
shop_keywordsarray, string or nullKeywords; returns TikTok Shop products
hashtagsarray, string or nullHashtags; returns reach figures
related_toarray, string or nullSeed video links/ids; returns related videos per seed
exploreintegerExplore videos requested, 0–30; default 0 disables it
explore_categorystringExplore category ID; default "0" selects the mixed feed
sourcesarray, string or nullSelect profile, search, comments, downloads, ads or shop; empty means all sources with input
regionstringMarket code, such as US or NL; default "US"; unsupported ad-library regions fall back to all
max_per_sourceintegerHard row cap per source call, 1–500; default 50; several calls can each reach this limit
include_repliesbooleanFetch comment replies; default false
qualitystringDownload quality: highest, 1080p, 720p, 540p or lowest; empty uses the default, unknown values use highest
concurrencyintegerConcurrent source calls, 1–6; default 3
actor_idsobjectAdvanced per-source Actor IDs; the specified Actor is called with the source input. Public HTTP(S) endpoint overrides are also accepted
cursorstringContinuation 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

FieldJSON type
_typestring
account_idstring or null
author_avatar_urlstring or null
author_biostring or null
author_handlestring or null
author_idstring or null
author_privateboolean or null
author_sec_uidstring or null
author_verifiedboolean or null
author_video_countinteger or null
avatar_file_keystring or null
avatar_file_urlstring or null
collect_countinteger or null
comment_countinteger or null
comments_countinteger or null
cover_file_keystring or null
cover_file_urlstring or null
cover_urlstring or null
created_atstring or null
descriptionstring or null
duration_secondsinteger or null
fetched_atstring or null
follower_countinteger or null
handlestring or null
hashtagsarray
hashtags_normalizedarray
heightinteger or null
is_adboolean or null
like_countinteger or null
likesinteger or null
music_authorstring or null
music_cover_file_keystring or null
music_cover_file_urlstring or null
music_idstring or null
music_titlestring or null
nicknamestring or null
platformstring or null
play_countinteger or null
positioninteger or null
post_idstring or null
post_urlstring or null
posted_atstring or null
record_typestring or null
search_pageinteger or null
search_termstring or null
seed_video_idstring or null
share_countinteger or null
sharesinteger or null
slideshow_file_keysarray
slideshow_file_urlsarray
sourcestring or null
source_actorstring or null
textstring or null
urlstring or null
video_file_keystring or null
video_file_urlstring or null
video_idstring or null
viewsinteger or null
widthinteger or null

Hashtag rows

FieldJSON type
_typestring
descriptionstring or null
fetched_atstring or null
hashtagstring or null
hashtag_idstring or null
is_commerceboolean or null
platformstring or null
positioninteger or null
record_typestring or null
sourcestring or null
source_actorstring or null
urlstring or null
video_countinteger or null
view_countinteger or null

Comment rows

FieldJSON type
_typestring
author_handlestring or null
author_idstring or null
avatar_urlstring or null
comment_idstring or null
created_atstring or null
fetched_atstring or null
handlestring or null
is_authorboolean or null
is_pinnedboolean or null
is_replyboolean or null
languagestring or null
like_countinteger or null
liked_by_authorboolean or null
likesinteger or null
nicknamestring or null
parent_comment_idstring or null
platformstring or null
positioninteger or null
post_idstring or null
posted_atstring or null
reply_countinteger or null
sourcestring or null
source_actorstring or null
textstring or null
user_idstring or null
user_regionstring or null
user_signaturestring or null
user_urlstring or null
video_comment_totalinteger or null
video_idstring or null

Download rows

FieldJSON type
_typestring
author_idstring or null
collect_countinteger or null
comment_countinteger or null
cover_urlstring or null
created_atstring or null
descriptionstring or null
download_urlstring or null
duration_secondsinteger or null
dynamic_cover_urlstring or null
fetched_atstring or null
file_size_bytesinteger or null
file_urlstring or null
handlestring or null
hashtagsarray
hashtags_normalizedarray
heightinteger or null
is_adboolean or null
like_countinteger or null
media_cookie_headerstring or null
music_authorstring or null
music_idstring or null
music_titlestring or null
music_urlstring or null
nicknamestring or null
platformstring or null
play_countinteger or null
play_urlstring or null
positioninteger or null
qualitiesarray
selected_media_urlstring or null
selected_qualitystring or null
share_countinteger or null
sourcestring or null
source_actorstring or null
source_urlstring or null
urlstring or null
video_idstring or null
widthinteger or null

Shop rows

FieldJSON type
_typestring
brandstring or null
category_patharray
countrystring or null
currencystring or null
currency_symbolstring or null
descriptionstring or null
discount_percentnumber or null
fetched_atstring or null
found_onstring or null
image_urlstring or null
original_pricenumber or null
platformstring or null
positioninteger or null
priceinteger or number or null
price_maskedstring or null
product_idstring or null
promotion_labelsarray
ratingnumber or null
review_countinteger or null
savingnumber or null
sellerstring or null
seller_followersinteger or null
seller_idstring or null
seller_product_countinteger or null
seller_sold_countinteger or null
sku_idstring or null
slugstring or null
sold_countinteger or null
sourcestring or null
source_actorstring or null
titlestring or null
urlstring or null

Ad rows

FieldJSON type
_next_offsetinteger or null
_next_search_idstring or null
_typestring
ad_idstring or null
ad_statusstring or null
ad_textstring or null
ad_typestring or null
advertiser_namestring or null
audit_statusstring or null
creative_idstring or null
days_activeinteger or null
days_showninteger or null
deeplinkstring or null
estimated_audiencestring or null
fetched_atstring or null
first_seenstring or null
first_shownstring or null
formatstring or null
image_urlstring or null
image_urlsarray
impressioninteger or null
last_seenstring or null
last_shownstring or null
pages_fetchedinteger or null
platformstring or null
querystring or null
regionstring or null
region_codestring or null
result_typestring or null
sortstring or null
sourcestring or null
source_actorstring or null
spentstring or null
textstring or null
total_ads_in_searchinteger or null
video_urlstring or null
videosarray

Account rows

FieldJSON type
_typestring
author_idstring or null
author_verifiedboolean or null
avatar_urlstring or null
biostring or null
fetched_atstring or null
follower_countinteger or null
handlestring or null
is_liveboolean or null
nicknamestring or null
platformstring or null
positioninteger or null
search_termstring or null
sec_uidstring or null
sourcestring or null
source_actorstring or null
total_likesinteger or null
urlstring or null
verified_reasonstring or null

Summary rows

FieldJSON type
_typestring
errorsarray
rows_per_sourceobject
sources_requestedarray
sources_with_rowsarray
total_rowsinteger

Nested fields

FieldJSON type
videos[].video_urlstring
videos[].cover_imagestring
qualities[].labelstring
qualities[].resolutioninteger
qualities[].bitrateinteger
qualities[].codecstring
qualities[].widthinteger
qualities[].heightinteger
qualities[].size_bytesinteger
qualities[].urlstring
errors[].sourcestring
errors[].actorstring
errors[].inputobject
errors[].errorstring
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, errors and 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 region to 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 global all setting.
  • max_per_source limits 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.