
Instagram Reel Scraper
scrape.ly/store/echofield/instagram-reel-scraperSocial mediaVideos
1 monthly user

Scrape public TikTok videos from profiles, hashtags, video URLs, and keyword search, plus comments. Get captions, play, like, share, and comment counts, music, and author details.
Turn public TikTok profiles, hashtags, video URLs, and keyword searches into a dataset you can schedule and export.
For social listening, creator research, and catalog work that has to finish even when one account is private or one link is dead.
ftyp, JPEG, or WEBVTT.proxyCountryCode when the audience is in one market.OUTPUT record (failedInputs). The rest of the input still runs, and no placeholder rows land in your dataset.0 stays 0.videoMeta is not treated as a downloaded file. The store gets a file only after the magic-byte check.{
"hashtags": [
"fyp"
],
"resultsPerPage": 100
}
One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.
{
"id": "7600000000000000000",
"text": "#tiktok #sシ゚viral #tvshow #edit #foryou ",
"textLanguage": "un",
"createTime": 1773414677,
"createTimeISO": "2026-03-13T15:11:17.000Z",
"webVideoUrl": "https://www.tiktok.com/@example_creator/video/7600000000000000000",
"isAd": false,
"authorMeta": {
"id": "7000000000000000000",
"name": "example_creator",
"profileUrl": "https://www.tiktok.com/@example_creator",
"verified": false,
"privateAccount": false,
"nickName": "fyp",
"avatar": "https://p16-common-sign.tiktokcdn.com/…",
"following": 44,
"fans": 580200,
"video": 594,
"heart": 6900000,
"digg": 139,
"friends": 0,
"originalAvatarUrl": "https://p16-common-sign.tiktokcdn.com/…"
},
"musicMeta": {
"musicName": "original sound",
"musicAuthor": "fyp",
"playUrl": "https://v58.tiktokcdn.com/…",
"coverMediumUrl": "https://p16-common-sign.tiktokcdn.com/…",
"musicOriginal": true,
"musicId": "7600000000000000001",
"originalCoverMediumUrl": "https://p16-common-sign.tiktokcdn.com/…"
},
"videoMeta": {
"height": 1280,
"width": 720,
"duration": 500,
"coverUrl": "https://p16-common-sign.tiktokcdn.com/…",
"originalCoverUrl": "https://p16-common-sign.tiktokcdn.com/…",
"definition": "720p",
"format": "mp4",
"subtitleLinks": [
{
"language": "…",
"downloadLink": "…",
"tiktokLink": "…"
},
{
"language": "…",
"downloadLink": "…",
"tiktokLink": "…"
}
],
"downloadAddr": "https://v16-webapp-prime.tiktok.com/video/…"
},
"mediaUrls": [
"https://v16-webapp-prime.tiktok.com/video/…",
"https://v16-webapp-prime.tiktok.com/video/…"
],
"diggCount": 259900,
"shareCount": 3034,
"playCount": 7000000,
"commentCount": 1869,
"collectCount": 26000,
"repostCount": 0,
"hashtags": [
{
"id": "23428",
"name": "tiktok",
"title": "tiktok"
},
{
"id": "7084597372034121755",
"name": "sシ゚viral",
"title": "sシ゚viral"
}
],
"effectStickers": [
{
"ID": "337296253",
"name": "Light foundation",
"stickerStats": {
"useCount": "…"
}
},
{
"ID": "263840",
"name": "Green Screen",
"stickerStats": {
"useCount": "…"
}
}
],
"isSlideshow": false,
"input": "fyp",
"isStory": false,
"searchHashtag": {
"name": "fyp",
"views": 129765185180711
}
}
Give at least one of profiles, hashtags, postURLs, or searchQueries. resultsPerPage caps each of those.
Profiles: profileScrapeSections (videos or reposts), profileSorting (latest or popular), excludePinnedPosts, oldestPostDateUnified, newestPostDate, mostDiggs, leastDiggs, maxFollowersPerProfile, maxFollowingPerProfile.
Hashtags and posts: scrapeAdditionalAuthorMeta refetches author fields the list left out. scrapeRelatedVideos adds related items for a direct URL.
Search: searchSection empty for top results or /video for video results, plus videoSearchSorting and videoSearchDateFilter (TikTok's logged-out search ignores both, so the actor applies them itself: the date filter drops older videos and sorting re-orders up to 3x your limit of matching videos).
Comments: commentsPerPost, topLevelCommentsPerPost, maxRepliesPerComment.
Downloads: shouldDownloadVideos, shouldDownloadCovers, shouldDownloadSlideshowImages, shouldDownloadAvatars, shouldDownloadMusicCovers, videoKvStoreIdOrName, and downloadSubtitlesOptions set to DOWNLOAD_SUBTITLES.
proxyCountryCode selects the residential country; with None keyword searches run from Canada so repeated runs see the same ranking, and other inputs use any residential exit. aiVideoDescription and aiVideoSummary are on the form, and this actor does not emit them. TikTok's payload does not include those texts.
A video item includes a field only when TikTok sent it: id, text, textLanguage, createTime, createTimeISO, webVideoUrl, isAd, isSlideshow, isStory, authorMeta, musicMeta, videoMeta (including downloadAddr and subtitleLinks), mediaUrls, diggCount, shareCount, playCount, commentCount, collectCount, repostCount, hashtags, effectStickers, locationMeta, comments, commentsDatasetUrl, input, searchHashtag, and searchQuery.
authorMeta can include id, name, nickName, profileUrl, verified, signature, bioLink, fans, following, video, avatar, privateAccount, and ttSeller. Follower and following rows use connectionType follower or following and are stored in their own dataset.
A failed target does not create a dataset row. It is listed in the run's OUTPUT key-value record as failedInputs: [{input, reason, code, url}] and summarised in the status message. reason is a short text such as a private profile or a missing post; it does not include a response body.
Pay per event, plus platform usage (compute and residential proxy traffic):
oldestPostDateUnified, newestPostDate or videoSearchDateFilter filters the results.leastDiggs or mostDiggs filters the results.Failed inputs (private profiles, dead links) are never charged. Example: 1,000 results with no add-ons ≈ $3.50 in event fees plus about $0.03 of platform usage (measured: 20 hashtag videos used $0.0006). Downloaded video files add their proxy traffic (a 3 MB video used about $0.006).
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
hashtagsarrayOptionalHashtags
Scrape videos with these hashtags, without the #. Enter them one by one or paste a list with Bulk edit.
profilesarrayOptionalProfiles
TikTok usernames (without @) or user IDs to scrape videos from.
searchQueriesarrayOptionalSearch queries
Keywords to search on TikTok. Choose top results, videos or profiles in Search settings.
postURLsarrayOptionalVideo URLs
URLs of specific TikTok videos, e.g. https://www.tiktok.com/@user/video/1234567890.
resultsPerPageintegerOptionaldefault 20Max videos per hashtag, profile or search
How many videos to scrape for each hashtag, profile and search query. Also caps related videos per video URL.
Narrow down which videos are returned. Applies to hashtags and profiles unless noted.
oldestPostDateUnifiedstringOptionalVideos published after
Only videos published on or after this date. A number of days also works: 1 is today only, 2 is today and yesterday, and so on.
newestPostDatestringOptionalVideos published before
Only videos published on or before this date.
leastDiggsintegerOptionalMinimum hearts
Only videos with at least this many hearts. Ignored when a date filter is set.
mostDiggsintegerOptionalMaximum hearts
Only videos with fewer than this many hearts. Ignored when a date filter is set.
excludePinnedPostsbooleanOptionaldefault falseExclude pinned videos
Skip videos pinned to the top of a profile.
videoSearchDateFilterenumOptionaldefault "ALL_TIME"Search date range
Search queries only: how recent videos must be. Not used for profile search.
Apply to profiles only.
profileScrapeSectionsarrayOptionaldefault ["videos"]Profile sections to scrape
Which parts of each profile to scrape: its videos, reposts and active stories.
profileSortingenumOptionaldefault "latest"Profile video sorting
Latest returns the newest videos first. Popular returns the most-liked videos first; TikTok returns at most about 400-500 videos this way, and date filters don't apply to it.
maxFollowersPerProfileintegerOptionaldefault 0Followers per profile
Also scrape up to this many follower accounts of each profile into a separate dataset, linked from each video. 0 turns it off.
maxFollowingPerProfileintegerOptionaldefault 0Following per profile
Also scrape up to this many accounts each profile follows into a separate dataset, linked from each video. 0 turns it off.
Apply to search queries only.
searchSectionenumOptionaldefault ""Search section
Which TikTok search tab to use: Top, Video or Profile.
videoSearchSortingenumOptionaldefault "MOST_RELEVANT"Search sorting
How Top and Video search results are sorted. Not used for profile search.
maxProfilesPerQueryintegerOptionaldefault 10Max profiles per query
For profile search: how many profiles to scrape per query. Each profile then returns up to the videos-per-profile limit above.
Comments are added to each video and also saved to a separate dataset.
commentsPerPostintegerOptionaldefault 0Max comments per video
Comments to scrape for each video, including replies. 0 turns comments off. TikTok may return fewer for videos with many comments.
topLevelCommentsPerPostintegerOptionaldefault 0Max top-level comments per video
Limit on top-level comments (not replies) per video. 0 means no separate limit.
maxRepliesPerCommentintegerOptionaldefault 0Maximum replies per comment
Replies to scrape for each comment. 0 skips replies. TikTok doesn't always return every reply.
scrapeAdditionalAuthorMetabooleanOptionaldefault falseFull author profile data
Add the full author profile (for example account creation time) to each video from hashtags, search and video URLs. Profile scrapes already include it.
scrapeRelatedVideosbooleanOptionaldefault falseScrape related videos
For video URLs: also scrape TikTok's related videos, up to Max videos per hashtag, profile or search.
Apply to video URLs. Files are saved to the run's key-value store.
shouldDownloadVideosbooleanOptionaldefault falseDownload videos
Download each video file.
shouldDownloadCoversbooleanOptionaldefault falseDownload thumbnails
Download each video's cover image.
shouldDownloadSlideshowImagesbooleanOptionaldefault falseDownload slideshow images
Download the images of photo slideshows.
shouldDownloadAvatarsbooleanOptionaldefault falseDownload profile avatars
Download each author's profile picture.
shouldDownloadMusicCoversbooleanOptionaldefault falseDownload sound covers
Download the cover image of each video's sound.
downloadSubtitlesOptionsenumOptionaldefault "NEVER_DOWNLOAD_SUBTITLES"Subtitles
Download subtitles that are already on the video.
proxyCountryCodeenumOptionaldefault "None"Proxy country
Scrape as if browsing from this country, using a residential proxy there. None uses the default location.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | Unique identifier of the TikTok video |
| text | string | Caption text of the TikTok video |
| textLanguage | string | Detected language of the video caption |
| createTime | number | Unix timestamp when the video was created |
| createTimeISO | string | ISO 8601 formatted creation date and time |
| isMuted | boolean | Whether the video audio is muted |
| webVideoUrl | string | URL to view the video on TikTok |
| locationCreated | string | Country code where the video was created |
| isAd | boolean | Whether the video is a sponsored advertisement |
| authorMeta | object | Metadata about the video author |
| musicMeta | object | Metadata about the background music used in the video |
| videoMeta | object | Technical metadata about the video file |
| locationMeta | object | Geographic location metadata if the video is geotagged |
| mediaUrls | array | Array of media URLs associated with the video |
| slideshowImageLinks | array | Image links for slideshow-style posts |
| diggCount | number | Number of likes (hearts) the video has received |
| shareCount | number | Number of times the video has been shared |
| playCount | number | Number of times the video has been viewed |
| commentCount | number | Number of comments on the video |
| collectCount | number | Number of times the video has been saved/bookmarked |
| repostCount | number | Number of times the video has been reposted |
| mentions | array | Array of usernames mentioned in the video caption |
| detailedMentions | array | Detailed information about users mentioned in the caption |
| hashtags | array | Array of hashtags used in the video caption |
| effectStickers | array | Visual effects and stickers applied to the video |
| isSlideshow | boolean | Whether the post is a slideshow of images rather than a video |
| isPinned | boolean | Whether the video is pinned to the author's profile |
| isSponsored | boolean | Whether the video contains sponsored content |
| hasTikTokShopProduct | boolean | Whether the video has a TikTok Shop product attached. Only meaningful when present: an omitted value means we could not determine it, not that the video has no product. Search results are the case where TikTok often does not expose the signal. |
| commentsDatasetUrl | string | URL to the dataset containing comments for this video, if collected separately |
| commentsIncomplete | boolean | True when comment requests for this video kept failing after retries, so only the comments read before that are included |
| input | string | Original input value used to find this video |
| invalidUrls | array | List of invalid URLs that could not be processed |
| comments | array | Comments collected inline for this video, if comment collection was enabled |
| submittedVideoUrl | string | Original video URL from the input, useful for mapping results back to inputs |
| fromProfileSection | string | Profile section this video was scraped from |
| isStory | boolean | Whether this item was scraped as a profile's active TikTok Story, rather than a regular post |
| searchQuery | string | Search query used to find this video |
| searchHashtag | object | Hashtag used to find this video |
| searchMusic | object | Music used to find this video |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Comment | One saved comment (only when comments are requested) | $0.0008 |
| Date filter | Per result when a date filter is set and applied | $0.0008 |
| Follower or following row | One saved follower or following row (only when a follower or following cap is set) | $0.0024 |
| Popularity filter | Per result when a likes (diggs) filter is set and applied | $0.0008 |
| Result | One saved TikTok video or post row | $0.0035 |
| Video download | One video file downloaded and stored | $0.0008 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('echofield/tiktok-scraper').call({
"hashtags": [
"fyp"
],
"resultsPerPage": 20,
"maxFollowersPerProfile": 0,
"maxFollowingPerProfile": 0,
"commentsPerPost": 0,
"topLevelCommentsPerPost": 0,
"maxRepliesPerComment": 0,
"proxyCountryCode": "None"
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run echofield/tiktok-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=echofield/tiktok-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Hashtag videos with extra author profile data.
Videos from a TikTok keyword search.
Latest videos from a TikTok profile.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.