Tiktok Scraper 2.0
Pricing
from $2.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 $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Inus Grobler
Actor stats
1
Bookmarked
21
Total users
6
Monthly active users
12 days ago
Last modified
Categories
Share
TikTok Profile & Keyword Video Scraper (Apify Actor)
Scrape TikTok profiles and TikTok keyword search results into clean JSON dataset rows.
This actor is designed for:
- TikTok profile scraping by username
- TikTok keyword video scraping
- TikTok transcript extraction (when subtitle/caption tracks are available)
- Apify API and dataset pipeline workflows
This README is for Apify usage.
For local JSON/media workflows, see README.local.md.
What This Actor Does
usersworkflow: scrape profile metadata plus videos for each usernamekeywordsworkflow: scrape videos for each keyword query- Adds transcript details when exposed by TikTok/video metadata paths
- Writes structured rows to the default Apify dataset
- Supports continuation checkpoints between runs
Hard Limits Per Run
- Maximum 100 users
- Maximum 100 keywords
- Exactly one workflow per run (
usersorkeywords)
Quick Start (Apify Console)
- Open the actor on Apify.
- Select one workflow.
- Paste input JSON.
- Start run.
- Open Storage > Dataset for results.
- Optional: open
OUTPUT_SUMMARYin default key-value store.
Example: Users Workflow
{"workflow": "users","users": ["scout2015", "khaby.lame"],"maxVideosPerUser": 10}
Example: Keywords Workflow
{"workflow": "keywords","keywords": ["football", "dog training"],"maxVideosPerKeyword": 10}
Input Reference (Basic UI)
| Field | Type | Default | Notes |
|---|---|---|---|
workflow | string | users | Required: users or keywords |
users | array[string] | - | Required for users workflow; max 100 |
keywords | array[string] | - | Required for keywords workflow; max 100 |
maxVideosPerUser | integer | 10 | Per-user cap |
maxVideosPerKeyword | integer | 10 | Per-keyword cap |
Advanced parameters are still supported via API JSON input, but hidden from the basic Apify UI for simplicity.
Per-item continuation syntax is supported in user/keyword strings:
scout2015|from=2026-02-01T00:00:00Zkhaby.lame|from=1738368000cats|from=2026-01-01
Input normalization:
- Usernames accept
scout2015,@scout2015, or full TikTok profile URLs - Keywords are passed as plain query text; strict boolean operators (
AND,OR,NOT) are not guaranteed by TikTok search
Apify Continuation
Continuation is enabled by default.
- Checkpoints are stored in default key-value store.
- Key name is
continuationStateKey(default:CONTINUATION_STATE). - Scope:
- users workflow: per username
- keywords workflow: per keyword
- Priority:
- input
|from=...value wins - otherwise previous stored
from_epochis used
- input
To force a fresh run:
- set
resetApifyContinuation=true
Output Structure
Dataset rows are video records:
record_type = "video"- Rows begin with:
video_id,video_url,caption_text,transcript outputMode=compact(default) is smaller and pipeline-friendlyoutputMode=fullkeeps more technical fields
Common fields include:
- Video IDs and metrics (
video_id,author_username,play_count,like_count, etc.) transcripttext andtranscript_detailmedia_linksand optionalmedia_links_meta- Embedded
accountobject (profile metadata) downloads_saved = falseon Apify
Run summary is written to default key-value store key:
OUTPUT_SUMMARY
OUTPUT_SUMMARY includes:
- Run status (
okorerror) - Collection error details when present
- Continuation settings and update counts
- Dataset size estimates
Performance Tips
For faster runs and smaller payloads:
- Use
outputMode=compact - Set
includePlaybackUrl=falseto remove large ephemeral signed URLs - Keep
skipProfileScrape=trueunless you need richer profile fields - Lower
minDelaySec/maxDelaySeccarefully (faster but can increase challenge rates) - Reduce
ytdlpTimeoutSecto fail faster on problematic targets - Set
disableScraplingFallback=trueto force only the primary engine path
Run Via Apify API
Set variables:
export APIFY_TOKEN="YOUR_APIFY_TOKEN"export ACTOR_ID="your-username~tiktok-scraper-2-0"
Synchronous 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 flow:
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.defaultDatasetId. - Wait for completion:
GET /v2/actor-runs/{runId}?waitForFinish=120 - Fetch items:
GET /v2/datasets/{datasetId}/items?clean=true&format=json
Notes & Limitations
- TikTok anti-bot defenses are dynamic; some runs can face challenge pages.
- Video extraction can still succeed via fallback paths when profile pages are challenged.
- Transcripts exist only when subtitle/caption data is exposed.
playback_urlandthumbnail_urlare often signed/ephemeral; rely on metadata if you need expiry handling.- Followers/following list fields are included as best-effort placeholders on public web data and are often empty.