TikTok Scraper
Pricing
from $1.00 / 1,000 result scrapeds
TikTok Scraper
TikTok posts without an API key: views, likes, comments, shares, saves, caption, hashtags, sound and author. Optional MP4, cover, avatar and subtitle downloads, since TikTok's own links expire. Works from post URLs, hashtags and related videos. Example: hashtag 'cooking', 20 videos.
Pricing
from $1.00 / 1,000 result scrapeds
Rating
0.0
(0)
Developer
Badr Bouargan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
TikTok Scraper – Posts, Hashtags, Profiles & Stats

Extract TikTok posts with no API key and no account: views, likes, comments, shares, saves, the caption and its hashtags, the sound behind the video, the author and their follower count, plus the video file itself if you want it. Read any post you already have a link to, follow a hashtag, or pull the figures of a profile.
What you can do with it
- Measure a hashtag: the posts published under it, their views and engagement, and how often the whole hashtag has been watched.
- Track creators: followers, total likes, number of videos and bio for a list of accounts, run on a schedule to build a history.
- Study posts you already know: paste a list of links and get every figure TikTok shows, plus a few it does not display.
- Build a sound report: which track a post uses, whether it is original, and who published it.
- Archive content: download the MP4, the cover image, the author's avatar and the subtitles, because TikTok's own media links expire within days.
- Widen a sample: from one post, collect the fifteen or so videos TikTok recommends next to it.
What this Actor can and cannot read — please read this first
TikTok is the strictest site of its kind, and the honest picture matters more than a long feature list. Everything below was measured against the live site, not assumed.
| What you want | Does it work? | How |
|---|---|---|
| Every figure of a post you have the link to | Yes, always | One plain request to the post's page |
| The figures of a hashtag (views, ID) | Yes | TikTok's own hashtag endpoint |
| The posts published under a hashtag | Yes | A real browser loads the hashtag page |
| The figures of a profile (followers, likes, bio, videos) | Yes, always | One plain request to the profile page |
| Videos recommended next to a post | Yes | A real browser loads the post and starts it playing |
| The list of a profile's own videos | Residential addresses only | TikTok answers this one request with an empty body from every datacenter address tested |
| Keyword search | No, deliberately | TikTok's robots.txt disallows /search to every crawler. Hashtags cover the same ground and are allowed |
| Comments, followers and following lists | No | TikTok serves these to signed-in sessions only |
The one limit worth planning around is the profile feed. It was tested from four different datacenter addresses, several times each, loading the page directly and by clicking through from a post like a visitor would: TikTok replies HTTP 200 with a body of zero bytes every single time. The account's own figures — followers, likes, bio, number of videos — are in the page itself and always come back.
So when a profile feed comes back empty, the Actor saves a row with the code PROFILE_FEED_UNAVAILABLE, and it does not retry: retrying costs you money and changes nothing. It says so in the run log too. Nothing is ever silently dropped.
Why this Actor
- No API key, no account, no cookies to paste. It reads what TikTok serves to any visitor.
- No forged signatures. TikTok signs the calls behind its video lists. Instead of faking those signatures — which breaks every few weeks — a real browser loads the page and the Actor reads the answers TikTok's own code receives. That is why it keeps working.
- It retries from another address. TikTok accepts some addresses and quietly refuses others. A page that comes back empty is tried again from somewhere else, up to three times, before it is reported as a failure.
- Failures become rows. Every input that could not be read is saved with an error code, so a spreadsheet tells you what is missing instead of hiding it.
- The cheap path stays cheap. Post URLs, hashtag figures and profile figures never start a browser.
Example output

How it works
- Post URLs are read one by one from their own page, which carries every field inside it.
- Hashtags and profiles get their counters the same cheap way.
- If you asked for video lists, Chromium opens the hashtag, profile or post page, scrolls it, and the Actor keeps the posts TikTok loads into it. On a post page it also starts the video playing, because TikTok only asks for its recommendations once the post is running.
- Posts are de-duplicated on their ID, filtered on date and popularity, and saved.
- If you asked for files, each post is re-read over the session that will download them — TikTok signs its media links for one session only.
Step-by-step tutorial
- Paste a few links in Post URLs, or type a hashtag in Hashtags, or an account in Profiles. Any combination works.
- Set Videos per hashtag or profile — 20 is a sensible first run.
- Optional: Published after (
2026-01-01, or a phrase such as7 days), Minimum views, Minimum likes. - Optional: switch on the files you want under Files to download.
- Leave the proxy on Apify Proxy. If you want a profile's video list or related videos, open the proxy settings and pick the RESIDENTIAL group.
- Press Start, then export as JSON, CSV, Excel or HTML.
Input example
{"postURLs": ["https://www.tiktok.com/@khaby.lame/video/7425321081298341152"],"hashtags": ["cooking", "parisfrance"],"profiles": ["nasa"],"resultsPerPage": 20,"scrapeRelatedVideos": false,"oldestPostDate": "90 days","minPlayCount": 10000,"shouldDownloadCovers": true}
Output example
One post, shortened:
{"id": "7425321081298341152","text": "Bring it on #learnfromkhaby #comedy","textLanguage": "en","createTimeISO": "2024-10-13T17:58:13.000Z","playCount": 21100000,"diggCount": 859900,"commentCount": 7304,"shareCount": 21700,"collectCount": 43045,"repostCount": 0,"isAd": false,"isSlideshow": false,"locationCreated": "US","hashtags": [{ "id": "1697657584273413", "name": "learnfromkhaby" },{ "id": "1606334392378370", "name": "comedy" }],"authorMeta": {"id": "127905465618821121","name": "khaby.lame","nickName": "Khabane lame","verified": true,"fans": 163000000,"heart": 2700000000,"video": 1353,"profileUrl": "https://www.tiktok.com/@khaby.lame"},"musicMeta": {"musicId": "7425321107177491233","musicName": "original sound","musicAuthor": "Khabane lame","musicOriginal": true,"duration": 21},"videoMeta": {"height": 1024,"width": 576,"duration": 21,"definition": "540p","format": "mp4","coverUrl": "https://p16-common-sign.tiktokcdn-us.com/…","subtitleLinks": []},"webVideoUrl": "https://www.tiktok.com/@khaby.lame/video/7425321081298341152","input": "https://www.tiktok.com/@khaby.lame/video/7425321081298341152"}
Output fields
A post
| Field | What it holds |
|---|---|
id, webVideoUrl | The post's ID and its address |
text, textLanguage | The caption and the language TikTok detected |
createTime, createTimeISO | Publication date, as a timestamp and as a readable date |
playCount, diggCount, commentCount, shareCount, collectCount, repostCount | Views, likes, comments, shares, saves, reposts |
hashtags, mentions | Hashtags with their IDs, and the accounts mentioned |
authorMeta | The author: handle, display name, verification, bio, followers, total likes, number of videos, avatar, profile URL |
musicMeta | The sound: title, author, whether it is original, duration, cover, play URL |
videoMeta | Dimensions, duration, quality, codec, cover images, download address, subtitle tracks |
isAd, isSponsored, isSlideshow, isPinned, isAigc | What kind of post it is |
duetEnabled, stitchEnabled, commentsTurnedOff | What the author allows |
labels, effectStickers, locationCreated | Topic labels, effects used, and the country TikTok attaches to the post |
slideshowImages | The images of a photo post |
videoUrl, coverUrl, avatarUrl, musicCoverUrl, subtitleUrls | Where the files were saved, when downloading is switched on |
input, searchHashtag, searchProfile, relatedTo | Which of your inputs produced this row |
locationCreated is only present on posts read from their own URL; TikTok leaves it out of the lists it serves to a hashtag page.
A hashtag
id, name, viewCount, hashtagUrl. TikTok stopped publishing a video count on this endpoint, so the field is left empty rather than filled with a zero.
A profile
id, name, nickName, verified, privateAccount, signature, avatar, fans, following, heart, video, friends, profileUrl.
Error codes
| Code | What happened |
|---|---|
INVALID_INPUT | The line is not a TikTok post URL or ID |
POST_NOT_FOUND_OR_PRIVATE | The post is gone, private, or blocked in the region the request came from |
POST_SENSITIVE | TikTok marks the post as age-restricted |
NOT_FOUND | No account or hashtag by that name, after several attempts from different addresses |
PROFILE_FEED_UNAVAILABLE | TikTok returned an empty video list for the profile. Switch to the RESIDENTIAL proxy group |
RELATED_UNAVAILABLE | TikTok recommended nothing next to the post, from any address tried |
FEED_UNAVAILABLE | A video list came back empty from every address tried |
BLOCKED | TikTok refused the page from every address tried |
RATE_LIMITED | TikTok served an empty shell instead of the page |
MEDIA_UNAVAILABLE | A file could not be downloaded — usually an expired link |
BROWSER_UNAVAILABLE | Chromium could not start in the container |
Proxy
Keep Apify Proxy on. The datacenter group is enough for everything except one thing: post URLs, hashtag figures, hashtag videos, related videos and profile figures all work on it.
Only a profile's own video list needs the RESIDENTIAL group. The Actor notices which group you picked: without a residential one it tries each profile feed once and reports the result, instead of billing you for retries that cannot succeed.
Speed and cost
Measured on real runs, at the default 2 GB of memory:
| Run | Rows | Time | Platform cost |
|---|---|---|---|
| 2 hashtags + 1 profile, 20 videos each | 19 | 1 min 53 s | $0.014 |
| 2 post URLs + their related videos | 17 | 2 min 20 s | $0.017 |
| 3 post URLs + 2 profiles, no browser, 1 GB | 5 | 1 min 25 s | $0.005 |
That is $0.70 to $1.30 of platform usage per 1,000 rows, and it gets cheaper as runs grow: opening the browser is a fixed cost paid once, so twenty hashtags cost barely more than two. Downloading video files is the expensive option — TikTok serves MP4s slowly, roughly five minutes for a single one.
Frequently asked questions
Do I need a TikTok account or an API key? No. Nothing to create, nothing to paste.
Why is there no keyword search?
TikTok's robots.txt tells every crawler not to visit /search, /search/video and /search/user. This Actor respects that. Hashtags are explicitly allowed and reach the same content.
Why did a profile return its followers but no videos?
TikTok answers the profile's video-list request with an empty body unless the request comes from a residential address — tested from four datacenter addresses, always zero bytes. Pick the RESIDENTIAL proxy group and run it again. The row with the code PROFILE_FEED_UNAVAILABLE tells you exactly that, and the Actor does not waste your credit retrying.
Is there a way to follow a creator without a residential proxy? Yes, indirectly. Post URLs always work, so a list of links gives you every figure. And the videos recommended next to one of that creator's posts often include more of their work — switch on Collect videos related to each post URL.
Can I get the comments? No. TikTok serves comments to signed-in sessions only, and this Actor does not ask you for an account.
Why are the downloaded files stored instead of just linked? TikTok signs its media links for one session and expires them within days. A link saved in a spreadsheet stops working; a downloaded file does not.
Can I run it on a schedule? Yes. Followers, views and likes change every day, so a daily run on the same hashtags or accounts builds a history you can chart.
Legal note
This Actor reads only what TikTok publishes to anyone, and it follows TikTok's robots.txt. It collects no private data and never signs in. Figures about people — follower counts, captions, handles — are personal data in some jurisdictions: have a lawful basis before you store them, and check TikTok's terms for your own use case.