Tiktok Scraper
Pricing
$19.99/month + usage
Tiktok Scraper
Tiktok Scraper is an Apify actor that extracts public TikTok data at scale. Collect videos, profiles, hashtags, comments, and engagement metrics in structured formats like JSON or CSV. Ideal for research, lead generation, trend tracking, and competitive analysis workflows.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
1
Monthly active users
17 days ago
Last modified
Categories
Share
TikTok Scraper — Videos, Reposts, Views and Engagement Data
Extract TikTok profile videos, reposts, hashtag search results, and keyword search results as structured JSON — no login, no cookies, no TikTok developer account. Point it at a profile URL or username, or give it a search term, and every video's videoViews, videoLikes, videoComments and createTimeISO land in your dataset in real time as the run progresses. Try it now with the prefilled @mrbeast example, or drop in your own list of profiles.
What is TikTok Scraper?
TikTok Scraper is an Apify Actor that combines four TikTok scraping jobs in one run: profile video scraping, profile repost scraping, hashtag search, and keyword search. It returns typed, normalized JSON — video IDs, captions, view/like/comment/share counts, author info, and absolute timestamps — with no HTML parsing required on your end. No TikTok account, login, or API key is needed; every field it returns is read from TikTok's own public web endpoints. It's built for content researchers, growth marketers, trend analysts, and developers feeding TikTok data into downstream pipelines or AI agents.
What TikTok video data is publicly available to scrape?
TikTok exposes a profile's videos, view/like/comment/share counts, captions, and posting dates to any visitor without an account — that's exactly what TikTok Scraper collects. What sits behind a login (a private account's videos, DMs, saved/liked lists, analytics) is out of reach for any public scraper, this one included.
| Data Category | Publicly Available | Restricted (requires TikTok login) |
|---|---|---|
| Public profile's videos | ✅ | — |
| View / like / comment / share counts | ✅ | — |
| Video captions and hashtags | ✅ | — |
| Reposted (not original) videos on a profile | ✅ | — |
| Hashtag and keyword search results | ✅ | — |
| Author username, nickname, verified flag | ✅ | — |
| Private account's videos | — | ❌ Requires login + follow approval |
| Direct messages, saved/liked lists, analytics | — | ❌ Requires the account owner's login |
TikTok Scraper only returns publicly visible data — what any visitor sees. Nothing behind a login wall.
What data can I extract with TikTok Scraper?
TikTok Scraper returns four row types — profile_video, profile_repost, hashtag_search, and keyword_search — each carrying a full raw nested object plus a set of flat top-level columns for the dataset table view. All rows share type, success, scrapedAt, and either username (profile modes) or query (search modes).
Video and author fields
videoId/id— the video's TikTok IDvideoTitle/title— caption text (falls back toTikTok video #<id>if empty)videoUrl/webVideoUrl— the video's TikTok URLvideoCreatedAt/createTimeISO— absolute ISO-8601 UTC posting timestampvideoAuthor/author.username— the video author's TikTok usernameauthor.nickname,author.avatar,author.verified— nested undervideo.authoron profile-video rowsmusic.title,music.author,music.duration— nested undervideo.musicon profile-video rows
Engagement and metric fields
videoViews/stats.views— play countvideoLikes/stats.likes— like countvideoComments/stats.comments— comment countvideoShares/stats.shares— share count (profile-video rows only — repost and search rows don't carry a flat shares column, though the nested payload does)repostViews,repostLikes— flat equivalents onprofile_repostrows (playCount,diggCountin the nestedrepostobject, which also carriescommentCount,shareCountandcollectCount)itemViews,itemLikes,itemComments— flat equivalents onhashtag_search/keyword_searchrows
🤖 Add-on: Need additional TikTok data?
If you also need TikTok profile bios, follower counts, or comment threads for a specific video, pair this Actor with a dedicated TikTok profile scraper or TikTok comments scraper from the Scraper Engine catalog rather than trying to extend this run — each job is easier to schedule and rate-limit on its own.
Why not build a TikTok video scraper yourself?
TikTok's own developer platform does not offer a straightforward path to the data this Actor returns. TikTok's Display API only returns data for the user who has authenticated your app through Login Kit — it cannot fetch another account's public videos. TikTok's Research API does expose public video and engagement data, but access is restricted to approved academic and institutional researchers, and its terms do not permit commercial product use (getphyllo.com, checked 2026-08-15; sociavault.com, checked 2026-08-15). Building your own scraper instead means reverse-engineering TikTok's web API request signatures, handling the verification/interstitial challenge pages TikTok serves in place of real content, rotating proxies as IPs get flagged, and re-doing that work every time TikTok changes its page structure.
TikTok Scraper handles the request construction, challenge-page detection, and proxy escalation for you, and returns a stable JSON schema regardless of TikTok's front-end changes. Use TikTok's own Research API if you're an approved academic researcher who only needs data covered by its terms; use TikTok Scraper if you need public video, repost, or search data for a commercial pipeline, on your own schedule, without an application process.
How to use TikTok Scraper
Run it directly on Apify — no separate signup, API key, or approval process required beyond your Apify account.
- Open TikTok Scraper on the Apify Store and click Try for free (or Run, if you've already added it to your account).
- Provide input: add one or more entries to
startUrls(profile URLs or bare usernames), asearchQuery, or both — at least one of the two is required. - Optionally set
profileScrapeSections(videos,repost, or both),searchType(keywordorhashtag),maxResults(1–1000), andproxyConfiguration. - Click Start and watch rows land in the Output tab in real time as they're scraped.
- Export the dataset as JSON, CSV, Excel, or via the API once the run finishes.
How to scale to bulk video extraction
startUrls accepts an array, so you can queue any number of profile URLs or usernames in a single run — the Actor processes them one after another, applying maxResults per profile. For search, searchQuery accepts one term per run; to cover multiple hashtags or keywords, schedule separate runs (or chain them via the Apify API) with a different searchQuery each time.
What can you do with TikTok video data?
- 📊 A growth marketer tracking a competitor's channel uses
videoViews,videoLikesandvideoCreatedAtto chart posting cadence and engagement trends over time. - 🔬 A trend researcher monitoring a hashtag uses
itemViewsanditemCreatedAtfromhashtag_searchrows to spot which topics are accelerating before they peak. - 🏢 A brand or agency vetting creators for partnerships uses
videoAuthor,videoLikesandvideoCommentsacross a profile's videos to gauge real engagement, not just follower counts. - 📁 A content archivist uses
videoUrland the nestedvideo.download_urlfield to build a reference index of a creator's back catalog. - 🤖 An AI engineer feeds
videoTitle/itemTextcaption text and engagement fields into a RAG pipeline or LLM agent to summarize trending TikTok content or answer questions about a creator's output.
How does TikTok Scraper handle rate limits and blocking?
TikTok Scraper runs with no proxy by default (a direct connection). If a request comes back blocked, forbidden, or rate-limited (HTTP 403/429, or a "blocked" error), the Actor automatically escalates its connection settings through three tiers — no proxy → Apify datacenter proxy → Apify residential proxy — retrying up to 3 times at the residential tier before giving up on that profile or search. Profile-video requests also get their own 3-attempt exponential-backoff retry for plain network errors (timeouts, connection failures), independent of the blocking-escalation logic.
TikTok occasionally serves an HTTP 200 response that looks like a real profile page but is actually a verification/interstitial challenge shell with none of the expected data embedded in it. The Actor detects this by checking for TikTok's own __UNIVERSAL_DATA_FOR_REHYDRATION__/SIGI_STATE payload markers in the response body, rather than trusting the status code — treating it as a blocking event and triggering the same proxy-escalation retry path. If a profile or search still can't be completed after all retries, the Actor pushes a success: false row with an error message and moves on to the next input, rather than failing the whole run.
⬇️ Input
All parameters are optional, but at least one of startUrls or searchQuery must be provided or the run ends immediately with an error row.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | No | array | TikTok profile URLs (e.g. https://www.tiktok.com/@username) or bare usernames (e.g. username). Supports bulk input — add as many profiles as you want. Leave empty for search-only runs. | ["https://www.tiktok.com/@mrbeast"] |
profileScrapeSections | No | array (enum: videos, repost) | Which sections to scrape from each profile: videos (all profile videos) and/or repost (reposted content). Select one or both. Default: ["videos"]. | ["videos"] |
searchQuery | No | string | A search query for hashtag or keyword search. Leave empty for profile-only runs. Default: "". | "cooking tips" |
searchType | No | string (enum: keyword, hashtag) | Whether searchQuery runs as a general keyword search (keyword) or a hashtag-specific search (hashtag). Default: "keyword". | "keyword" |
maxResults | No | integer (min 1, max 1000) | Maximum number of results to collect per profile/search query. Default: 100. | 100 |
proxyConfiguration | No | object | Apify Proxy settings. By default, no proxy is used (direct connection); the Actor escalates automatically if it gets blocked. | {} |
Example input
{"startUrls": ["https://www.tiktok.com/@mrbeast"],"profileScrapeSections": ["videos", "repost"],"searchQuery": "cooking tips","searchType": "keyword","maxResults": 100,"proxyConfiguration": {}}
⬆️ Output
Every run writes to an Apify dataset as typed, normalized JSON — one row per video, repost, or search result. Export it as JSON, CSV, Excel, XML, or via the Apify API. Each successful row is billed as one row_result charged event; error/validation rows are pushed uncharged — filter them out (or keep them for auditing) with success == true.
Example output — profile video
{"type": "profile_video","username": "mrbeast","success": true,"scrapedAt": "2026-08-15T09:12:00Z","videoId": "7234567890123456789","videoTitle": "We built 100 wells in Africa","videoUrl": "https://www.tiktok.com/@mrbeast/video/7234567890123456789","videoCreatedAt": "2026-08-10T15:32:00Z","videoAuthor": "mrbeast","videoViews": 48213904,"videoLikes": 3921044,"videoComments": 28873,"videoShares": 91022,"video": {"id": "7234567890123456789","url": "https://www.tiktok.com/@mrbeast/video/7234567890123456789","webVideoUrl": "https://www.tiktok.com/@mrbeast/video/7234567890123456789","title": "We built 100 wells in Africa","description": "We built 100 wells in Africa","create_time": 1786538420,"createTimeISO": "2026-08-10T15:32:00Z","duration": 42,"width": 1080,"height": 1920,"cover_url": "https://p16-sign.tiktokcdn-us.com/cover.jpeg","dynamic_cover_url": "https://p16-sign.tiktokcdn-us.com/dyncover.jpeg","play_url": "https://v16.tiktokcdn.com/play.mp4","download_url": "https://v16.tiktokcdn.com/download.mp4","author": {"username": "mrbeast","nickname": "MrBeast","avatar": "https://p16-sign.tiktokcdn-us.com/avatar.jpeg","verified": true},"stats": {"views": 48213904,"likes": 3921044,"comments": 28873,"shares": 91022},"music": {"title": "original sound","author": "mrbeast","duration": 42}}}
Field shapes for the other three row types (profile_repost, hashtag_search, keyword_search) follow the same pattern — a type/success/scrapedAt envelope, flat top-level convenience fields (repostId/repostText/…, itemId/itemText/…), and the full raw nested object (repost, item) underneath for anything not surfaced flat. A failed row instead carries success: false and an error message string, with no video/repost/item payload.
How does it work?
TikTok Scraper talks to TikTok's own public web endpoints directly — the same ones the tiktok.com site itself calls when you browse a profile, run a search, or scroll a hashtag page. Profile-video scraping calls TikTok's creator item-list web API with a device ID and the profile's secUid; repost scraping, hashtag search, and keyword search drive a headless Chromium browser (Playwright) to load the page and capture the JSON responses TikTok's own front end fetches as you scroll. Requests go out either directly or through Apify Proxy, depending on your proxyConfiguration and whether blocking has been detected. Only data TikTok already serves to a logged-out visitor is captured — nothing requires an account. Because every field is mapped to a fixed output schema in code, the JSON shape you receive stays the same even when TikTok changes its page layout.
Integrations
TikTok Scraper runs on Apify, so it works with anything that can call the Apify API or trigger an Apify Actor run.
Calling TikTok Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run_input = {"startUrls": ["https://www.tiktok.com/@mrbeast"],"profileScrapeSections": ["videos"],"maxResults": 100,}run = client.actor("tiktok-scraper").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
No-code tools (n8n, Make, LangChain)
In n8n, use the Apify node (or an HTTP Request node against the Apify run-sync-get-dataset-items endpoint) to trigger a run and pull results directly into your workflow. In Make, the Apify app module runs the Actor and passes the returned dataset items into the next step of your scenario. In LangChain or a similar agent framework, wrap the apify_client call above as a tool so an agent can pull fresh TikTok video data on demand.
Is it legal to scrape TikTok video data?
Scraping publicly available data — content any visitor can see without logging in — is generally permitted; the legal exposure that matters here is TikTok's own Terms of Service, not personal-data law, since this Actor collects video and engagement metadata rather than harvesting identifiable data about individual private users. TikTok Scraper returns only publicly available data — nothing behind a login. TikTok's Terms of Service place restrictions on automated collection, so review them for your specific use case, and note that TikTok's underlying video/engagement data is TikTok's own database content, which may carry database-rights protection in some jurisdictions. Consult legal counsel if your use case involves bulk storage of personal data (e.g., creator usernames tied to engagement history).
Frequently asked questions
What TikTok video fields does TikTok Scraper return?
The top fields are videoId, videoTitle, videoUrl, videoCreatedAt, and videoViews/videoLikes/videoComments/videoShares — see What data can I extract above for the full breakdown across all four row types.
Does TikTok Scraper require a TikTok account or login?
No. The Actor reads TikTok's public web endpoints directly and needs no TikTok account, cookies, or API key — only your Apify account to run it.
How many videos can I extract in one run?
Up to maxResults (1–1000, default 100) per profile section or per search query — set higher for more coverage, or queue more profiles in startUrls to scale up further.
What happens if a profile is private, doesn't exist, or TikTok blocks the request?
The Actor treats a private/nonexistent profile the same as a failed fetch: it can't locate the profile's secUid, so no video rows are produced for that username and the run continues to the next input. If TikTok returns a block, a 403/429, or serves a verification/interstitial challenge page instead of real data, the Actor retries with an escalated proxy tier up to 3 times; if it still can't complete, it pushes a success: false row with an error message for that profile or query rather than failing the whole run.
Can I scrape multiple TikTok profiles at once?
Yes — startUrls accepts an array, so you can queue any number of profile URLs or usernames in a single run; each is scraped in turn, with maxResults applied per profile.
Does TikTok Scraper work with Claude, ChatGPT, and other AI agent tools?
It's callable as an HTTP endpoint via the Apify API from any agent framework that can make HTTP requests — see the Integrations section above for a working apify_client example.
How does TikTok Scraper compare to other TikTok scrapers?
This Actor combines four scrape modes — profile videos, profile reposts, hashtag search, and keyword search — in a single run, rather than requiring separate Actors per mode. No competitor comparison data was available at the time this README was written.
Does TikTok Scraper return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with consistent field names across runs — no HTML parsing, no CSS selectors. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when TikTok changes its layout or anti-bot system?
The Actor is maintained, and its output schema is designed to stay stable across TikTok front-end changes — the fields you see in this README are the fields you'll keep getting.
Can I use TikTok Scraper without managing proxies or browser infrastructure?
Yes. The Actor runs headless Chromium (via Playwright) and handles proxy escalation internally — you don't need to run a browser or manage your own proxy pool, though you can supply Apify Proxy settings via proxyConfiguration if you want a proxy used from the start.
Which TikTok video fields work best for AI training data and RAG indexing?
For RAG, index the high-information text fields: videoTitle/itemText (captions) alongside videoAuthor for attribution. For training data, the most consistently structured fields across records are videoViews, videoLikes, videoComments, videoShares, and videoCreatedAt — all typed primitives (numbers and ISO-8601 strings) rather than free text.
Related scrapers
| Scraper | What it extracts |
|---|---|
| TikTok Profile Scraper | Profile bio, follower/following counts, verified status |
| TikTok Comments Scraper | Comment threads and replies for a given video |
| Instagram Reels Scraper | Instagram Reels video metadata and engagement counts |
| YouTube Video Scraper | YouTube video views, duration, and channel metadata |
Your feedback
Found a bug or missing a field? Let us know through the Issues tab on this Actor's Apify Store listing, or send a message via the Apify Console — reports like these are what keep this Actor's field coverage accurate as TikTok changes.