{"id":"2e2bd45f-cc23-45f4-a5e7-42b98de5d21c","slug":"tiktok-com-api","name":"tiktok.com API","description":"Retrieve detailed information about any public TikTok video including captions, media URLs, view counts, likes, and shares, plus access all comments posted on that video. Perfect for analyzing trending content, monitoring video performance, or building applications that need TikTok video data.","front_facing_description":"Retrieve detailed information about any public TikTok video including captions, media URLs, view counts, likes, and shares, plus access all comments posted on that video. Perfect for analyzing trending content, monitoring video performance, or building applications that need TikTok video data.","source_url":"https://www.tiktok.com/@lilireinhart/video/7517409255914212638","is_authenticated":false,"canonical_scraper_id":"8fb77401-1c2f-4e77-a331-41cac1121187","apis":[{"method":"GET","endpoint_name":"get_post_details","description":"Get video details including caption, media URL, author info, engagement stats, and metadata for a public TikTok video. Requires a full TikTok video URL including the username path (e.g. https://www.tiktok.com/@username/video/VIDEO_ID). Returns a single Video resource with nested author, stats (likes, shares, comments, plays, saves, reposts), and music objects. The media_url, cover and origin_cover are time-limited signed CDN URLs (the cover URLs carry an x-expires Unix timestamp, observed roughly 1-2 days ahead); call again to obtain freshly signed URLs.","input_params":{"url":{"type":"string","required":true,"description":"Full TikTok video URL in the format https://www.tiktok.com/@username/video/VIDEO_ID","domain":{"kind":"open","example":"https://www.tiktok.com/@lilireinhart/video/7517409255914212638","pattern":"https://www.tiktok.com/@[^/]+/video/\\d+","generator":{"type":"static","value":"https://www.tiktok.com/@lilireinhart/video/7517409255914212638"}}}},"return_schema":{"type":"object","fields":{"id":"string - Video ID","cover":"string - Video cover image URL (signed, time-limited)","music":"object - Music info with id, title, author","stats":"object - Engagement stats with likes, shares, comments, plays, saves counts, and reposts (integer, or null when TikTok omits it)","width":"integer - Video width in pixels","author":"object - Author info with uid, unique_id, nickname, avatar URL, and verified boolean","format":"string - Video format (e.g. mp4)","height":"integer - Video height in pixels","caption":"string - Video caption/description","duration":"integer - Video duration in seconds","media_url":"string - Time-limited signed video playback URL","create_time":"string - Unix timestamp of creation","origin_cover":"string - Original cover image URL (signed, time-limited)"},"sample":{"data":{"id":"7517409255914212638","cover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/o4WHfRGQpAJWIf7bQHCmCjZCqcm8gFnfIN0AgM~tplv-tiktokx-origin.image?dr=9636&x-expires=1789200000&x-signature=REDACTED","music":{"id":"7515252172306942726","title":"MAMASITAAA","author":"celebsnapz"},"stats":{"likes":480700,"plays":4500000,"saves":13124,"shares":14500,"reposts":0,"comments":1080},"width":576,"author":{"uid":"6815436682578723845","avatar":"https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/075fe1e76e18c49d5d6dc360219c059f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&x-expires=1789200000&x-signature=REDACTED","nickname":"Lili Reinhart","verified":true,"unique_id":"lilireinhart"},"format":"mp4","height":1024,"caption":"Mother & son ","duration":15,"media_url":"https://v16-webapp-prime.us.tiktok.com/video/tos/useast8/REDACTED/?a=1988&expire=1789201993&signature=REDACTED","create_time":"1750283252","origin_cover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/ooBm6pAQE9DAUVdFzyBQSoZDh6zEREDsQjfvf1~tplv-tiktokx-origin.image?dr=9636&x-expires=1789200000&x-signature=REDACTED"},"status":"success"}},"initiates_session":false,"price":1,"verification":{"assertions":[{"path":"$.data.id","op":"not_null"},{"path":"$.data.caption","op":"exists"},{"path":"$.data.stats.likes","op":"not_null"},{"path":"$.data.author.unique_id","op":"not_null"}],"empty_is_valid":false,"recipe_version":1}},{"method":"GET","endpoint_name":"get_comments","description":"Get comments for a TikTok video with cursor-based pagination. Accepts either a full TikTok video URL or a numeric video ID. Returns comments sorted by relevance with user info, like counts, reply counts, and creator-liked labels. Use the returned cursor value to fetch subsequent pages.","input_params":{"url":{"type":"string","required":true,"description":"TikTok video URL (e.g. https://www.tiktok.com/@user/video/1234567890) or numeric video ID","domain":{"kind":"open","example":"https://www.tiktok.com/@lilireinhart/video/7517409255914212638","pattern":"https://www.tiktok.com/@[^/]+/video/\\d+","generator":{"type":"static","value":"https://www.tiktok.com/@lilireinhart/video/7517409255914212638"}}},"count":{"type":"integer","required":false,"description":"Number of comments to return per page, maximum 50.","default":20,"enum":"Count","closed":true,"domain":{"kind":"enum","values":[10,20,50],"generator":{"type":"enum_pick","strategy":"first"}}},"cursor":{"type":"integer","required":false,"description":"Pagination cursor. Use the cursor value from a previous response to fetch the next page of comments.","default":0,"domain":{"kind":"open","generator":{"type":"static","value":0}}}},"return_schema":{"type":"object","fields":{"total":"integer - Number of comments returned in this response","cursor":"integer - Cursor value for fetching the next page","comments":"array - List of comment objects with comment_id, text, create_time, likes, reply_count, is_liked_by_creator, labels, and user object","has_more":"boolean - Whether more comments are available beyond this page","video_id":"string - The video ID comments belong to"},"sample":{"data":{"total":10,"cursor":10,"comments":[{"text":"He said who has a daughter because it sure as hell ain’t you","user":{"uid":"7462856636861449248","avatar":"https://p16-common-sign.tiktokcdn-us.com/example.jpg","nickname":"chlo","username":"chlo438"},"likes":7613,"labels":["Liked by creator"],"comment_id":"7517800014593131286","create_time":1750374233,"reply_count":9,"is_liked_by_creator":true}],"has_more":true,"video_id":"7517409255914212638"},"status":"success"}},"initiates_session":false,"price":1,"verification":{"assertions":[{"path":"$.data.video_id","op":"not_null"},{"path":"$.data.comments","op":"type_is","value":"array"},{"path":"$.data.comments[0].comment_id","op":"not_null"},{"path":"$.data.has_more","op":"exists"}],"empty_is_valid":false,"recipe_version":1}},{"method":"GET","endpoint_name":"get_profile_details","description":"Get public profile information for a TikTok user by username. Returns display name, bio, avatar URL, follower/following/like/video counts, verified status, and bio link. Requires one page load per call. Note: TikTok's public profile page publishes only Following, Followers and Likes totals; it does not publish an aggregate view/play count across a creator's videos, so no total_views field is available. Per-video play counts are available from get_post_details and get_user_videos.","input_params":{"username":{"type":"string","required":true,"description":"TikTok username (e.g. 'lilireinhart' or '@lilireinhart'). Leading @ is stripped automatically.","domain":{"kind":"open","example":"lilireinhart","pattern":"@?[a-zA-Z0-9_.]+","generator":{"type":"static","value":"lilireinhart"}}}},"return_schema":{"type":"object","fields":{"bio":"string - Profile bio/signature text","uid":"string - User's internal ID","likes":"integer - Total likes received across all videos","avatar":"string - Avatar image URL (largest available)","private":"boolean - Whether the account is private","bio_link":"string - External link from bio (empty string if none)","nickname":"string - Display name","username":"string - TikTok username (unique_id)","verified":"boolean - Whether the account is verified","followers":"integer - Number of followers","following":"integer - Number of accounts followed","video_count":"integer - Number of public videos"},"sample":{"data":{"bio":"Look, more content.","uid":"6815436682578723845","likes":288200000,"avatar":"https://p19-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/example~tplv-tiktokx-cropcenter:1080:1080.jpeg","private":false,"bio_link":"https://www.personalday.com","nickname":"Lili Reinhart","username":"lilireinhart","verified":true,"followers":7500000,"following":281,"video_count":312},"status":"success"}},"initiates_session":false,"price":1,"verification":{"assertions":[{"path":"$.data.uid","op":"not_null"},{"path":"$.data.username","op":"not_null"},{"path":"$.data.bio","op":"exists"},{"path":"$.data.followers","op":"not_null"}],"empty_is_valid":false,"recipe_version":1}},{"method":"GET","endpoint_name":"get_comment_replies","description":"Get replies to a specific comment on a TikTok video with cursor-based pagination. Accepts a full TikTok video URL (or numeric video ID) and a comment_id from get_comments results. Returns replies sorted by relevance, each including reply_to_comment_id (the parent comment) and reply_to_reply_id (the specific reply being responded to, or '0' for direct replies to the parent). Use the returned cursor value to fetch subsequent pages.","input_params":{"url":{"type":"string","required":true,"description":"TikTok video URL (e.g. https://www.tiktok.com/@user/video/1234567890) or numeric video ID","domain":{"kind":"open","example":"https://www.tiktok.com/@lilireinhart/video/7517409255914212638","pattern":"https://www.tiktok.com/@[^/]+/video/\\d+","generator":{"path":"$.data.video_id","type":"derived","from_endpoint":"get_comments"}}},"count":{"type":"integer","required":false,"description":"Number of replies to return per page, maximum 50.","default":20,"enum":"Count","closed":true,"domain":{"kind":"enum","values":[10,20,50],"generator":{"type":"enum_pick","strategy":"first"}}},"cursor":{"type":"integer","required":false,"description":"Pagination cursor. Use the cursor value from a previous response to fetch the next page of replies.","default":0,"domain":{"kind":"open","generator":{"type":"static","value":0}}},"comment_id":{"type":"string","required":true,"description":"ID of the comment to fetch replies for, from get_comments results","domain":{"kind":"open","example":"7517800014593131286","generator":{"path":"$.data.comments[*].comment_id","type":"derived","from_endpoint":"get_comments"}}}},"return_schema":{"type":"object","fields":{"total":"integer - Number of replies returned in this response","cursor":"integer - Cursor value for fetching the next page","replies":"array - List of reply objects with comment_id, text, create_time, likes, reply_count, is_liked_by_creator, labels, user, reply_to_comment_id, and reply_to_reply_id","has_more":"boolean - Whether more replies are available beyond this page","video_id":"string - The video ID the comment belongs to","comment_id":"string - The parent comment ID replies are for"}},"initiates_session":false,"price":1,"verification":{"assertions":[{"path":"$.data.video_id","op":"not_null"},{"path":"$.data.comment_id","op":"not_null"},{"path":"$.data.replies","op":"type_is","value":"array"},{"path":"$.data.has_more","op":"exists"}],"empty_is_valid":false,"recipe_version":1}},{"method":"GET","endpoint_name":"search_by_hashtag","description":"List the videos in a TikTok hashtag's public embed playlist. IMPORTANT LIMITATION: TikTok's own hashtag page feed requires browser-minted request signatures, so the only public, signature-free source is the hashtag's embed playlist: a curated, fixed set of roughly 10 videos per hashtag that TikTok rarely refreshes (observed creation dates are typically one to several years old), not a live or trending feed. TikTok publishes an embed playlist only for a subset of hashtags (e.g. cooking, funny, dance, manchesterunited were available; skincare, travel, makeup, football were not); a hashtag without one returns an upstream error whose message says so (upstream status 400 or 500 from the embed page). One page load per call. Each video includes id, caption, cover image, media URL, author username, play count, and an approximate creation timestamp derived from the video ID. Author details (nickname, avatar, verified) and engagement stats (likes, shares, comments) are not published by this source and are returned as empty/zero; use get_post_details on https://www.tiktok.com/@<author.username>/video/<id> for full metrics. Pagination is offset-based within the available set: cursor is the offset, has_more is true only while more of the set remains. date_filter is applied locally to the creation time derived from video IDs; because the playlist content is old, 'yesterday', 'this_week' and 'this_month' usually yield an empty videos array - that empty result is correct, not a failure - so use 'all_time' (the default) to see the playlist. The hashtag is normalized to lower case without a leading '#' and must be a single word (letters, digits, underscores).","input_params":{"count":{"type":"integer","required":false,"description":"Number of videos to return per page, maximum 50. The actual number returned may be less depending on available videos for the hashtag.","default":20,"enum":"Count","closed":true,"domain":{"kind":"enum","values":[10,20,50],"generator":{"type":"enum_pick","strategy":"first"}}},"cursor":{"type":"integer","required":false,"description":"Pagination cursor (offset). Use the cursor value from a previous response to fetch the next page of videos.","default":0,"domain":{"kind":"open","generator":{"type":"static","value":0}}},"hashtag":{"type":"string","required":true,"description":"The hashtag to search (e.g. 'funny' or '#funny'). Leading '#' is stripped and the value is lower-cased automatically; must be a single word of letters, digits or underscores.","domain":{"kind":"open","example":"funny","generator":{"type":"static","value":"cooking"}}},"date_filter":{"type":"string","required":false,"description":"Filter results by date range based on approximate creation time derived from video IDs. When 'yesterday', returns only videos from the previous calendar day (UTC). When 'this_week', returns videos from the current week (Monday start). When 'this_month', returns videos from the current calendar month. Because the embed playlist holds old curated videos, the narrow windows commonly return an empty list.","default":"all_time","enum":"DateFilter","closed":true,"domain":{"kind":"enum","generator":{"type":"enum_pick","member":"_all_time"}}}},"return_schema":{"type":"object","fields":{"cursor":"integer - Cursor value for fetching the next page","videos":"array - List of video objects with id, caption, create_time, cover, media_url, author, and stats","hashtag":"string - The normalized hashtag that was searched","has_more":"boolean - Whether more videos are available beyond this page"},"sample":{"data":{"cursor":10,"videos":[{"id":"7125823187908070661","cover":"https://p16-common-sign.tiktokcdn-us.com/tos-maliva-p-0068/d6b067679b524a399bb8e68f345882b6_1659110004~tplv-tiktokx-origin.image","stats":{"likes":0,"plays":23500000,"shares":0,"comments":0},"author":{"avatar":"","nickname":"","username":"simplefood4you","verified":false},"caption":"I LOVE GARLIC 🙊🧄 #garlic #recipe #cooking #foodie #foodtiktok #food #foryou #fyp","media_url":"https://v16m.tiktokcdn-us.com/5d3584cfac25e690b7a279d92d569ba6/6a90bf8e/video/tos/useast2a/tos-useast2a-pve-0068/ec65ddeb249343cfbb019992bd843314/","create_time":"1659109999"}],"hashtag":"cooking","has_more":false},"status":"success"}},"initiates_session":false,"price":1,"verification":{"assertions":[{"path":"$.data.hashtag","op":"not_null"},{"path":"$.data.videos","op":"type_is","value":"array"},{"path":"$.data.videos[0].id","op":"not_null"},{"path":"$.data.has_more","op":"exists"}],"empty_is_valid":false,"recipe_version":2}},{"method":"GET","endpoint_name":"get_user_videos","description":"Get a TikTok user's most recent public videos, newest first. IMPORTANT LIMITATION: the only public, signature-free source is TikTok's creator embed page, which exposes a fixed set of roughly 10-13 of the creator's latest videos (pinned videos included). Full-history pagination is NOT available: TikTok's own profile feed requires browser-minted request signatures, so this endpoint cannot reach older videos. cursor/count paginate only within that small set: next_cursor is the string offset to pass as cursor for the next page and is null when the set is exhausted; has_more is true only while next_cursor is non-null; total_available is the number of videos in the accessible set, not the creator's lifetime total. When include_profile_count is true, one extra profile-page load fills profile_video_count with TikTok's own public video count (null on omission or if the profile page fails). Per video: id, post_url, caption, create_time (Unix seconds derived from the video ID), is_pinned, media_url (direct playback URL, empty for photo posts), cover, cover_expires_at, and stats. is_pinned is true for the videos the creator has pinned to the top of their profile (TikTok allows up to 3, shown with a 'Pinned' badge on the profile grid); it is derived from the embed source's ordering, which lists pinned videos ahead of the newest-first feed, so a pinned video is one placed ahead of a newer video. The one blind spot: a pinned video that is also the creator's most recent upload cannot be told apart from an unpinned one and is reported as is_pinned false. Results are returned newest first regardless of pinning; filter on is_pinned to collect the pinned videos' post_url, cover and caption. The embed source publishes only the play count, so stats.likes/comments/shares/saves are null here; use get_post_details on post_url for full engagement metrics, or get_creator_engagement for a server-side engagement rate over the same recent set. cover and media_url are signed CDN URLs that expire: cover_expires_at is the Unix timestamp in the URL's x-expires parameter (observed roughly 1-2 days ahead, and the CDN returns 403 once it passes); calling this endpoint again returns freshly signed URLs. Only videos the user has published publicly are covered. Content on the profile's Reposts tab (videos by other creators the user reposted) is a separate feed served by get_user_reposts; friends-only or private videos and Liked videos are never included. An account TikTok's own logged-out profile reports with zero published videos (the profile page shows 'This user has not published any videos', and get_profile_details returns video_count 0) returns an empty videos array with has_more false and total_available 0 even when its Reposts tab is populated - call get_user_reposts for that content. A username TikTok does not know returns a not-found input error.","input_params":{"count":{"type":"integer","required":false,"description":"Number of videos to return per page, maximum 50. The actual number may be less depending on available videos.","default":20,"enum":"Count","closed":true,"domain":{"kind":"enum","values":[10,20,50],"generator":{"type":"enum_pick","strategy":"first"}}},"cursor":{"type":"integer","required":false,"description":"Pagination offset within the available video set. Pass the next_cursor value from a previous response (as an integer) to fetch the next page.","default":0,"domain":{"kind":"open","generator":{"type":"static","value":0}}},"username":{"type":"string","required":true,"description":"TikTok username (e.g. 'simonbeard_official' or '@simonbeard_official'). Leading @ is stripped automatically.","domain":{"kind":"open","example":"simonbeard_official","pattern":"@?[a-zA-Z0-9_.]+","generator":{"type":"static","value":"simonbeard_official"}}},"include_profile_count":{"type":"boolean","required":false,"description":"When true, performs one additional profile-page load and fills profile_video_count with TikTok's reported public video count for the user.","default":false,"domain":{"kind":"open"}}},"return_schema":{"type":"object","fields":{"cursor":"integer - Offset immediately after this page (kept for compatibility; equals the integer form of next_cursor when has_more is true)","videos":"array - Video objects with id, post_url, caption, create_time, is_pinned (boolean: true when the creator pinned this video to the top of their profile; derived from source ordering, see description), media_url, cover, cover_expires_at (Unix seconds the signed cover URL expires, or null), and stats (plays integer; likes, comments, shares, saves are null because the embed source does not publish them)","has_more":"boolean - Whether another page exists within the accessible set (roughly 10-13 most recent videos); never indicates older history beyond that set","username":"string - The resolved TikTok username","next_cursor":"string|null - Offset to pass as cursor for the next page within the accessible set; null when no further page exists","total_available":"integer - Number of videos in the accessible recent set, not the creator's lifetime video count","profile_video_count":"integer|null - TikTok's reported public video count for the user; only filled when include_profile_count is true"},"sample":{"data":{"cursor":12,"videos":[{"id":"7683821212341914881","cover":"https://p19-common-sign.tiktokcdn-us.com/tos-alisg-p-0037/os0p1qAFfACZArDyCOeEp8QgxFVWmoHAEUEIBK~tplv-tiktokx-origin.image?x-expires=1789239600&x-signature=<sig>","stats":{"likes":null,"plays":13500,"saves":null,"shares":null,"comments":null},"caption":"The ATO is using AI to claw back money and some businesses are getting hit hard.","post_url":"https://www.tiktok.com/@simonbeard_official/video/7683821212341914881","is_pinned":false,"media_url":"https://v45.tiktokcdn-us.com/<signed>/video/tos/alisg/tos-alisg-pve-0037/oYRAECINzFGerNAQTjkSLziDeZoAeVREaVgHcr/?a=1233&mime_type=video_mp4","create_time":"1789029038","cover_expires_at":1789239600},{"id":"7412923646483746054","cover":"https://p16-common-sign.tiktokcdn-us.com/tos-maliva-p-0068/75979bb9395e4ea7b0615255e0ccb4d5_1725955800~tplv-tiktokx-dmt-logom.image?x-expires=1789239600&x-signature=<sig>","stats":{"likes":null,"plays":266400,"saves":null,"shares":null,"comments":null},"caption":"Yo-Chi is one of the most simple (and I believe most profitable) food businesses in Australia. #yochi #entrepreneurs #business #hospitalityindustry ","post_url":"https://www.tiktok.com/@simonbeard_official/video/7412923646483746054","is_pinned":true,"media_url":"https://v45.tiktokcdn-us.com/<signed>/video/tos/useast2a/tos-useast2a-ve-0068c004/okxGLCbm8Ix6UdUfgBTuIektSfvgNRAKtCrjgm/?a=1233&mime_type=video_mp4","create_time":"1725955783","cover_expires_at":1789239600}],"has_more":false,"username":"simonbeard_official","next_cursor":null,"total_available":12,"profile_video_count":null},"status":"success"}},"initiates_session":false,"price":1,"verification":{"assertions":[{"path":"$.data.username","op":"not_null"},{"path":"$.data.videos","op":"type_is","value":"array"},{"path":"$.data.has_more","op":"exists"},{"path":"$.data.next_cursor","op":"exists"},{"path":"$.data.total_available","op":"not_null"},{"path":"$.data.videos[0].is_pinned","op":"type_is","value":"boolean"}],"empty_is_valid":true,"recipe_version":2}},{"method":"GET","endpoint_name":"get_user_reposts","description":"List the videos a TikTok user has reposted, i.e. the content of the profile's public Reposts tab, newest repost first. Each row is a video published by ANOTHER creator that the named user reposted; post_url and author therefore point at the original creator, not at the user queried. This is the feed to use for accounts whose profile shows 'This user has not published any videos' but whose Reposts tab is populated (get_user_videos returns an empty set for those accounts). Two round trips per call: one profile-page load to resolve the user, then one feed request. Pagination is cursor-based over the full reposts history: pass next_cursor from a previous response as cursor; next_cursor is null and has_more false on the last page. count is clamped to 30 (the maximum the feed accepts); the page may hold fewer rows than count because private items are dropped. Per video: id, post_url, caption, create_time (Unix seconds as a string), author (uid, unique_id, nickname, avatar, verified), media_url (direct playback URL, empty string for photo posts), cover, cover_expires_at, duration (seconds, 0 for photo posts) and full engagement stats (plays, likes, comments, shares, saves; reposts is null when TikTok omits it). media_url, cover and avatar are signed, time-limited CDN URLs; call again for fresh ones. A username TikTok does not know returns a not-found input error. Videos the user published themselves are not included; use get_user_videos for those.","input_params":{"count":{"type":"integer","required":false,"description":"Number of reposted videos per page; values above 30 are clamped to 30. Fewer rows may be returned when private items are dropped.","default":20,"domain":{"kind":"open"}},"cursor":{"type":"string","required":false,"description":"Pagination cursor for the reposts feed. Omit or pass '0' for the first page; otherwise pass the next_cursor value from a previous response unchanged.","default":"0","domain":{"kind":"open"}},"username":{"type":"string","required":true,"description":"TikTok username (e.g. 'lilireinhart' or '@lilireinhart'). Leading @ is stripped automatically.","domain":{"kind":"open","example":"tommy.purcell","pattern":"@?[a-zA-Z0-9_.]+","generator":{"type":"static","value":"tommy.purcell"}}}},"return_schema":{"type":"object","fields":{"total":"integer - Number of videos returned in this page","videos":"array - Reposted video objects: id, post_url (on the original creator's profile), caption, create_time (Unix seconds string), author {uid, unique_id, nickname, avatar, verified} of the ORIGINAL creator, media_url (empty for photo posts), cover, cover_expires_at (Unix seconds the signed cover URL expires, or null), duration (seconds), stats {plays, likes, comments, shares, saves integers; reposts integer or null}","has_more":"boolean - Whether another page of reposts exists","username":"string - The resolved TikTok username whose reposts were listed","next_cursor":"string|null - Cursor to pass as cursor for the next page; null when no further page exists"},"sample":{"data":{"total":10,"videos":[{"id":"7682863694266649878","cover":"https://p19-common-sign.tiktokcdn-us.com/tos-no1a-p-0037-no/o8ERDEgLI8qAGkE9QCfAWkFABnuJAFfwn8AcPX~tplv-tiktokx-origin.image?dr=9636&x-expires=1789203600","stats":{"likes":21500,"plays":135000,"saves":1692,"shares":509,"reposts":0,"comments":34},"author":{"uid":"7555078549150336022","avatar":"https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/d7b692a8136bc46262889035836d2cc9~tplv-tiktokx-cropcenter:1080:1080.jpeg?x-expires=1789203600","nickname":"zch.cc","verified":false,"unique_id":"zch.cc"},"caption":"#rayancherki #mancity #footballedit #targetaudience #fyp ","duration":31,"post_url":"https://www.tiktok.com/@zch.cc/video/7682863694266649878","media_url":"https://v16-webapp-prime.us.tiktok.com/video/tos/no1a/tos-no1a-ve-0068c001-no/oIAFgAofCEqIfBMG5cDwTQQ0knBRENFgNS3Eir/?a=1988&mime_type=video_mp4&expire=1789205937","create_time":"1788806104","cover_expires_at":1789203600}],"has_more":true,"username":"tommy.purcell","next_cursor":"10"},"status":"success"}},"initiates_session":false,"price":3,"verification":{"assertions":[{"path":"$.data.username","op":"not_null"},{"path":"$.data.videos","op":"type_is","value":"array"},{"path":"$.data.videos[0].id","op":"not_null"},{"path":"$.data.videos[0].author.unique_id","op":"not_null"},{"path":"$.data.has_more","op":"exists"},{"path":"$.data.next_cursor","op":"exists"}],"empty_is_valid":false,"recipe_version":1}},{"method":"GET","endpoint_name":"get_creator_engagement","description":"Compute a creator's engagement rate in one call. Two input modes. (1) username only: the sample is the same set get_user_videos exposes (the creator embed playlist: roughly the 10-13 latest videos, pinned included, newest first), truncated to sample_size; older history is not reachable. Work is strictly proportional to the sample: one creator-listing load plus exactly one lightweight single-video load per sampled video, and nothing is fetched for videos beyond sample_size (sample_size + 1 requests: 2 at sample_size 1, 6 at the default of 5, at most 16). (2) post_urls supplied: the listing step is skipped entirely and exactly one single-video load is made per supplied URL (len(post_urls) requests, no listing overhead); sample_size is ignored and sample_size_requested equals the number of URLs, and username is optional (when omitted, the response username is the author of the first supplied video). For every sampled video whose page publishes plays > 0 and integer likes, comments and shares, video rate = (likes + comments + shares) / plays; engagement_rate is the arithmetic mean of those rates as a decimal fraction (0.0527 means 5.27%), rounded to 6 decimals. Videos whose page could not be read (unknown or removed video ID) or whose counts are missing are skipped, never counted as zero, and their IDs are listed in skipped_video_ids. sample_size_used is the number of videos that actually contributed, and avg_plays/avg_likes/avg_comments/avg_shares are plain means over those same videos (4 decimals). When no video contributed, engagement_rate and every avg_* field are null (never 0) and sample_size_used is 0; a creator whose logged-out profile shows no published videos returns exactly that, with an empty videos array when include_videos is true, not an error. The videos array (each contributing video's id, post_url, plays, likes, comments, shares, rate) is present only when include_videos is true. A username TikTok does not know returns a not-found input error (the same one get_user_videos returns); a call with neither username nor post_urls, or a post_urls entry without a recognizable video ID, returns an input-format error. Videos in post_urls may belong to different creators; each row's post_url points at its own author.","input_params":{"username":{"type":"string","required":false,"description":"TikTok username (e.g. 'lilireinhart' or '@lilireinhart'). Leading @ is stripped automatically. Required unless post_urls is supplied.","domain":{"kind":"open","example":"simonbeard_official","pattern":"@?[a-zA-Z0-9_.]+","generator":{"type":"static","value":"simonbeard_official"}}},"post_urls":{"type":"string","required":false,"description":"Comma-separated list of 1 to 15 TikTok video URLs (https://www.tiktok.com/@user/video/VIDEO_ID) or numeric video IDs, e.g. url1,url2. When supplied, the creator listing step is skipped and only these videos are measured; use the post_url values from get_user_videos or your own stored URLs.","domain":{"kind":"open"}},"sample_size":{"type":"integer","required":false,"description":"How many of the creator's most recent videos to average over, 1 to 15; values outside that range are rejected. Fewer are used when the creator has fewer accessible videos. Ignored when post_urls is supplied.","default":5,"domain":{"kind":"open"}},"include_videos":{"type":"boolean","required":false,"description":"When true, the response also carries a videos array with the per-video counts and rate each contributing video added to the average.","default":false,"domain":{"kind":"open"}}},"return_schema":{"type":"object","fields":{"videos":"array - Only when include_videos is true: contributing videos with id, post_url, plays, likes, comments, shares (integers) and rate (decimal fraction, 6 decimals); empty when none contributed","username":"string|null - The resolved TikTok username (in post_urls mode without username: the author of the first supplied video; null only when no supplied video could be read and no username was derivable)","avg_likes":"number|null - Mean like count over contributing videos; null when none contributed","avg_plays":"number|null - Mean play count over contributing videos (4 decimals); null when none contributed","avg_shares":"number|null - Mean share count over contributing videos; null when none contributed","avg_comments":"number|null - Mean comment count over contributing videos; null when none contributed","engagement_rate":"number|null - Mean of (likes + comments + shares) / plays over the contributing videos, as a decimal fraction (6 decimals); null when no sampled video had usable counts","sample_size_used":"integer - Number of videos that actually contributed to the averages","skipped_video_ids":"array - Video IDs among the sampled/supplied set that could not be read or lacked counts and so did not contribute (empty when all contributed)","sample_size_requested":"integer - The sample_size applied (default 5), or the number of post_urls entries when post_urls is supplied"},"sample":{"data":{"videos":[{"id":"7685603489807928592","rate":0.036684,"likes":39,"plays":1363,"shares":10,"comments":1,"post_url":"https://www.tiktok.com/@simonbeard_official/video/7685603489807928592"},{"id":"7684547856543288593","rate":0.024733,"likes":984,"plays":43100,"shares":65,"comments":17,"post_url":"https://www.tiktok.com/@simonbeard_official/video/7684547856543288593"}],"username":"simonbeard_official","avg_likes":511.5,"avg_plays":22231.5,"avg_shares":37.5,"avg_comments":9.0,"engagement_rate":0.030708,"sample_size_used":2,"skipped_video_ids":[],"sample_size_requested":2},"status":"success"}},"initiates_session":false,"price":10,"verification":{"assertions":[{"path":"$.data.username","op":"not_null"},{"path":"$.data.engagement_rate","op":"exists"},{"path":"$.data.sample_size_used","op":"type_is","value":"number"},{"path":"$.data.sample_size_requested","op":"type_is","value":"number"},{"path":"$.data.avg_plays","op":"exists"},{"path":"$.data.skipped_video_ids","op":"type_is","value":"array"}],"empty_is_valid":false,"recipe_version":2}}],"sample_inputs":{"get_comments":{"url":"https://www.tiktok.com/@lilireinhart/video/7517409255914212638","count":"10","cursor":"0"},"get_user_videos":{"count":"10","cursor":"0","username":"simonbeard_official"},"get_post_details":{"url":"https://www.tiktok.com/@lilireinhart/video/7517409255914212638"},"get_user_reposts":{"username":"tommy.purcell"},"search_by_hashtag":{"count":"10","cursor":"0","hashtag":"cooking","date_filter":"all_time"},"get_comment_replies":{"url":"7517409255914212638","count":"10","cursor":"0","comment_id":"7517414309862277895"},"get_profile_details":{"username":"lilireinhart"},"get_creator_engagement":{"username":"simonbeard_official"}},"prefill_inputs":{"get_post_details":{"url":"https://www.tiktok.com/@lilireinhart/video/7517409255914212638"},"get_comments":{"url":"https://www.tiktok.com/@lilireinhart/video/7517409255914212638","count":"10","cursor":"0"},"get_profile_details":{"username":"lilireinhart"},"get_comment_replies":{"count":"10","cursor":"0"},"search_by_hashtag":{"count":"10","cursor":"0","hashtag":"cooking","date_filter":"all_time"},"get_user_videos":{"count":"10","cursor":"0","username":"simonbeard_official"},"get_user_reposts":{"username":"tommy.purcell"},"get_creator_engagement":{"username":"simonbeard_official"}},"last_verified_at":"2026-11-01T05:33:56.986643+00:00","endpoint_health":[{"endpoint_name":"get_profile_details","status":"healthy","last_checked_at":"2026-11-01T05:33:56.986643+00:00","last_verified_at":"2026-11-01T05:33:56.986643+00:00","recent_runs":[{"at":"2026-10-27T13:03:53.163937+00:00","status":"healthy"},{"at":"2026-10-26T19:04:25.340241+00:00","status":"healthy"},{"at":"2026-10-20T19:02:26.063228+00:00","status":"healthy"},{"at":"2026-10-19T20:03:52.903135+00:00","status":"healthy"},{"at":"2026-10-16T17:03:53.028742+00:00","status":"healthy"}]},{"endpoint_name":"get_post_details","status":"healthy","last_checked_at":"2026-10-30T19:34:38.342902+00:00","last_verified_at":"2026-10-30T19:34:38.342902+00:00","recent_runs":[{"at":"2026-10-27T13:03:53.163937+00:00","status":"healthy"},{"at":"2026-10-26T19:04:25.340241+00:00","status":"healthy"},{"at":"2026-10-20T19:02:26.063228+00:00","status":"healthy"},{"at":"2026-10-19T20:03:52.903135+00:00","status":"healthy"},{"at":"2026-10-16T17:03:53.028742+00:00","status":"healthy"}]},{"endpoint_name":"get_comment_replies","status":"healthy","last_checked_at":"2026-10-27T13:03:53.163937+00:00","last_verified_at":"2026-10-27T13:03:53.163937+00:00","recent_runs":[{"at":"2026-10-27T13:03:53.163937+00:00","status":"healthy"},{"at":"2026-10-26T19:04:25.340241+00:00","status":"healthy"},{"at":"2026-10-20T19:02:26.063228+00:00","status":"healthy"},{"at":"2026-10-19T20:03:52.903135+00:00","status":"healthy"},{"at":"2026-10-16T17:03:53.028742+00:00","status":"healthy"}]},{"endpoint_name":"get_user_reposts","status":"healthy","last_checked_at":"2026-10-27T13:03:53.163937+00:00","last_verified_at":"2026-10-27T13:03:53.163937+00:00","recent_runs":[{"at":"2026-10-27T13:03:53.163937+00:00","status":"healthy"},{"at":"2026-10-26T19:04:25.340241+00:00","status":"healthy"},{"at":"2026-10-20T19:02:26.063228+00:00","status":"healthy"},{"at":"2026-10-19T20:03:52.903135+00:00","status":"healthy"},{"at":"2026-10-16T17:03:53.028742+00:00","status":"healthy"}]},{"endpoint_name":"get_creator_engagement","status":"healthy","last_checked_at":"2026-10-27T13:03:53.163937+00:00","last_verified_at":"2026-10-27T13:03:53.163937+00:00","recent_runs":[{"at":"2026-10-27T13:03:53.163937+00:00","status":"healthy"},{"at":"2026-10-26T19:04:25.340241+00:00","status":"healthy"},{"at":"2026-10-20T19:02:26.063228+00:00","status":"healthy"},{"at":"2026-10-19T20:03:52.903135+00:00","status":"healthy"},{"at":"2026-10-16T17:03:53.028742+00:00","status":"healthy"}]},{"endpoint_name":"get_comments","status":"healthy","last_checked_at":"2026-10-27T13:03:53.163937+00:00","last_verified_at":"2026-10-27T13:03:53.163937+00:00","recent_runs":[{"at":"2026-10-27T13:03:53.163937+00:00","status":"healthy"},{"at":"2026-10-26T19:04:25.340241+00:00","status":"healthy"},{"at":"2026-10-20T19:02:26.063228+00:00","status":"healthy"},{"at":"2026-10-19T20:03:52.903135+00:00","status":"healthy"},{"at":"2026-10-16T17:03:53.028742+00:00","status":"healthy"}]},{"endpoint_name":"search_by_hashtag","status":"healthy","last_checked_at":"2026-10-27T13:03:53.163937+00:00","last_verified_at":"2026-10-27T13:03:53.163937+00:00","recent_runs":[{"at":"2026-10-27T13:03:53.163937+00:00","status":"healthy"},{"at":"2026-10-26T19:04:25.340241+00:00","status":"healthy"},{"at":"2026-10-20T19:02:26.063228+00:00","status":"healthy"},{"at":"2026-10-19T20:03:52.903135+00:00","status":"healthy"},{"at":"2026-10-16T17:03:53.028742+00:00","status":"healthy"}]},{"endpoint_name":"get_user_videos","status":"healthy","last_checked_at":"2026-10-27T13:03:53.163937+00:00","last_verified_at":"2026-10-27T13:03:53.163937+00:00","recent_runs":[{"at":"2026-10-27T13:03:53.163937+00:00","status":"healthy"},{"at":"2026-10-26T19:04:25.340241+00:00","status":"healthy"},{"at":"2026-10-20T19:02:26.063228+00:00","status":"healthy"},{"at":"2026-10-19T20:03:52.903135+00:00","status":"healthy"},{"at":"2026-10-16T17:03:53.028742+00:00","status":"healthy"}]}],"sdk_usage_example":null,"sdk_delivery_state":"absent","summary":"Get TikTok video details (caption, media URL, stats), comments, profiles, a creator's latest videos and reposted videos, and hashtag videos for any public account","updated_at":"2026-09-15T08:15:05.953893+00:00","user_variants":[],"latest_version":18,"user_status":null,"user_scraper_id":null,"contributes_to_marketplace":true,"pinned_version":null,"seo_content":{"faqs":[{"a":"Yes. TikTok offers the TikTok for Developers platform at https://developers.tiktok.com, which includes a Research API for academic use and a Content Posting API for authorized partners. Both require an approved application and have significant access restrictions that limit what public data is available without a review process.","q":"Does TikTok have an official developer API?"},{"a":"The endpoint exposes the creator's most recent public video set — typically 10 to 13 videos, pinned posts included — and returns them newest first. The `total_available` field shows how many are in that accessible set. Full historical pagination beyond this recent window is not available. If you need a creator's older posts, you can fork this API on Parse and revise it to add an endpoint targeting a different data source.","q":"How many videos does `get_user_videos` actually return, and can I paginate back through a creator's full history?"},{"a":"It returns videos from TikTok's public hashtag embed playlist — a curated, fixed set of roughly 10 videos per hashtag. This is not a live ranked or trending feed. The `date_filter` parameter can narrow results to approximate creation windows, but the underlying pool of videos is fixed by TikTok's embed playlist, not a real-time search index.","q":"What does `search_by_hashtag` actually return, and is it a live trending feed?"},{"a":"Not currently. `get_profile_details` returns `followers`, total `likes`, `bio`, `avatar`, `bio_link`, and `verified` status. TikTok's public profile page only publishes followers, following, and likes at the page level, but following is not currently surfaced in the response. You can fork this API on Parse and revise it to add that field.","q":"Does the API return a creator's `following` count from their profile?"},{"a":"It is a boolean returned by both `get_comments` and `get_comment_replies` that flags whether the video's creator has liked that specific comment. This is distinct from the comment's own `likes` count, which reflects likes from any user. The field maps directly to TikTok's creator-heart feature visible on the public video page.","q":"What does the `is_liked_by_creator` field on comments indicate?"}],"keywords":["tiktok video api","tiktok comments api","tiktok profile data api","tiktok engagement rate api","tiktok hashtag videos api","tiktok user reposts api","tiktok video stats likes plays","tiktok creator recent videos api","tiktok public data json","tiktok video metadata api","tiktok follower count api","tiktok comment replies api","tiktok influencer analytics api","social media data api tiktok"],"use_cases":["Monitor engagement stats (likes, plays, shares) on a brand's TikTok posts over time using `get_post_details`","Aggregate and analyze comment sentiment for a video using `get_comments` with cursor-based pagination","Compare engagement rates across creators for influencer vetting using `get_creator_engagement`","Track which videos a public account has reposted using `get_user_reposts` to map content affinities","Pull a creator's most recent 10–13 videos with pinned status for a content calendar tool using `get_user_videos`","Sample hashtag video feeds for trend research using `search_by_hashtag` with the `date_filter` parameter","Build a public TikTok profile directory with follower counts, bios, and verification status from `get_profile_details`"],"meta_title":"TikTok API – Videos, Comments & Profiles","generated_at":"2026-09-15T07:00:33.386691+00:00","lead_paragraph":"This API exposes 8 endpoints covering TikTok public data: video metadata, comments with pagination, comment replies, user profiles, a creator's recent videos, reposted videos, hashtag video feeds, and computed engagement rates. The `get_post_details` endpoint returns a full Video resource including caption, signed cover URL, music metadata, and engagement stats (likes, shares, comments, plays, saves). All endpoints accept plain TikTok usernames or video URLs and return structured JSON.","schema_version":2,"meta_description":"Fetch TikTok video details, comments, user profiles, hashtag feeds, reposts, and engagement rates for any public account via 8 structured endpoints.","primary_category":"social_media","long_description_md":"## Video and Comment Data\n\n`get_post_details` takes a full TikTok video URL in the format `https://www.tiktok.com/@username/video/VIDEO_ID` and returns the video's `caption`, `duration`, `width`/`height`, `format`, a signed `cover` image URL, nested `music` object (id, title, author), nested `author` object (uid, unique_id, nickname, avatar, verified), and a `stats` block with `likes`, `shares`, `comments`, `plays`, `saves`, and `reposts` (integer or null when TikTok omits it). `get_comments` accepts either a video URL or numeric video ID, pages up to 50 comments per request via an integer `cursor`, and returns each comment's `text`, `create_time`, `likes`, `reply_count`, `is_liked_by_creator` flag, and a nested `user` object. `get_comment_replies` mirrors that interface but requires an additional `comment_id` parameter taken from a `get_comments` result, and each reply also carries `reply_to_comment_id`.\n\n## Profile and Creator Feed Data\n\n`get_profile_details` resolves a username (leading `@` stripped) to `uid`, `nickname`, `bio`, `avatar`, `bio_link`, `followers`, `likes`, `verified`, and `private` boolean. Note that TikTok's public profile page reports only followers, following, and likes counts — a `following` count is not currently surfaced. `get_user_videos` returns the creator's most recent public videos (roughly 10–13, including pinned) with `id`, `post_url`, `caption`, `create_time`, `is_pinned`, cover, and stats. Setting `include_profile_count` to `true` triggers an extra profile load that fills `profile_video_count`. Full historical pagination beyond that recent set is not available. `get_user_reposts` lists videos a user has reposted from their public Reposts tab; each row points at the original creator via `post_url` and `author`, not the queried user.\n\n## Hashtag Feed and Engagement Metrics\n\n`search_by_hashtag` returns videos from a hashtag's public embed playlist — a curated, fixed set of roughly 10 videos per hashtag. The `hashtag` parameter strips a leading `#` automatically, and an optional `date_filter` value of `'yesterday'` narrows results by approximate creation time derived from video IDs. This is not a live trending-feed search; it reflects TikTok's curated embed playlist only. `get_creator_engagement` computes engagement rate from the same recent-video set as `get_user_videos`, averaged over 1–15 videos (`sample_size`). The response includes `engagement_rate` as a decimal fraction, plus `avg_likes`, `avg_plays`, `avg_comments`, and `avg_shares`. Passing `include_videos: true` adds a `videos` array with per-video breakdowns.","generated_with_model":"global.anthropic.claude-sonnet-4-6","secondary_categories":["streaming_video","entertainment"]},"primary_category":"social_media","secondary_categories":["streaming_video","entertainment"],"access_requirements":[]}