TikTok Profile Scraper - Videos & New Post Monitor avatar

TikTok Profile Scraper - Videos & New Post Monitor

Pricing

from $2.92 / 1,000 video returneds

Go to Apify Store
TikTok Profile Scraper - Videos & New Post Monitor

TikTok Profile Scraper - Videos & New Post Monitor

Export every video a TikTok account posted: caption, post time, views, likes, comments, shares, saves, duration, sound, hashtags, pinned and photo posts, with a date range. Monitoring mode returns only videos posted since the last run. Unofficial. Public data only.

Pricing

from $2.92 / 1,000 video returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

2

Monthly active users

18 days ago

Last modified

Share

Export the videos a TikTok account has posted, newest first: the video URL and id, the caption, the time it was posted, the view, like, comment, share and save counts, the length, the sound, the hashtags and mentions, plus whether it is a photo post, whether it is pinned, TikTok's isAd flag and the tagged place. Set a date range to export one period only.

Turn on monitoring mode, schedule the Actor, and each run returns only the videos posted since the last run, so you pay for new posts instead of the whole profile every time. Accounts that do not exist and private accounts come back as free rows that say so.

Unofficial. Public data only. This Actor is not affiliated with TikTok. It reads the videos TikTok shows to any visitor of a public profile without logging in, and it does not read private accounts, direct messages or anything behind a login.

What you can use it for

  • Competitor and creator tracking: schedule monitoring mode on a list of accounts and get each new post with its first view and like counts every hour or day.
  • Influencer vetting: export a creator's last 100 or 1,000 videos with views, likes, comments, shares and saves to see how their posts actually perform.
  • Content research: collect captions, hashtags, sounds and post times of a niche's accounts for a spreadsheet, a database or an AI pipeline.
  • Campaign reporting: export the videos an account posted inside a campaign's dates with postedAfter and postedBefore.

How it works

  1. Give usernames (nasa, @nasa), profile URLs (https://www.tiktok.com/@nasa) or secUids (MS4wLjABAAAA...).
  2. For a username, the Actor opens the public profile page once to find the account's secUid, its video count and whether it is private.
  3. It then reads the account's public video list (https://www.tiktok.com/api/creator/item_list/, 15 videos per page, newest first) page by page and returns each video once. Only videos that TikTok labels with the account you asked for are returned.
  4. Accounts that do not exist, private accounts, verification pages and invalid input get a free row that says why.

Input

FieldDefaultWhat it does
profilesexample accountUsernames, profile URLs or secUids, one per line (commas and spaces also separate entries). A video URL of the account works too. A repeated account is read and charged once; the repeat gets a free duplicate row. Short links (vm.tiktok.com) are not followed. Up to 200 accounts per run.
maxVideosPerProfile100With monitoring off, stop an account after this many videos, newest first. In monitoring mode it limits only the first check of an account. Up to 10,000.
postedAfternoneOnly videos posted on or after this date (2026-09-01, read as 00:00 UTC), time (2026-09-01T12:00:00Z) or number of days back (30 days). Older videos are not returned or charged; reading an account stops once it reaches videos 3 days older than this.
postedBeforenoneOnly videos posted before this date or time. Reading starts there, so an older period can be exported without paying for newer videos. Not available in monitoring mode.
monitoringModefalseReturn only videos posted since the last run of each account.
resetMonitoringStatefalseForget everything remembered and start again with a first check. Turn it off again after one run.
useProxytrueRetry a page through a US proxy only if TikTok answers it with a rate limit or an empty response.
{
"profiles": [
"nasa",
"https://www.tiktok.com/@duolingo"
],
"maxVideosPerProfile": 50,
"monitoringMode": true
}

If you leave profiles out of the input with monitoring off, the example account in the input form is read (its URL appears in inputProfile and the run log says so). In monitoring mode profiles is required, so a schedule never pays to watch the example. An empty list is rejected with a free invalid-input row.

Output

One row per video or photo post. This row was read from Apify on 2026-09-29 (UTC):

{
"status": "ok",
"inputProfile": "duolingo",
"username": "duolingo",
"usernameMatchesInput": true,
"authorId": "6917704832925746181",
"authorSecUid": "MS4wLjABAAAAxzJGbseZk0TDBgT88nlMt8s4rjFp-Um-B7X545vT-MaVZiZEWVyKmaVwqxntcGgn",
"authorNickname": "Duolingo",
"authorVerified": true,
"profileVideoCount": 1187,
"profileFollowerCount": 18158622,
"videoId": "7690680991387553038",
"videoUrl": "https://www.tiktok.com/@duolingo/video/7690680991387553038",
"postType": "video",
"description": "i wish i were a bird 🎨: @brerbo",
"language": "en",
"createdAt": "2026-09-28T20:10:30.000Z",
"createTime": 1790626230,
"playCount": 361200,
"likeCount": 76600,
"commentCount": 1191,
"shareCount": 11000,
"saveCount": 10437,
"durationSeconds": 21,
"videoWidth": 720,
"videoHeight": 1280,
"imageCount": null,
"photoTitle": null,
"coverUrl": "https://p19-common-sign.tiktokcdn-us.com/...",
"musicId": "6642970913400687366",
"musicTitle": "sonido original",
"musicAuthor": "Armando Vialpando",
"musicIsOriginal": true,
"hashtags": [],
"mentions": [
"brerbo_"
],
"isPinned": false,
"isAd": false,
"locationName": null,
"locationAddress": null,
"locationCity": null,
"isFirstCheck": null,
"isNew": null
}

Every row also has source and scrapedAt. Notes on the columns:

  • The counts are the ones TikTok shows, and TikTok rounds large ones: a view count of 8,700,000 is TikTok's rounded figure, not an exact count. saveCount comes from TikTok's second set of counts, which is less rounded (10,845 where the first set says 10,800).
  • postType is photo for photo posts (slideshows): they have imageCount and photoTitle, and durationSeconds, videoWidth and videoHeight are null (TikTok reports a length of 0 for them). Some old videos have no length either: on 2026-09-29, 164 of @scout2015's videos from 2016 to 2018 came without a length (99 of them also without width and height), so those are null too.
  • profileVideoCount and profileFollowerCount are the account's counts from its profile page, repeated on each row. They are null when you gave a secUid, because the profile page is then not opened. profileVideoCount is TikTok's unrounded figure but can differ from the number of videos listed (see below).
  • isAd is TikTok's own isAd flag on the post, returned as it is. TikTok does not document it; on the posts checked it matched TikTok's ad-authorization flag, so it does not prove that the post ran as a paid ad.
  • isPinned is true for posts the creator pinned to the profile.
  • hashtags and mentions come from the tags TikTok attaches to the caption. mentions holds the usernames, which can differ from the name written in the caption.
  • coverUrl is a signed TikTok image link that expires after a few days; download the image if you need to keep it.
  • usernameMatchesInput is false when TikTok answers with a different username than the one you gave (for example after a rename).
  • isFirstCheck and isNew are filled only in monitoring mode (see below).

How many videos you get

The list reaches back to an account's first post. On 2026-09-29, reading whole accounts from Apify returned 1,187 videos for @duolingo (the profile showed 1,187), 3,113 for @scout2015 (the profile showed 3,071) and 49 for @nasa (the profile showed 49), with no repeats; the 4,300 rows of @duolingo and @scout2015 took 282 seconds. profileVideoCount is on every row so you can compare. Photo posts are included (210 of @duolingo's 1,187).

TikTok lists the videos newest first, but not strictly: in the same read, 5 of @scout2015's 3,113 videos were listed after older ones, by up to 12.5 days (this looks like posts scheduled in advance), and none of @duolingo's. So postedAfter and monitoring mode keep reading until they reach videos 3 days older than their boundary; a video listed more than 3 days out of place can still be missed there.

Rows that are never charged

StatusMeaning
no-such-profileTikTok returned no profile for the username (code 10221). TikTok gives the same answer for a name that never existed, one that was changed and one that is no longer available; the row does not claim which.
private-accountThe account is private, so its videos were not requested.
list-refusedTikTok refused the video list (code 10201). It gives the same answer for a secUid that does not exist and for a malformed request.
no-videos-listedTikTok's video list for the account is empty (the row adds the profile's video count).
no-videos-in-date-rangeThe account has videos, but none inside postedAfter / postedBefore.
verification-pageTikTok answered with a verification page (a check that the visitor is a person). The Actor does not try to get past it and does not retry; the run stops there.
blockedTikTok refused the request (HTTP 403, not retried) or kept answering with a rate limit or an empty response after retrying.
unreadableThe page could not be read (tiktokStatusCode has TikTok's code when it gave one).
stopped-readingReading an account stopped part way (a later page could not be read). The rows returned before that are complete.
max-videos-reachedThe account reached maxVideosPerProfile videos.
invalid-inputThe entry is not a username, profile URL or secUid, it is a short link, or a date could not be read.
duplicateThe same account appeared earlier in the list.
no-new-videosMonitoring mode: no new videos on the accounts checked.
budget-reachedThe run's maximum total charge had no room for more rows (the row says how many videos or accounts were left out, or that TikTok lists more videos that were not read).
not-checkedMore than 200 accounts were given, or the run stopped at a verification page before reaching them.

Pricing

  • $4.00 per 1,000 videos returned, charged only for rows with status: "ok".
  • In monitoring mode, also $0.30 per 1,000 account checks: every account checked costs one check, whether or not it has new videos. Example: 100 accounts checked every hour is 72,000 checks a month, which is $21.60, plus $4.00 per 1,000 new videos returned.

The Actor reads only as many pages as the run's maximum total charge can pay for (in monitoring mode, an account check and a video row each), and a free row says what was left out.

Monitoring mode

  • The first run of an account returns up to maxVideosPerProfile of its newest videos with isFirstCheck: true and remembers the time of that check.
  • Later runs read the account's list from the newest video down to 3 days before the previous check and return only videos posted after it that were not returned before, with isNew: true. They are not cut by maxVideosPerProfile. A check of an account that posts a few videos a day reads one page (15 videos); on 2026-09-29 a second check of @nasa and @duolingo read one page each.
  • To catch videos that appear in TikTok's list a little late, the boundary is placed 6 hours before each check, and videos already returned inside that window are remembered so they are not returned twice.
  • If a run stops part way (for example at the maximum total charge), the boundary does not move, so videos that were not reached are returned by the next run.
  • Videos posted before the first check and not returned by it (beyond maxVideosPerProfile) are never returned by later checks.
  • The memory is kept per account (by its secUid, so a renamed account keeps its memory), not per list. Do not put the same account in two schedules that can run at the same time: Apify's key-value store has no atomic update, so two runs of the same account finishing together can overwrite each other.
  • If Apify restarts or moves a run, it continues after the accounts it had already finished, and a video already in the run's dataset is not returned or charged again.

Limits

  • Up to 200 accounts per run and 10,000 videos per account, read one page (15 videos) at a time with a short pause between requests.
  • The Actor does not download video files, does not read comments and does not search TikTok; give it the accounts.
  • It does not follow short links (vm.tiktok.com); open one in a browser and paste the profile URL.