TikTok Profile Scraper - Videos, Views, Likes and Captions
Pricing
from $0.40 / 1,000 results
TikTok Profile Scraper - Videos, Views, Likes and Captions
TikTok profile scraper for recent videos from public profiles: video URL, caption, views, likes, comments, shares, saves, duration, music, cover and post date in clean JSON. Add direct video URLs, keep only videos newer than a date, skip pinned videos, and add an optional follower stats row.
Pricing
from $0.40 / 1,000 results
Rating
0.0
(0)
Developer
TicTech
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
19 days ago
Last modified
Categories
Features
Share
Turn public TikTok profiles into clean metadata in one run. Paste one or more @handle URLs and get each profile's recent videos (likes, views, comments, shares, saves, captions, post dates) as snake_case JSON, plus optional profile stats once per account. No residential proxy needed.
Note: Only public profiles and videos. If a URL returns nothing, you get a free status row that says why (the run still completes).
Why Use This Tool?
- Automate brand and creator tracking: stop copying TikTok stats by hand.
- Several profiles per run: put multiple profile URLs in
start_urls. - Optional profile metadata: turn on
scrape_profilefor followers, following, video count, verified badge, avatar and bio once per account. - Clean downstream data: consistent snake_case fields for Sheets, warehouses, n8n/Make or your own API.
- Lightweight: plain HTTP, no browser farm, no residential proxy.
Why Choose This Actor?
- Recent videos per profile from TikTok's public embed (about the 10 newest)
- Date filter (
until) for those recent videos, with pinned videos handled correctly - Pinned videos: flagged with
is_pinned, or left out withskip_pinned - Clear empty results: every URL that returns nothing gets a free status row (
older_than_until,no_videos,embed_unavailable,blocked,skipped) plus a run summary - Apify-native: Console, schedules, webhooks, API, Make, n8n, Zapier
Features
- Scrape TikTok profile URLs (or bare
@handles). A single video URL is also accepted and returns one row for that video - Multiple
start_urlsper run (deduped) max_itemscaps the whole run, not each profile (see below)- Optional
scrape_profile: one profile row per profile (followers, following, video count, likes, verified, avatar, display name) - Video fields: caption, likes, views, comments, shares, saves, author, author verified, post time, duration, cover, music title,
is_pinned - Optional
untildate filter (ISO /YYYY-MM-DD): keeps videos posted after that date. A pinned old video never stops the filter - Optional
skip_pinned: leave pinned videos out (not charged) - If TikTok rate-limits, the run waits and continues with the next profiles, then retries the limited ones once
- Run summary in the
OUTPUTkey-value record:urls_ok,urls_empty,items,pinned_skipped,reasons - Dataset export: JSON, CSV, Excel
Use Cases
- Social listening and brand monitoring across creator lists
- Influencer vetting: follower counts plus recent engagement in one dataset
- Competitive tracking for product, wellness and DTC accounts
- Content ops: archive captions and URLs for briefs or RAG
- Agency reporting: schedule runs into Sheets or BI
Input Example
{"start_urls": ["https://www.tiktok.com/@duolingo"],"max_items": 20,"scrape_profile": false,"until": "2026-10-01","skip_pinned": false,"proxyConfiguration": {"useApifyProxy": false}}
| Field | What it does |
|---|---|
start_urls | Profile URLs or @handles (required). A video URL returns that one video |
max_items | Cap on rows for the whole run, across all URLs (video rows + profile rows; status rows don't count). Default 20; 0 = safe ceiling 5000. With 3 profiles and max_items: 20, later profiles may get nothing once 20 rows are reached. Free-tier tip: free tier max items per run ≤ 100 |
scrape_profile | Optional. When true, emit one profile row before each profile's videos (default false) |
until | Optional. Keep videos posted after this date. Pinned videos never end the filter; old pinned videos are dropped |
skip_pinned | Optional. When true, pinned videos are left out and not charged. When false (default) they are kept with is_pinned: true |
proxyConfiguration | Optional Apify proxy. None or datacenter is fine |
Output Examples
Video row:
{"url": "https://www.tiktok.com/@tiktok/video/7500000000000000000","caption": "…","like_count": 12000,"view_count": 250000,"play_count": 250000,"comment_count": 300,"share_count": 150,"save_count": 900,"author": "TikTok","handle": "tiktok","author_verified": true,"posted_at": "2026-10-10T17:00:00Z","is_pinned": false,"media_type": "video","platform": "tiktok"}
view_count and play_count are the same number: TikTok shows one public view counter. play_count stays for compatibility. save_count (alias collect_count) is an integer.
Profile row (only with scrape_profile: true):
{"media_type": "profile","platform": "tiktok","handle": "healthwithanya","url": "https://www.tiktok.com/@healthwithanya","follower_count": 33800,"following_count": 120,"video_count": 358,"like_count": 450000,"verified": false,"avatar_url": "https://…"}
Status row (a URL that returned nothing; never billed):
{"media_type": "status","platform": "tiktok","url": "https://www.tiktok.com/@some.account","handle": "some.account","status": "older_than_until","reason": "no videos newer than until=2026-10-01"}
How to Run on Apify
- Open the Actor on Apify and click Try for free / Start.
- Paste one or more public TikTok profile URLs into start_urls.
- Set max_items for the whole run (free tier max items per run ≤ 100). Optionally set until and skip_pinned.
- Optionally enable Scrape profile metadata, then run and open the Dataset tab.
- Download JSON / CSV / Excel, or connect via API, schedule, Make, n8n or Zapier.
Run from your stack (API sketch)
curl -X POST "https://api.apify.com/v2/acts/tictechid~vanzi-tiktok-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"start_urls":["https://www.tiktok.com/@tiktok"],"max_items":20}'
Limitations
- Public profiles only. Private, removed or region-blocked content returns a status row.
- Videos come from TikTok's public embed: about the 10 newest per profile, not the full history.
untilcannot reach further back than that. - Some public accounts are not listed by TikTok's embed at all. They return
embed_unavailable(the account has videos, but this Actor cannot list them). Accounts with 0 public videos returnno_videos. - Pinned videos are detected from their position (TikTok does not label pins on public pages). A pinned video that is also the newest is treated as a normal video.
- TikTok may rate-limit requests. The run slows down, pauses and continues; profiles that stay blocked get a
blockedstatus row, and only if limiting persists after several pauses are the remaining URLs markedskipped. - No hashtag, keyword, comment or follower-list scraping.
Usage Limits
- Free Apify accounts: use this Actor within your monthly platform credit. Free-tier tip: free tier max items per run ≤ 100.
- Paid plans: runs follow your Apify plan limits.
See Apify Pricing.
FAQ
Do I need a TikTok login? No, public pages only.
Do I need a residential proxy? No. Use none or datacenter.
What am I charged for? One start fee per run, plus one result per video row, and per profile row when scrape_profile is on. Status rows and skipped pinned videos are free.
Why did a profile return a status row? Check its status: older_than_until (no video newer than until; move it earlier), no_videos (no public videos), embed_unavailable (TikTok's embed lists none for this account), blocked (TikTok refused the request, try again later), or skipped (not attempted because TikTok kept rate-limiting).
Support: open an Issue on the Actor page.
For more details, contact the maintainer or email us at contact@tictech.id