TikTok Profile Scraper - Videos & New Post Monitor
Pricing
from $2.92 / 1,000 video returneds
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
Maintained by CommunityActor stats
0
Bookmarked
13
Total users
2
Monthly active users
18 days ago
Last modified
Categories
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
postedAfterandpostedBefore.
How it works
- Give usernames (
nasa,@nasa), profile URLs (https://www.tiktok.com/@nasa) or secUids (MS4wLjABAAAA...). - 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.
- 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. - Accounts that do not exist, private accounts, verification pages and invalid input get a free row that says why.
Input
| Field | Default | What it does |
|---|---|---|
profiles | example account | Usernames, 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. |
maxVideosPerProfile | 100 | With 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. |
postedAfter | none | Only 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. |
postedBefore | none | Only 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. |
monitoringMode | false | Return only videos posted since the last run of each account. |
resetMonitoringState | false | Forget everything remembered and start again with a first check. Turn it off again after one run. |
useProxy | true | Retry 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.
saveCountcomes from TikTok's second set of counts, which is less rounded (10,845 where the first set says 10,800). postTypeisphotofor photo posts (slideshows): they haveimageCountandphotoTitle, anddurationSeconds,videoWidthandvideoHeightarenull(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 arenulltoo.profileVideoCountandprofileFollowerCountare the account's counts from its profile page, repeated on each row. They arenullwhen you gave a secUid, because the profile page is then not opened.profileVideoCountis TikTok's unrounded figure but can differ from the number of videos listed (see below).isAdis TikTok's ownisAdflag 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.isPinnedistruefor posts the creator pinned to the profile.hashtagsandmentionscome from the tags TikTok attaches to the caption.mentionsholds the usernames, which can differ from the name written in the caption.coverUrlis a signed TikTok image link that expires after a few days; download the image if you need to keep it.usernameMatchesInputisfalsewhen TikTok answers with a different username than the one you gave (for example after a rename).isFirstCheckandisNeware 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
| Status | Meaning |
|---|---|
no-such-profile | TikTok 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-account | The account is private, so its videos were not requested. |
list-refused | TikTok 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-listed | TikTok's video list for the account is empty (the row adds the profile's video count). |
no-videos-in-date-range | The account has videos, but none inside postedAfter / postedBefore. |
verification-page | TikTok 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. |
blocked | TikTok refused the request (HTTP 403, not retried) or kept answering with a rate limit or an empty response after retrying. |
unreadable | The page could not be read (tiktokStatusCode has TikTok's code when it gave one). |
stopped-reading | Reading an account stopped part way (a later page could not be read). The rows returned before that are complete. |
max-videos-reached | The account reached maxVideosPerProfile videos. |
invalid-input | The entry is not a username, profile URL or secUid, it is a short link, or a date could not be read. |
duplicate | The same account appeared earlier in the list. |
no-new-videos | Monitoring mode: no new videos on the accounts checked. |
budget-reached | The 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-checked | More 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
maxVideosPerProfileof its newest videos withisFirstCheck: trueand 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 bymaxVideosPerProfile. 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.