TikTok Profile Videos API - Stats & Media URLs avatar

TikTok Profile Videos API - Stats & Media URLs

Pricing

$9.99/month + usage

Go to Apify Store
TikTok Profile Videos API - Stats & Media URLs

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

Scrapers Hub

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

0

Monthly active users

16 hours ago

Last modified

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_list and text_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:

FieldMeaning
play_countViews
digg_countLikes
like_countLikes โ€” mirrors digg_count
comment_countComments
share_countShares
collect_countSaves / bookmarks
download_countDownloads
forward_count / repost_countForwards 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?

GroupKey fields
Videoaweme_id, desc, title, create_time, duration, region, share_url, video_url
Statisticsstatistics.* โ€” plays, likes, comments, shares, saves, downloads
Mediavideo.play_addr, play_addr_h264, play_addr_bytevc1, cover, dynamic_cover, origin_cover, width, height, bitrate, size
Authorauthor.unique_id, nickname, signature, follower_count, following_count, aweme_count, total_favorited, custom_verify, avatars
Musicmusic.title, author, album, play_url, is_original, duration, owner_nickname
Entitiescha_list, text_extra, text_language
Flagsis_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, timezone
posted = 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?

FeatureTikTok Research APITikTok Profile Videos API
Access requirementInstitutional approval; academics only in practiceNone
AvailabilityRestricted programme, application requiredImmediate
Field coverageDefined subsetTikTok's full native structure
Media URLsNot providedMultiple codecs and cover variants
Author statsLimitedFull profile on every row
OutputResearch-API JSONNative 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?

  1. Open the tiktok-profile-videos-api Actor in Apify Console and click Try for free.
  2. Add usernames to usernames โ€” without the @.
  3. Set maxVideos, or leave it empty to collect everything.
  4. Click Start โ€” 30 videos took about 11 seconds in testing.
  5. 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

ParameterRequiredTypeDefaultDescription
usernamesYesarray["hamzasyedofficiall"]TikTok usernames, without the @ prefix
maxVideosNointeger30Maximum 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 statistics and author.follower_count instead of trusting a media kit, and compute engagement rate from actual plays.
  • Content strategists: analyze duration, posting time from create_time, and cha_list hashtags 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 music object 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 requests
from datetime import datetime, timezone
TOKEN = "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) * 100
posted = 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.

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.

  • 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.