Tiktok Video Scraper
Pricing
from $2.00 / 1,000 tiktok posts
Tiktok Video Scraper
Scrape video data and follower counts from public TikTok profiles. Extract video URLs, captions, views, likes, comments, shares, and posting dates for reporting and analysis.
Pricing
from $2.00 / 1,000 tiktok posts
Rating
0.0
(0)
Developer
Scraper Creator
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Share
Collect public videos and photo posts from TikTok profiles, together with engagement statistics and the account's current follower count. Get captions, hashtags, post URLs, publication dates, views, likes, comments, and more in a structured dataset for reporting and analysis.
The Actor reads the profile's Videos section and follows pagination to older posts. It uses a separate browser session, does not require TikTok login cookies, and does not download media files.
How to use
- Add one to five public TikTok profile URLs.
- Set the maximum number of posts to return per profile. The default is 100; the allowed range is 1–10,000.
- Under Advanced settings, keep the default residential proxy in Malaysia or choose another country. Direct connections do not return video lists on Apify cloud, so a run with no proxy stops immediately with
PROXY_REQUIREDin its run summary. - Start the Actor, inspect the dataset and run summary, then export the results or retrieve them through the Apify API.
The maximum is a limit, not a guaranteed result count. A profile may have fewer accessible posts, and some profiles may expose follower counts while their video lists remain unavailable.
Input
{"profiles": ["https://www.tiktok.com/@nba"],"resultsPerPage": 100}
| Field | Required | Description |
|---|---|---|
profiles | Yes | Array of 1–5 public HTTPS TikTok profile URLs. |
resultsPerPage | No | Maximum successfully returned posts per profile, from 1 to 10,000. Defaults to 100. Despite its name, this is the total per-profile limit, not the size of a single network request. |
proxyConfiguration | No | Apify proxy configuration. Defaults to a residential proxy in Malaysia (MY). See Proxy. |
Use profile URLs such as https://www.tiktok.com/@nba. Both tiktok.com and www.tiktok.com are accepted. Do not include query parameters or URL fragments. Individual post URLs, shortened links, and bare usernames are not supported as input.
The Actor uses the profile's Latest view and includes pinned posts. Results are therefore not guaranteed to be strictly chronological. Other sorting modes and excluding pinned posts are not supported.
Additional API fields
Existing integrations can continue to send the following optional fields with the values shown. They do not enable additional scraping features and are omitted from the input form:
{"profiles": ["https://www.tiktok.com/@nba"],"resultsPerPage": 100,"profileScrapeSections": ["videos"],"profileSorting": "latest","excludePinnedPosts": false,"commentsPerPost": 0,"topLevelCommentsPerPost": 0,"maxRepliesPerComment": 0,"maxFollowersPerProfile": 0,"maxFollowingPerProfile": 0,"shouldDownloadAvatars": false,"shouldDownloadCovers": false,"shouldDownloadSlideshowImages": false,"shouldDownloadVideos": false}
These settings collect post statistics and follower totals only. Comment text, follower and following lists, and media downloads are not supported.
Proxy
The Actor uses an Apify residential proxy in Malaysia by default:
{"profiles": ["https://www.tiktok.com/@nba"],"resultsPerPage": 100,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "MY"}}
In Apify cloud tests on 2026-10-19, direct connections received empty video-list responses, and a residential proxy without a country also failed. Residential proxies in Malaysia (MY) and Singapore (SG) succeeded. Other countries are untested. Each profile uses one proxy session, so its page and video-list requests share an IP. On Apify, a missing proxyConfiguration falls back to this default, and an explicit choice of no proxy stops the run with PROXY_REQUIRED. Local runs may still connect directly.
Proxy availability depends on your account. Residential proxy traffic adds cost and does not guarantee access to TikTok. Check the Actor's pricing and your proxy rates before running.
Output
Each dataset row represents one video or photo post. The following is a saved example, not live statistics:
{"id": "7697426312062946591","text": "Hali with the BIG one hand jam 💪 #NBA #basketball #Pacers #TyreseHaliburton","createTime": 1792196738,"createTimeISO": "2026-10-17T00:25:38.000Z","webVideoUrl": "https://www.tiktok.com/@nba/video/7697426312062946591","authorMeta": {"id": "134941634731003904","name": "nba","profileUrl": "https://www.tiktok.com/@nba","fans": 27302212},"playCount": 20500,"diggCount": 1398,"commentCount": 27,"shareCount": 35,"collectCount": 64,"repostCount": 0,"isSlideshow": false,"fromProfileSection": "videos","hashtags": [{ "name": "NBA" },{ "name": "basketball" },{ "name": "pacers" },{ "name": "tyresehaliburton" }],"scrapedAt": "2026-10-17T09:33:26.340Z"}
| Field | Description |
|---|---|
id, webVideoUrl | Post ID and canonical URL. Photo posts use a /photo/ URL; videos use /video/. IDs are strings. |
text | Post caption, with original line breaks and blank lines preserved when available. |
hashtags | Array of objects such as { "name": "basketball" }, using TikTok's tag names without an added # prefix. Empty when none are available. |
createTime | Publication time as a Unix timestamp in seconds. |
createTimeISO | The same publication time in UTC ISO 8601 format. |
authorMeta.id, authorMeta.name, authorMeta.profileUrl | Verified author ID, username, and profile URL. The ID is a string. |
authorMeta.fans | Current profile follower total, repeated on the profile's post rows. This is not the follower count at the time each post was published. |
playCount | Public view count as an integer. |
diggCount, commentCount | Like and comment counts as integers, or null when unavailable. |
shareCount, collectCount, repostCount | Share, save, and repost counts as integers, or null when unavailable. |
isSlideshow | true for a photo slideshow and false for a video. |
fromProfileSection | The value videos, including photo posts returned in this section. |
scrapedAt | Time this row was assembled, in UTC ISO 8601 format. |
Data accuracy
- Unknown counts stay
null. Missing optional metrics are not replaced with zero. A confirmed zero is returned as0. Compact labels such as46.8Kare not converted into exact counts. - Counts are snapshots. Engagement statistics can change during or after a run. The follower total is read from the profile and attached only after the post's author has been verified.
- Caption formatting follows the source. When TikTok supplies valid caption lines,
textjoins them with line breaks, preserving blank lines. Otherwise it uses the available description without guessing line breaks. - Public statistics are not private analytics. This Actor does not retrieve owner-only TikTok Analytics data or historical follower totals.
Partial results and errors
Inspect RUN-SUMMARY in the run's default key-value store when checking completeness. It contains per-profile status, page and result counts, available follower totals, and errors.
- Invalid individual posts are skipped so other posts can still be processed.
- A profile or pagination failure preserves results already collected and allows the next profile to proceed.
- Some valid results can produce a successful Apify run while
RUN-SUMMARY.statusispartialandpartialistrue. Always inspect the summary if complete coverage matters. - An exhausted pay-per-event budget or an abort signal stops collection. With no recorded errors,
RUN-SUMMARY.statusisstoppedeven whenpartialisfalse; profiles not yet attempted may be absent from the summary. Check the run status, per-profile statuses, and coverage of the requested profiles rather than treatingpartial: falseas proof of completion. If errors also occurred, the run status may instead bepartialorfailed. - If errors occur and no valid posts are available after all profiles have been attempted, the run fails.
- Storage or charging failures stop the run. Error records are not added to the post dataset.
Missing or invalid post identity, author identity, publication time, caption, content type, or view count causes the post to be skipped. An unreadable profile identity or follower total causes that profile to fail.
Per-profile status limit_reached means the requested maximum was reached; it does not mean there are no more posts. Invalid responses, timeouts, stalled pagination, and an unverified empty list are reported as errors rather than interpreted as a profile with no posts.
Profiles with no returned posts produce no dataset rows, including no standalone follower row. A follower total read successfully may still be available in the profile's RUN-SUMMARY entry. Integrations that need this value must read the summary separately.
Refreshing statistics
Start a new run with a fresh default dataset to refresh counts. Each new run starts from the profile's Latest view, including pinned posts, and continues until the per-profile limit or the end of the accessible feed. Posts outside that limit will not be refreshed.
Within the same run, duplicate post IDs are removed. If a run restarts with its existing dataset, already written posts are skipped rather than refreshed.
Profiles whose saved results already meet the limit are not reopened. Their resumed summary reports limit_reached, zero fetched pages, and followers: null because no fresh follower count was read; saved dataset rows are unchanged.
Scope and limitations
- Collects accessible public videos and photo posts from the profile's Videos section. It does not collect Stories, favorites, repost feeds, or private posts.
- Returns follower totals, not follower identities or following lists.
- Returns comment counts, not comment text or replies.
- Does not download videos, audio, avatars, covers, or slideshow images.
- Some public profiles expose follower totals while video-list requests fail. Successful access to one profile does not guarantee access to another, and proxies may not resolve the issue.
- The 10,000-result input limit is not a guarantee of full profile coverage. TikTok changes and access restrictions can affect pagination and data availability.
- Apify cloud runs have been validated only for small runs (2 posts per profile) through residential proxies in Malaysia and Singapore. Multi-page pagination in the cloud, other proxy countries, and large or long-running crawls have not yet been validated.