Tiktok Scraper 2.0
Pricing
from $1.00 / 1,000 results
Tiktok Scraper 2.0
TikTok Intelligence Scraper delivers JSON for users/keywords with profile metadata, video analytics, media links and transcripts (when available). Built for scale with checkpoints, run limits and resilient fallbacks for monitoring, growth tracking and content intelligence. Actively maintained.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer

Inus Grobler
Actor stats
1
Bookmarked
7
Total users
5
Monthly active users
2 days ago
Last modified
Categories
Share
TikTok Scraper 2.0 (Apify Actor)
Scrape TikTok by users or keywords and return structured JSON in the default dataset:
- Video records (users workflow rows include embedded account profile info)
- Transcript text when available
- Media links + link-expiry metadata
This README is for Apify usage only.
For local JSON/media workflows, see README.local.md.
What This Actor Supports
usersworkflow: profile metadata + videos for each usernamekeywordsworkflow: search videos by keyword- Transcript extraction when subtitle/caption tracks are exposed
- Output as dataset JSON only (no local file downloads on Apify)
Hard limits per run:
- Maximum 100 users
- Maximum 100 keywords
- Run must be either users or keywords, not both
Actor Input
Supported input fields:
workflow:usersorkeywords(required)users: list of usernames (forusersworkflow)keywords: list of keywords (forkeywordsworkflow)maxVideosPerUser: integer, default10maxVideosPerKeyword: integer, default10engine:auto(default),playwright, orpydollminDelaySec: number, default1.1maxDelaySec: number, default2.4ytdlpTimeoutSec: integer, default420headless: boolean, defaulttruedisableScraplingFallback: boolean, defaultfalseskipProfileScrape: boolean, defaulttrue(faster users runs, but lighter account fields)maxDatasetItems: integer, default5000(0means unlimited)includeRawDetailInDataset: boolean, defaultfalseoutputMode:compact(default) orfullincludePlaybackUrl: boolean, defaulttrueincludeTranscriptText: boolean, defaulttrueincludeMediaLinksMeta: boolean, defaulttrueenableApifyContinuation: boolean, defaulttruecontinuationStateKey: string, defaultCONTINUATION_STATEresetApifyContinuation: boolean, defaultfalseincludeFollowersList: boolean, defaultfalseincludeFollowingList: boolean, defaultfalsemaxProfileConnections: integer, default0debug: boolean, defaultfalse
Per-item continuation syntax is supported:
scout2015|from=2026-02-01T00:00:00Zkhaby.lame|from=1738368000cats|from=2026-01-01
Input normalization:
- usernames accept
scout2015,@scout2015, or full profile URLs - keywords are passed through as plain query text; strict boolean search operators (
AND,OR,NOT) are not guaranteed by TikTok search
Example input (users):
{"workflow": "users","users": ["scout2015", "khaby.lame"],"maxVideosPerUser": 10,"engine": "auto","headless": true,"outputMode": "compact","includePlaybackUrl": false,"includeTranscriptText": true,"includeMediaLinksMeta": true,"skipProfileScrape": true,"enableApifyContinuation": true,"includeFollowersList": false,"includeFollowingList": false,"maxProfileConnections": 0,"includeRawDetailInDataset": false}
Performance Tuning
For faster runs and smaller datasets:
- set
outputMode=compact - set
includePlaybackUrl=false(remove large ephemeral signed URLs) - set
skipProfileScrape=falseonly when deep profile fields are required - lower
minDelaySec/maxDelaySeccarefully (faster, but can increase challenge rates) - reduce
ytdlpTimeoutSecto fail faster on problematic targets - set
disableScraplingFallback=trueto force only the primary engine (no scrapling rescue pass)
Example input (keywords):
{"workflow": "keywords","keywords": ["football", "dog training"],"maxVideosPerKeyword": 10,"engine": "auto","headless": true,"enableApifyContinuation": true}
Apify Continuation
Continuation is supported on Apify and is enabled by default.
- Checkpoints are stored in actor default key-value store.
- Key used:
continuationStateKey(defaultCONTINUATION_STATE). - Scope:
- users workflow -> per username
- keywords workflow -> per keyword
- Behavior:
- input
|from=...takes priority over stored continuation - otherwise scraper resumes from the previous stored
from_epoch
- input
To force a fresh run:
- set
resetApifyContinuation=truefor that run- this clears stored checkpoints before scraping
Run In Apify Console
- Open the Actor on Apify.
- Select input in the UI.
- Click Start.
- Open Storage > Dataset for output records.
- Optional: read
OUTPUT_SUMMARYfrom default key-value store.
Run Via Apify API
Use bearer token auth in headers.
Set variables:
export APIFY_TOKEN="YOUR_APIFY_TOKEN"export ACTOR_ID="your-username~tiktok-scraper-2-0"
Synchronous API call (returns dataset items directly)
curl -sS -X POST \"https://api.apify.com/v2/acts/${ACTOR_ID}/run-sync-get-dataset-items?format=json&clean=true" \-H "Authorization: Bearer ${APIFY_TOKEN}" \-H "Content-Type: application/json" \-d '{"workflow": "users","users": ["scout2015", "khaby.lame"],"maxVideosPerUser": 100,"engine": "auto","headless": true}'
Asynchronous API flow
Start run:
curl -sS -X POST \"https://api.apify.com/v2/acts/${ACTOR_ID}/runs" \-H "Authorization: Bearer ${APIFY_TOKEN}" \-H "Content-Type: application/json" \-d '{"workflow": "keywords","keywords": ["dog training"],"maxVideosPerKeyword": 50}'
Then:
- Read
data.id(run id) anddata.defaultDatasetIdfrom the response. - Wait for completion with:
GET /v2/actor-runs/{runId}?waitForFinish=120 - Fetch items with:
GET /v2/datasets/{datasetId}/items?clean=true&format=json
Output Structure
Dataset rows use:
record_type = "video"- each video row starts with:
video_id,video_url,caption_text,transcript outputMode=compact(default) keeps a leaner subset for production pipelinesoutputMode=fullkeeps more technical detail columns
Video records include:
- Core IDs and metrics (
video_id,author_username,play_count, etc.) transcriptas plain text- transcript metadata object (
transcript_detail) - Media links (
media_links) - Media link metadata (
media_links_meta) including expiry timestamps - Embedded account object (
account) with profile fields:username,profile_url,nickname,bio,verifiedfollower_count,following_count,likes_count,video_countavatar_url,user_id,sec_uidprofile_status,has_core_profile_data,profile_status_detail
downloads_saved = falseon Apify
Output summary (OUTPUT_SUMMARY) also includes:
output_modeinclude_playback_urlinclude_transcript_textinclude_media_links_metadataset_total_bytes_estdataset_avg_row_bytes_est
Followers/following list fields (when requested):
account.followersandaccount.followingmay be empty on many accountsaccount.followers_scrape_status/account.following_scrape_statusexplain availability- public TikTok web pages frequently do not expose full followers/following lists reliably without authenticated app flows
Run summary is stored in default key-value store key:
OUTPUT_SUMMARY
Notes
- TikTok anti-bot defenses are dynamic. Some profile pages may report
profile_status=challenge. - Video extraction may still succeed via fallback paths even when profile pages are challenged.
- Transcripts are only present when subtitle/caption tracks are available.
playback_urlandthumbnail_urlare signed URLs and can expire; usemedia_links_metaexpiry fields.
Local Usage
Local JSON + file-download instructions are in:
README.local.md
