TikTok Profile Videos API Scraper With Playlist Details
Pricing
$19.99/month + usage
TikTok Profile Videos API Scraper With Playlist Details
Tiktok Profile Videos Api Scraper extracts videos from any public TikTok profile through stable API-style scraping. Capture captions, video URLs, views, likes, comments, shares, and metadata. Ideal for research, content tracking, trend analysis, and automated TikTok workflows.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
TikTok Scraper — Extract Videos, Playlists and Profiles as JSON
TikTok Profile Videos API Scraper With Playlist Details reads a creator's public TikTok profile and returns every upload together with the playlist (TikTok calls it a "mix") each video belongs to, its position inside that playlist, and the creator's public profile data. Every response is typed, normalized JSON — no HTML, no selectors, no parsing. Give it one or more usernames and you get back a video-level dataset that already answers which recurring format a video belongs to and where it sits in the running order.
What is TikTok Profile Videos API Scraper With Playlist Details?
TikTok Profile Videos API Scraper With Playlist Details is a TikTok video and playlist scraper: for every profile you supply, it first reads the playlist inventory (id, name, TikTok's declared video count, cover, owner), then walks each playlist in order and returns its videos, and finally — optionally — collects the creator's ordinary upload feed as well. No TikTok account or login is required; every surface it reads is public and logged out.
- Scrape videos, with the full raw TikTok video object on every row
- Scrape playlists (mixes), including the playlist's declared size and the position of each video inside it
- Scrape creator profile data attached to every row (username, nickname, follower count, avatar and signature fields)
- Export the dataset as JSON, CSV, Excel or XML
- No proxy management required by default, no parsing of TikTok's HTML or signed requests
What data does TikTok Profile Videos API Scraper With Playlist Details collect?
The Actor returns one row per video, and every row carries three kinds of data: the video itself, the playlist it belongs to (if any), and the creator who posted it.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Videos | caption, post time, plays, likes, comments, shares, duration, photo-carousel flag | id, desc, createTimeISO, playCount, diggCount, commentCount, shareCount, collectCount, durationSeconds, isPhotoPost, videoPlayUrl |
| Playlists (TikTok mixes) | playlist name, declared size, position in playlist, videos actually fetched, cover, owner | playlist_id, playlist_name, playlist_video_count, playlist_position, playlist_fetched_count, playlist_cover_url, playlist_owner_username, playlist_url |
| Creator profile | username, display name, follower count, profile URL | authorUsername, authorNickname, authorFollowerCount, profile_username, profile_url, plus the raw author object |
| Sound & hashtags | sound title and ownership, hashtag titles as sent by TikTok | music, cha_list / challenges |
Need more TikTok data?
If you also need to discover new creators or hashtags rather than map an existing one, the API Empire suite includes TikTok Discover Scraper With Search Suggestions for keyword-to-suggestion research and TikTok Hashtag Scraper With Sticker Text & Language for hashtag-level video collection with on-screen text and caption language filters.
Why not build this yourself?
TikTok answers an unwarmed HTTP client with a WAF challenge page, not a clean block — the response is HTTP 200 with roughly 1,462 bytes of JavaScript, so a plain requests.Session (or curl_cffi alone, impersonating a real browser TLS fingerprint) reads as a successful, empty profile rather than a blocked one. The only recipe that works is to let a headless browser (Playwright Chromium) solve that JS challenge once, mint the session cookies TikTok's own web app relies on (msToken, ttwid, the waftoken/waforigin family), and then replay every subsequent API call over curl_cffi carrying those cookies. That session degrades in roughly 15–20 minutes and has to be re-minted proactively (this Actor re-warms at the 12-minute mark) — and because TikTok returns HTTP 200 on every dead surface (a 0-byte body for a signature-gated endpoint, a small challenge body for a WAF block, a full page for success), a DIY scraper has to classify responses by body shape, not status code, or it will silently log zero rows on what looks like a healthy run. This Actor also escalates through a datacenter-then-residential proxy ladder only when the body shape says the session is genuinely blocked, and guards every in-progress target so a retry after a partial failure can never duplicate rows. Maintaining that logic — and re-verifying it every time TikTok changes its challenge or its payload shapes — is the ongoing cost this Actor absorbs so you don't have to.
Why do developers and teams scrape TikTok?
For AI engineers and agent builders
An agent researching a creator's content strategy can call this Actor with a username, read playlists_on_profile to see the creator's whole format catalogue in one row, and walk playlist_position to reconstruct episode order for a RAG index or a tool-use step — without writing a TikTok parser into the agent's toolchain.
For marketers and brand teams
Before sponsoring a creator, pull their playlists to see which recurring formats they actually maintain and how each one performs: playlist_video_count against playlist_fetched_count shows whether a format is still active, and the per-position playCount/diggCount shows whether engagement holds up past the first few episodes.
For researchers and analysts
Academic and market researchers can map how creators structure long-running series using only public data — no login, no follower-only content. Comparing playlist_position against createTimeISO across a playlist shows posting cadence inside a single content pillar, isolated from the creator's unrelated uploads.
For developers building data products
row_result events map cleanly onto a scheduled pipeline: run the Actor against a creator list on a recurring Apify schedule, and build a product on top of playlists_on_profile, playlist_count_on_profile and the flattened engagement columns without maintaining a scraper yourself.
How to scrape TikTok (step by step)
- Open TikTok Profile Videos API Scraper With Playlist Details on its Apify Store listing.
- Provide the required input — one or more entries in
startUrls(a TikTok profile URL or a bare username). - Choose what to collect: leave
includePlaylistDetailsandincludePlaylistVideoson for playlist data, and toggleincludeProfileFeedfor the ordinary upload feed too. - Click Start to run the Actor on the Apify platform.
- Download the results as JSON, CSV, Excel or XML from the run's dataset, or pull them via the Apify API.
What to do when TikTok changes its structure
The Actor is maintained against TikTok's current web payloads, and the output schema stays stable on the user's end — field names and types don't change when TikTok's underlying page structure does. A field TikTok stops sending comes back as null rather than a guessed value, so downstream integrations don't break silently.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array | TikTok profile URLs (https://www.tiktok.com/@username) or bare usernames (mrbeast), one per line. Each profile is checked for playlists first, then its uploads are collected. | ["https://www.tiktok.com/@mrbeast"] |
includePlaylistDetails | No | boolean | Call TikTok's playlist endpoint once per profile and attach the full playlist list (id, name, declared video count, cover, owner) to every row. Turn off and all playlist columns are null. Default true. | true |
includePlaylistVideos | No | boolean | Fetch the videos inside every playlist. Rows come back in playlist order, so each row carries a 0-based playlist_position (episode ordering) plus the playlist it belongs to. Default true. | true |
maxPlaylists | No | integer | Cap how many playlists to walk per profile. 0 = every playlist the profile has. Minimum 0. Default 0. | 0 |
maxVideosPerPlaylist | No | integer | Cap how many videos to pull out of each playlist. 0 = the whole playlist. Minimum 0. Default 5. | 5 |
playlistNameFilter | No | string | Case-insensitive substring match on the playlist name (e.g. beast games). Leave empty to keep every playlist. Default "". | "beast games" |
includeProfileFeed | No | boolean | Emit the creator's regular upload feed as well. Videos already returned by a playlist walk in the same run are not emitted twice. Default true. | true |
checkPlaylistMembership | No | boolean | For each profile-feed video, open its video page and read the playlist it belongs to. One extra request (~400 KB) per video. Off by default. Default false. | false |
sortOrder | No | string (enum: newest, oldest) | Order of the profile-feed rows collected in this run. Playlist rows always keep playlist order so playlist_position stays meaningful. Default newest. | newest |
maxVideos | No | integer | Cap on the profile-feed videos per profile. 0 = no cap. Playlist videos are capped separately above. Minimum 0. Default 10. | 10 |
proxyConfiguration | No | object | TikTok answers unwarmed clients with a WAF challenge, so a headless browser mints the session first and the API calls replay it. No proxy is used unless you enable one here; if the session is still challenged the run escalates datacenter → residential. | {"useApifyProxy": false} |
Example input, all parameters shown:
{"startUrls": ["https://www.tiktok.com/@mrbeast"],"includePlaylistDetails": true,"includePlaylistVideos": true,"maxPlaylists": 0,"maxVideosPerPlaylist": 5,"playlistNameFilter": "","includeProfileFeed": true,"checkPlaylistMembership": false,"sortOrder": "newest","maxVideos": 10,"proxyConfiguration": { "useApifyProxy": false }}
The most common input mistake is leaving includePlaylistVideos on with a high maxVideosPerPlaylist (or 0 for "all") while running many profiles at once: since every pushed row bills one row_result event, an uncapped playlist walk across a long startUrls list multiplies cost quickly. Set maxPlaylists and maxVideosPerPlaylist deliberately for bulk runs.
⬆️ Output
Every result is typed, normalized JSON — one dataset row per video — exportable as JSON, CSV, Excel or XML. The dataset's default view surfaces 16 columns (playlist_name, playlist_position, playlist_video_count, playlist_fetched_count, playlist_url, source, id, url, desc, createTimeISO, playCount, diggCount, commentCount, shareCount, authorUsername, playlist_count_on_profile), but each row carries substantially more: the full raw TikTok video object (author, video, music, stats, statsV2, challenges, textExtra and other pass-through keys TikTok sends), plus the flattened engagement, creator and playlist columns below. A field TikTok does not send on a given video is returned as null, never a fabricated 0 or an invented placeholder.
Scraped video — from a playlist
{"source": "playlist","playlist_id": "7596415294902389534","playlist_name": "Beast Games","playlist_url": "https://www.tiktok.com/@mrbeast/playlist/x-7596415294902389534","playlist_position": 0,"playlist_video_count": 13,"playlist_fetched_count": 5,"playlist_cover_url": "https://p16-pu-sign-useast8.tiktokcdn-us.com/playlist-cover~tplv-photomode-image.jpeg","playlist_owner_username": "mrbeast","in_playlist": true,"playlist_membership_checked": true,"playlists_on_profile": [{ "playlist_id": "7596415294902389534", "playlist_name": "Beast Games", "playlist_video_count": 13 }],"playlist_count_on_profile": 6,"id": "7601866271197515054","aweme_id": "7601866271197515054","url": "https://www.tiktok.com/@mrbeast/video/7601866271197515054","desc": "Beast Games is back","createTime": 1784649627,"createTimeISO": "2026-07-20T14:40:27Z","scrapedAt": "2026-07-30T09:15:00Z","playCount": 28100000,"diggCount": 1800000,"commentCount": 24100,"shareCount": 39800,"collectCount": 51200,"authorUsername": "mrbeast","authorNickname": "MrBeast","authorFollowerCount": 129600000,"durationSeconds": 41,"isPhotoPost": false,"videoPlayUrl": "https://v16-webapp-prime.tiktok.com/video/tos/useast8/video-signed.mp4","profile_username": "mrbeast","profile_url": "https://www.tiktok.com/@mrbeast","music": { "id": 7601800000000000000, "title": "original sound", "author": "mrbeast", "is_original": true },"author": { "secUid": "MS4wLjABAAAA...", "uniqueId": "mrbeast", "verified": true }}
Scraped video — from the profile feed (no playlist membership checked)
{"source": "profile_feed","playlist_id": null,"playlist_name": null,"playlist_url": null,"playlist_position": null,"playlist_video_count": null,"playlist_fetched_count": null,"playlist_cover_url": null,"playlist_owner_username": null,"in_playlist": null,"playlist_membership_checked": false,"playlists_on_profile": [{ "playlist_id": "7596415294902389534", "playlist_name": "Beast Games", "playlist_video_count": 13 }],"playlist_count_on_profile": 6,"id": "7602011882231111111","aweme_id": "7602011882231111111","url": "https://www.tiktok.com/@mrbeast/video/7602011882231111111","desc": "just a normal upload","createTime": 1784553600,"createTimeISO": "2026-07-19T12:00:00Z","scrapedAt": "2026-07-30T09:15:00Z","playCount": 9400000,"diggCount": 610000,"commentCount": 8200,"shareCount": 5100,"collectCount": 12300,"authorUsername": "mrbeast","authorNickname": "MrBeast","authorFollowerCount": 129600000,"durationSeconds": 58,"isPhotoPost": false,"videoPlayUrl": "https://v16-webapp-prime.tiktok.com/video/tos/useast8/video-signed-2.mp4","profile_username": "mrbeast","profile_url": "https://www.tiktok.com/@mrbeast"}
playlist_membership_checked is true only when checkPlaylistMembership actually opened the video page for that row; on a profile-feed row where the reverse check was never run, it is false and in_playlist is null rather than false, so "not checked" stays distinct from "checked and not in a playlist."
How does TikTok Profile Videos API Scraper With Playlist Details compare to other TikTok scrapers?
| Feature | This Actor | Generic alternative |
|---|---|---|
| Playlist (mix) inventory returned | Yes — per-profile, with declared vs. fetched counts | Not documented on the top TikTok profile/video listings checked on the Apify Store on 2026-07-30 (novi/tiktok-user-api, khadinakbar/tiktok-profile-scraper, igview-owner/tiktok-profile-details-scraper) |
| Video position inside a playlist | Yes — 0-based playlist_position per row | Not offered; none of the three listings above document playlist ordering |
| Full raw video object retained | Yes — author, video, music, stats, challenges pass through untouched, with invented placeholder values replaced by null | Varies — igview-owner/tiktok-profile-details-scraper and khadinakbar/tiktok-profile-scraper (checked 2026-07-30) return profile-level fields only, with no full video object |
| Anti-bot handling | Browser-warmed session (Playwright) replayed over curl_cffi, with automatic re-warm and proxy escalation on response body shape | Not documented on any of the three listings checked |
| Credentials required | None — public, logged-out data only | None — all three competitor listings checked on 2026-07-30 also state no login is required |
If you're building an AI agent or RAG pipeline, the output-format row is the decision-maker — parsing HTML inside an agent loop is a reliability failure mode, not a feature.
How many results can you scrape with TikTok Profile Videos API Scraper With Playlist Details?
There is no hard cap coded into the Actor itself — maxVideos, maxVideosPerPlaylist and maxPlaylists all default to a fixed number but accept 0 to mean "no limit." The profile feed pages through TikTok's /api/creator/item_list/ endpoint, which TikTok pins to 15 items per request regardless of what is requested; the Actor keeps paging until maxVideos is reached or TikTok reports no more pages. Each playlist pages through /api/mix/item_list/ up to 30 items per request until maxVideosPerPlaylist is reached or the playlist ends. Every profile therefore costs one page load for the profile itself, one request for the playlist inventory (if enabled), one request per roughly 30 playlist videos, and one request per 15 feed videos — plus one extra page load per feed video if checkPlaylistMembership is enabled. Very large profiles or playlists simply take proportionally longer; TikTok may still challenge or throttle a session mid-run, in which case the Actor re-warms and continues rather than failing the run.
Integrate TikTok Profile Videos API Scraper With Playlist Details and automate your workflow
TikTok Profile Videos API Scraper With Playlist Details works with any language or tool that can send an HTTP request.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("tiktok-profile-videos-api-scraper-with-playlist-details").call(run_input={"startUrls": ["https://www.tiktok.com/@mrbeast"],"includePlaylistDetails": True,"includePlaylistVideos": True,"maxVideosPerPlaylist": 5,"includeProfileFeed": True,"maxVideos": 10,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["authorUsername"], item["source"], item["playlist_name"], item["id"])
Works in Python, Node.js, Go, Ruby, cURL — anything that can call the Apify API and read back a dataset.
Is it legal to scrape TikTok?
Yes — this Actor reads only publicly accessible TikTok pages and public web endpoints, the same data any logged-out visitor can see. It returns publicly available data, including creator profile identifiers (username, nickname, avatar) and public video content, which can constitute personal data under regimes such as GDPR and CCPA when the profile belongs to an identifiable individual. Storing and using that data still requires a lawful basis under those regimes, and this Actor cannot reach private accounts, follower-only content or anything gated behind a login. Consult legal counsel for commercial use cases involving bulk personal data.
❓ Frequently asked questions
Does this scraper work without a TikTok account?
Yes. It requires zero credentials — no login, no cookies you supply, no API key for TikTok itself. It reads TikTok's public web pages and endpoints the same way a logged-out browser would, using a headless-browser-warmed session internally.
How often is the scraped data updated?
Data is fetched live at run time — nothing is served from a cache. Every row carries a scrapedAt timestamp for the moment it was pulled, so re-running the Actor gets you TikTok's current state.
What happens if a creator has no playlists at all?
The run still returns their profile videos with the full field set. playlist_count_on_profile is 0, playlists_on_profile is an empty list, and every playlist-specific column (playlist_id, playlist_name, playlist_position, and so on) is null on every row for that profile.
Why does a playlist's declared video count differ from what was fetched?
playlist_video_count is the number TikTok itself declares for the playlist; playlist_fetched_count is however many videos this run actually pulled out of it (which is also capped by maxVideosPerPlaylist). They can differ when videos have been removed or made private since the playlist was last updated, or when the cap is lower than the playlist's real size. Both numbers are shipped on every row so you can see the gap instead of a silently corrected count.
Can I scrape private TikTok accounts or restricted content?
No. The Actor only reads public, logged-out pages. A private account's profile page does not expose the secUid this Actor needs to walk playlists or the feed, so private profiles fail to resolve rather than returning partial private data.
How can I keep a run's cost under control?
Set maxVideos, maxVideosPerPlaylist and maxPlaylists deliberately rather than leaving them at 0 (unlimited) for large startUrls lists — every dataset row pushed bills one row_result event, so these caps are also cost controls. Turning off includeProfileFeed or checkPlaylistMembership when you only need playlist data reduces both requests and billed rows.
How does this scraper handle TikTok's anti-bot defenses?
It classifies every response by body shape rather than HTTP status code, because TikTok returns HTTP 200 on WAF challenges, on signature-gated refusals, and on real pages alike. A headless Chromium browser warms a session once per target (solving the WAF's JavaScript challenge and minting msToken/ttwid/waftoken cookies), that session is replayed over curl_cffi for the API calls, is re-warmed proactively before it rots (roughly every 12 minutes), and the run escalates from no proxy to a datacenter proxy to a residential proxy only when the body shape shows the session is genuinely blocked.
Does it return data in a format LLMs and AI agents can use directly?
Yes. Every row is typed, normalized JSON with stable field names — no HTML, no selectors, no parsing step before you pass it into an LLM context window, index it into a vector store, or route it through an agent tool call.
Do I need to manage proxies myself?
No. By default the Actor runs with no proxy at all (proxyConfiguration.useApifyProxy: false) and only escalates to a datacenter, then a residential, Apify proxy automatically if TikTok keeps challenging the session. You can also supply your own Apify Proxy groups through the same input field.
How does this scraper compare to other TikTok scrapers on Apify?
As observed on the Apify Store on 2026-07-30, the top TikTok profile/video listings (novi/tiktok-user-api, khadinakbar/tiktok-profile-scraper, igview-owner/tiktok-profile-details-scraper) do not document playlist or mix support at all — they return either raw video feeds or profile-level statistics. This Actor's playlist inventory, playlist walk and playlist_position ordering are not documented on any of those three listings.
What happens if TikTok changes its site structure or blocks the scraper?
The Actor is maintained, and its output schema stays stable on your end — field names and types don't change even when TikTok's underlying page or payload structure does. A field TikTok stops sending is returned as null, not guessed or omitted.
💬 Your feedback
Found a bug, or missing a field you need on the row? We want to know. Reach out through your Apify Console support channel or the Actor's Issues tab on Apify — reports like these are what keep this Actor's field set matching TikTok's actual payloads.