TikTok Profile Videos API - Stats & Media URLs
Pricing
$9.99/month + usage
TikTok Profile Videos API - Stats & Media URLs
Scrape every video from a TikTok profile with full engagement statistics, video and cover URLs, sound metadata, hashtags and author follower counts.
Pricing
$9.99/month + usage
Rating
0.0
(0)
Developer
Scrapers Hub
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
0
Monthly active users
16 hours ago
Last modified
Categories
Share
๐ต TikTok Profile Videos API โ Complete Video Data, Stats and Media URLs
TikTok Profile Videos API scrapes every video from a TikTok creator's profile and returns TikTok's own complete data structure for each one โ full engagement statistics, video and cover media URLs at multiple encodings, the sound used, hashtags, author profile with follower counts, and hundreds of platform fields most scrapers discard. Give it a username without the @ and it returns 30 videos in about 11 seconds. No TikTok account, developer app, or API key required.
๐ค What is TikTok Profile Videos API?
TikTok Profile Videos API is a creator-catalogue Actor that returns TikTok's native video objects rather than a simplified summary. Where most TikTok scrapers hand you eight or ten curated fields, this one returns the platform's full response structure โ over 250 top-level fields per video, with nested statistics, video, music, and author objects.
That completeness is the point. Anything TikTok exposes about a video is in the row, so you're never blocked by a field the scraper decided you didn't need.
- Complete engagement statistics โ plays, likes, comments, shares, saves, downloads, reposts
- Media URLs โ video playback addresses in multiple codecs, plus static, dynamic, and origin covers
- Full author profile on every row, including follower and total-like counts
- Sound and music metadata โ title, artist, original status, play URL
- Hashtags and mention entities via
cha_listandtext_extra - Fast โ 30 videos in roughly 11 seconds
๐ Reading the statistics object
statistics is where the engagement data lives, and it's more granular than most platforms expose:
| Field | Meaning |
|---|---|
play_count | Views |
digg_count | Likes |
like_count | Likes โ mirrors digg_count |
comment_count | Comments |
share_count | Shares |
collect_count | Saves / bookmarks |
download_count | Downloads |
forward_count / repost_count | Forwards and reposts |
digg_count is TikTok's internal name for likes and is the one to rely on; like_count carries the same number.
The genuinely valuable and widely overlooked field is collect_count. A save is a much stronger intent signal than a like โ people bookmark content they mean to come back to and act on. In practice, the save-to-view ratio identifies useful, instructional content far better than the like-to-view ratio, which mostly tracks entertainment value. If you're studying what actually drives conversions rather than reach, that ratio is where to start.
๐ฅ Media URLs and codec choices
The nested video object carries playback addresses alongside width, height, ratio, duration, bitrate, size, definition, and format. Crucially it provides several encodings of the same video โ play_addr, play_addr_h264, and play_addr_bytevc1.
Choose deliberately. H.264 (play_addr_h264) is the compatibility choice: every browser, editor, and media library handles it. ByteVC1 is TikTok's more efficient codec โ smaller files, but far narrower tool support. If your pipeline feeds a video model or an editor, take H.264 and skip the transcoding step you'd otherwise discover you needed.
Covers come in three variants: cover (static), dynamic_cover (animated), and origin_cover (the unprocessed frame). For thumbnail grids, the static cover is nearly always what you want.
As with every social CDN, these URLs are signed and expire within hours. Download during or immediately after the run.
๐ท๏ธ Hashtags and mentions
Hashtags appear in two places. cha_list holds structured challenge/hashtag objects, and text_extra holds the entity markup for the description, including both hashtags and user mentions with their character positions.
Use cha_list for hashtag analysis โ it's already structured, so you don't need to regex the description. Use text_extra when you need to know which accounts a video tagged, which is how you map collaboration networks between creators.
๐ฆ What data can you get with TikTok Profile Videos API?
| Group | Key fields |
|---|---|
| Video | aweme_id, desc, title, create_time, duration, region, share_url, video_url |
| Statistics | statistics.* โ plays, likes, comments, shares, saves, downloads |
| Media | video.play_addr, play_addr_h264, play_addr_bytevc1, cover, dynamic_cover, origin_cover, width, height, bitrate, size |
| Author | author.unique_id, nickname, signature, follower_count, following_count, aweme_count, total_favorited, custom_verify, avatars |
| Music | music.title, author, album, play_url, is_original, duration, owner_nickname |
| Entities | cha_list, text_extra, text_language |
| Flags | is_ads, is_top, duet_enabled, stitch_enabled, prevent_download, private_item, is_ai_generated_content |
โฑ๏ธ create_time is a Unix timestamp
create_time is an integer count of epoch seconds, not a date string:
from datetime import datetime, timezoneposted = datetime.fromtimestamp(row["create_time"], tz=timezone.utc)
Convert on ingest. It also gives you video age, which is essential for fair comparison โ 500,000 views on a two-day-old video is a completely different result from the same count on one from last year.
๐ How does TikTok Profile Videos API differ from TikTok's Research API?
| Feature | TikTok Research API | TikTok Profile Videos API |
|---|---|---|
| Access requirement | Institutional approval; academics only in practice | None |
| Availability | Restricted programme, application required | Immediate |
| Field coverage | Defined subset | TikTok's full native structure |
| Media URLs | Not provided | Multiple codecs and cover variants |
| Author stats | Limited | Full profile on every row |
| Output | Research-API JSON | Native objects, exportable as JSON or CSV |
TikTok's Research API is restricted to approved academic institutions and offers a deliberately narrow field set. For commercial research, creator discovery, and competitive analysis, public profile scraping is the practical route.
๐ How to scrape TikTok profile videos?
- Open the tiktok-profile-videos-api Actor in Apify Console and click Try for free.
- Add usernames to
usernamesโ without the@. - Set
maxVideos, or leave it empty to collect everything. - Click Start โ 30 videos took about 11 seconds in testing.
- Export from the Dataset tab as JSON, CSV, or Excel.
{"usernames": ["hamzasyedofficiall"],"maxVideos": 30}
Compare several creators in one run:
{"usernames": ["creator_one", "creator_two", "creator_three"],"maxVideos": 100}
๐ Handling the field volume
A single video row carries over 250 top-level fields, most of which are platform internals you'll never use. Two hundred videos of raw output is a large, unwieldy file, and a naive CSV export produces a spreadsheet no one can read.
Project down to what you need as the first step of your pipeline:
def slim(v):s, a = v["statistics"], v["author"]return {"id": v["aweme_id"],"desc": v["desc"],"created": v["create_time"],"duration": v.get("duration"),"plays": s["play_count"],"likes": s["digg_count"],"comments": s["comment_count"],"shares": s["share_count"],"saves": s["collect_count"],"author": a["unique_id"],"followers": a["follower_count"],"hashtags": [c.get("cha_name") for c in v.get("cha_list") or []],"url": v.get("share_url"),}
Everything else stays available in the raw dataset if you later need it.
โฌ๏ธ Input
| Parameter | Required | Type | Default | Description |
|---|---|---|---|---|
usernames | Yes | array | ["hamzasyedofficiall"] | TikTok usernames, without the @ prefix |
maxVideos | No | integer | 30 | Maximum videos per user. Leave empty for all. |
{"usernames": ["hamzasyedofficiall"],"maxVideos": 30}
Pitfall โ no @ in usernames. Supply creatorname, not @creatorname, and not a full profile URL.
Pitfall โ maxVideos is per user. Three usernames at maxVideos: 100 is up to 300 videos, not 100.
Pitfall โ leaving maxVideos empty means everything. On a prolific creator with thousands of videos, that's a very large and expensive run. Set a cap on your first run against an unfamiliar account.
Pitfall โ private accounts. Only public profiles are accessible. A private account returns nothing regardless of settings.
โฌ๏ธ Output
One row per video, in TikTok's native structure.
Scraped results (abridged โ the real row has 250+ fields)
[{"aweme_id": "7667138229145029919","desc": "#PUBGMxNARUTO #PUBGM450US #PUBGMOBILE","create_time": 1785144745,"region": "US","share_url": "https://www.tiktok.com/@creator/video/7667138229145029919","statistics": {"play_count": 1840233,"digg_count": 214553,"comment_count": 1204,"share_count": 3391,"collect_count": 18422,"download_count": 902},"video": {"duration": 15000,"width": 1080,"height": 1920,"ratio": "720p","bitrate": 1580000,"play_addr_h264": { "url_list": ["https://v16-webapp.tiktokcdn.com/..."] },"cover": { "url_list": ["https://p16-sign.tiktokcdn.com/..."] }},"music": {"title": "original sound","author": "creator","is_original": true,"play_url": { "url_list": ["https://sf16-sg.tiktokcdn.com/..."] }},"author": {"unique_id": "creator","nickname": "Creator Name","signature": "let's talk.","follower_count": 482119,"aweme_count": 312,"total_favorited": 9841203},"cha_list": [{ "cha_name": "PUBGMOBILE" }]}]
Media URLs arrive as url_list arrays rather than single strings โ TikTok provides several CDN mirrors of the same file. Take the first entry and fall back to the next if it fails; that's what the list is for.
๐ก How can I use the data from TikTok Profile Videos API?
- Influencer marketing teams: verify a creator's real performance from
statisticsandauthor.follower_countinstead of trusting a media kit, and compute engagement rate from actual plays. - Content strategists: analyze
duration, posting time fromcreate_time, andcha_listhashtags against plays to find the format that works in a niche. - Competitive research: track competitors' catalogues and see which videos drive saves, not just likes.
- Music and rights teams: use the
musicobject to measure which sounds a creator uses and whether they're original. - AI and video pipelines: download H.264 renditions with their descriptions and stats as grounded training or analysis input.
๐ How do you track TikTok performance over time?
Views and likes accumulate for weeks on TikTok โ far longer than on most platforms, because the algorithm resurfaces older videos. A single scrape is one point on a long curve. Schedule TikTok Profile Videos API against a fixed username list and join runs on aweme_id.
Two analyses repay the effort. Delayed pickup: a video whose play_count jumps months after posting has been re-surfaced by the algorithm, and identifying what those videos share is genuinely actionable. Save ratio trend: collect_count divided by play_count, tracked over a creator's catalogue, shows whether their content is becoming more or less genuinely useful to viewers โ a leading indicator that moves before follower growth does.
Track author.follower_count on every run too. Because it's repeated on every row, one scrape gives you both catalogue and account trajectory at no extra cost. Apify Console's Schedule feature handles recurrence.
๐ Integrate TikTok Profile Videos API into your workflow
๐ REST API with Python
import requestsfrom datetime import datetime, timezoneTOKEN = "YOUR_APIFY_TOKEN"url = f"https://api.apify.com/v2/acts/scrapers-hub~tiktok-profile-videos-api/run-sync-get-dataset-items?token={TOKEN}"videos = requests.post(url, json={"usernames": ["hamzasyedofficiall"], "maxVideos": 50}).json()for v in sorted(videos, key=lambda x: x["statistics"]["play_count"], reverse=True)[:10]:s = v["statistics"]save_rate = s["collect_count"] / max(s["play_count"], 1) * 100posted = datetime.fromtimestamp(v["create_time"], tz=timezone.utc)print(f"{posted:%Y-%m-%d} {s['play_count']:>10,} plays save {save_rate:4.2f}% {v['desc'][:40]}")
๐ค MCP for AI agents
Register with Apify's Actors MCP Server โ npx @apify/actors-mcp-server --tools scrapers-hub/tiktok-profile-videos-api, or the hosted endpoint at https://mcp.apify.com โ so an agent can pull a creator's real performance data and reason over it.
โฐ Scheduled runs and webhooks
Use Apify Console's Schedule feature for recurring collection, with a run-completion webhook pushing each batch into your creator database.
๐ฐ Pricing
TikTok Profile Videos API is billed on a flat monthly subscription of $9.99, not per result. One subscription covers unlimited runs and unlimited results for the month, on top of standard Apify platform usage for the compute each run consumes. That makes it particularly good value for high-volume or scheduled work, where a per-result price would scale with your output but a flat fee does not. Check the Actor's Apify Store page for the current subscription price.
โ๏ธ Is it legal to scrape TikTok profiles?
TikTok Profile Videos API reads only public profiles and videos โ content any visitor sees without an account. Courts have found that scraping publicly available web data does not violate the U.S. Computer Fraud and Abuse Act (hiQ Labs, Inc. v. LinkedIn Corp., 9th Cir. 2019, reaffirmed 2022), while TikTok's terms separately govern platform use.
Creator handles, nicknames, bios, and avatars are personal data under the GDPR even when public. Videos and their sounds are copyrighted works belonging to creators and rights holders โ analysis and metrics sit very differently from redistributing media. Note that prevent_download on a video is an explicit signal from the creator about their wishes, and respecting it is good practice regardless of technical possibility. Consult your legal team before commercial use or bulk media storage.
โ Frequently asked questions
Does TikTok Profile Videos API need a TikTok account?
No. It reads public profiles โ no account, developer app, or API key.
Should I include the @ in usernames?
No. Supply the bare handle, not @handle and not a full profile URL.
Does maxVideos limit the whole run?
No โ it's per username. Three usernames at 100 each is up to 300 videos.
How do I get all of a creator's videos?
Leave maxVideos empty. Be careful with prolific accounts; that can be a very large run.
Why does each row have so many fields?
Because the Actor returns TikTok's own complete video structure rather than a curated subset. Project down to the fields you need as the first step of your pipeline.
What's the difference between digg_count and like_count?
Nothing โ digg_count is TikTok's internal name for likes and both carry the same value.
Which video URL should I download?
play_addr_h264 for compatibility with standard tools. ByteVC1 is smaller but far less widely supported. URLs arrive as url_list arrays of CDN mirrors โ use the first and fall back if it fails.
Why is create_time a number?
It's a Unix epoch timestamp in seconds. Convert it with your language's standard datetime function.
Where are the hashtags?
In cha_list as structured objects, and in text_extra as description entities alongside user mentions.
Can it scrape private accounts?
No. Only public profiles are accessible.
๐ Related Actors
- TikTok Subtitles Extractor โ transcribe the videos you collect here
- Instagram Reel Scraper โ the same short-form workflow on Instagram
- Facebook Reels Scraper โ short-form video metrics on Facebook
- Merge, Dedup & Transform Datasets โ deduplicate scheduled runs on
aweme_id
๐ฌ Your feedback
Hit a profile that returns fewer videos than expected, or a field that stopped parsing? Report it through the Issues tab on this Actor's Apify Console page with the username you used.
Prefer email? Contact the team directly at scraperhubapi@gmail.com. Include the Actor name, the exact input you used, and the run ID so the issue can be reproduced and fixed quickly.