TikTok Scraper With Repost Insights Data
Pricing
from $2.99 / 1,000 results
TikTok Scraper With Repost Insights Data
TikTok Scraper With Repost Insights Data extracts TikTok videos and repost insights, including captions, creators, views, likes, comments, shares, repost counts, hashtags, timestamps, and engagement metrics. Ideal for content research, trend tracking, competitor analysis, and audience insights.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
TikTok Scraper — Videos, Reposts and Engagement Analytics
TikTok Scraper With Repost Insights Data pulls profile videos, reposts, and hashtag or keyword search results from TikTok's public pages and returns them as structured JSON — no login required. Every repost row also carries a derived repostAnalytics object (engagement rate, like/view ratio, above-profile-average flag), and an optional per-profile repost_summary row adds repost cadence and a repost-vs-own-video engagement delta. Built for teams who need repost behavior, not just raw video counts, from social analysts to influencer-vetting and competitor-monitoring workflows.
🧭 What is TikTok Scraper With Repost Insights Data?
It's an Apify Actor that scrapes TikTok's public web pages — profile pages, the repost tab, and the general search surface — and returns normalized JSON rows to an Apify dataset. No TikTok account, login, or cookie is used or required; profile data is read from the public page HTML and TikTok's own web API endpoints.
Key features:
- 👤 Profile targeting by full URL or bare username, with
profileUrlsand the legacystartUrlsalias merged (not overridden) so old input JSON keeps working - 🔍 Keyword or hashtag search via
searchType, against TikTok's own general-search surface - 🔄 Repost collection matched to TikTok's dedicated
/api/repost/item_listendpoint — not a generic feed sniff that could mislabel a profile's own videos as reposts - 📈 Derived repost analytics —
repostAnalyticson every repost row, plus an optionalrepost_summaryaggregate row per profile - 🌐 Optional Apify Proxy with automatic escalation (direct connection → datacenter → residential) when a request is blocked
- 📦 Live dataset writes — rows appear as they're collected, not batched at the end of the run
📊 What data can I extract with TikTok Scraper With Repost Insights Data?
Each dataset row carries a type field, a flat set of top-level columns for quick filtering, and the full raw payload nested under video, repost, or item.
| Field | Example value | Use case |
|---|---|---|
type | "profile_repost" | Filter the dataset by row kind: profile_video, profile_repost, repost_summary, hashtag_search, keyword_search, error |
username | "mrbeast" | Profile this row belongs to (profile rows) |
query | "cooking tips" | Search term this row belongs to (search rows) |
success | true | Whether this row's collection succeeded |
videoId | "7234567890123456789" | Own-video identifier |
videoTitle | "My weekend cooking vlog" | Own-video caption/title |
videoUrl | "https://www.tiktok.com/@mrbeast/video/7234..." | Direct link to the video |
videoCreatedAt | "2026-05-01T12:00:00Z" | Publish timestamp (ISO 8601) |
videoAuthor | "mrbeast" | Uploading account |
videoViews / videoLikes / videoComments / videoShares | 9000000 / 500000 / 8000 / 12000 | Own-video engagement counts |
repostId | "7234567890123456789" | Reposted video's identifier |
repostText | "caption text" | Reposted video's caption |
repostUrl | "https://www.tiktok.com/@mrbeast/video/7234..." | Direct link to the reposted video |
repostCreatedAt | "2026-05-01T12:00:00Z" | Original post timestamp of the repost |
repostAuthor | "MrBeast" | Original creator of the reposted video |
repostViews / repostLikes | 9000000 / 500000 | Reposted video's engagement counts |
itemId | "7234567890123456789" | Search-result item identifier |
itemText | "cooking tips for beginners" | Search-result caption |
itemUrl | "https://www.tiktok.com/@user/video/7234..." | Direct link to the search-result video |
itemCreatedAt | "2026-04-20T09:00:00Z" | Search-result publish timestamp |
itemViews / itemLikes / itemComments | 250000 / 18000 / 900 | Search-result engagement counts |
video | { … } | Full raw video payload (see below) — present on profile_video rows |
repost | { … } | Full raw repost payload, including repostAnalytics — present on profile_repost rows |
item | { … } | Full raw search-item payload — present on hashtag_search/keyword_search rows |
repostCount | 14 | Number of reposts collected for this profile (repost_summary rows) |
repostCadenceDays | 4.32 | Average days between reposts (repost_summary rows) |
repostAvgEngagementRate | 0.061 | Mean repostAnalytics.engagementRate across the profile's reposts (repost_summary rows) |
ownVideoAvgEngagementRate | 0.048 | Mean engagement rate across the profile's own videos collected in this run (repost_summary rows) |
ownVideoSampleSize | 40 | Number of own videos the ownVideoAvgEngagementRate was computed from (repost_summary rows; 0 if includeVideos was off) |
repostVsOwnEngagementDelta | 0.013 | repostAvgEngagementRate - ownVideoAvgEngagementRate; positive means reposts outperform the profile's own uploads |
error | "BlockedError" | Present only on success: false rows |
scrapedAt | "2026-08-15T10:12:03Z" | UTC timestamp the row was written |
├── 📈 Repost analytics — the decision-driving data
Every profile_repost row's nested repost object carries a repostAnalytics block: engagementRate ((likes + comments + shares) / views), likeViewRatio (likes / views), and aboveProfileAverage (a boolean comparing that repost's rate against the mean of every repost collected for the same profile in the same run). Both rates return null — never a fabricated 0 — when the underlying view count is 0. The repost_summary row rolls this up per profile: repostCadenceDays needs at least two reposts to compute (null otherwise), and repostVsOwnEngagementDelta needs includeVideos on for that run, or it stays null too.
└── 🎯 Targeting data — how you scope a run
profileUrls/startUrls pick which accounts to scrape; includeVideos/includeReposts (and the legacy, additive profileScrapeSections) pick which sections run per profile; searchQuery + searchType (keyword or hashtag) pick TikTok's general-search surface instead of or alongside a profile run; maxResults (1–1000) caps each section and each search independently.
🆚 How does TikTok Scraper With Repost Insights Data differ from the official TikTok API?
TikTok's own developer platform does not give a bulk-friendly path to this data. The Display API only returns videos for the TikTok account that has itself completed OAuth login and granted the video.list scope to your app — it has no endpoint for an arbitrary third party's public profile, no repost endpoint, and no keyword or hashtag search endpoint (as documented on TikTok's developer site, checked 2026-08-15). The Research API does cover reposted videos and public account/content search, but is restricted to applicants affiliated with academic or non-profit research institutions in the US, EEA, UK, Switzerland or Brazil, who must submit a research proposal, prove independence from commercial interests, and wait for approval — TikTok's own page describes a roughly four-week review (checked 2026-08-15). Neither path works for an agency, brand, or commercial analytics team that just wants a competitor's or influencer's repost activity today.
| Feature | TikTok Display API | TikTok Research API | This Actor |
|---|---|---|---|
| Access requirement | OAuth login by the account owner | Approved academic/non-profit research application | Public profile URL, username, or search query |
| Arbitrary third-party profiles | ❌ own account only | ✅ (approved researchers) | ✅ |
| Repost data | ❌ not offered | ✅ (approved researchers) | ✅, with derived analytics |
| Keyword / hashtag search | ❌ not offered | ✅ (approved researchers) | ✅ |
| Commercial/marketing use | Limited to what OAuth users grant | ❌ non-commercial, non-profit only | ✅ |
| Setup time | Register app + OAuth flow per account | Application + review (~4 weeks per TikTok) | Add input, click Start |
Why can't I just get repost data from TikTok's own API?
TikTok's public developer program simply doesn't expose reposts to commercial apps: the Display API's video endpoints only ever return the OAuth-authenticated user's own uploads, and the one TikTok API that does return reposted videos — the Research API — is gated to approved academic and non-profit researchers on a non-commercial basis. There is no TikTok-issued API key that a marketing team, agency, or analytics product can use today to pull an arbitrary profile's reposts. This Actor covers that gap by reading the same public pages a logged-out browser sees and matching TikTok's own /api/repost/item_list response precisely, so repost rows are never confused with a profile's regular video feed.
Use the Display API when you're building a feature inside your own product that shows a user their own TikTok videos after they log in. Use this Actor when you need any public profile's videos, reposts, or search results without asking that account to authorize anything.
💡 How to use data extracted from TikTok?
├── 📊 Social media analysts and brand teams
Add the profiles you track to profileUrls, leave includeReposts and repostAnalyticsEnabled on, and pull repostAvgEngagementRate and aboveProfileAverage straight into a dashboard. Because the analytics are computed fresh on every run from diggCount/commentCount/shareCount/playCount, you don't need a separate engagement-calculation step before charting repost performance against a profile's own uploads.
├── 🏢 Agencies monitoring client and competitor accounts
Run the same profileUrls list on a schedule (Apify Schedules) and diff repostCadenceDays and repostVsOwnEngagementDelta run over run to flag a client or competitor suddenly reposting more, or reposting content that's underperforming their own uploads — a concrete, recurring audit rather than a one-off pull.
├── 🔬 Market and trend research
Set searchType to hashtag and pull itemText, itemLikes, and itemViews across a set of hashtags to map which topics are trending, or set searchType to keyword to see what content ranks for a term your audience searches. Combine with the hashtags array parsed out of each item.textExtra payload to see which tags co-occur.
└── 🤖 AI agents and automated pipelines
Because the Actor runs as a standard Apify Actor with a JSON dataset output, an agent framework can call it, poll the run, and feed repostAnalytics and repost_summary rows straight into a downstream scoring or alerting step — no scraping or engagement-math logic needs to live in the agent itself.
🔼 Input sample
Required per schema: none — supply either profileUrls/startUrls, a searchQuery, or both.
| Parameter | Required | Type | Constraints | Description |
|---|---|---|---|---|
profileUrls | No | Array | editor: stringList | TikTok profile URLs (e.g. https://www.tiktok.com/@username) or bare usernames. Supports bulk input. |
searchQuery | No | String | default "" | Keyword or hashtag search term. Leave empty to skip search. |
searchType | No | String | default "keyword"; enum "keyword" (Keyword search), "hashtag" (Hashtag search) | Which of TikTok's search modes to use. |
maxResults | No | Integer | default 100; min 1; max 1000 | Max results per profile section and per search query — applied separately to videos and to reposts for each profile. |
includeVideos | No | Boolean | prefill true | Collect each profile's own uploaded videos. |
includeReposts | No | Boolean | prefill true | Collect each profile's reposted videos. Required for repostAnalytics and repost_summary. |
startUrls | No | Array | editor: stringList | Legacy, base-actor-compatible alias for profileUrls. Merged with profileUrls, not replaced. |
profileScrapeSections | No | Array | editor: select; items enum "videos", "repost" | Legacy alias for includeVideos/includeReposts. Values here add a section — use the toggles above to fully disable one. |
repostAnalyticsEnabled | No | Boolean | default true | Attach repostAnalytics (engagementRate, likeViewRatio, aboveProfileAverage) to every repost row. |
includeRepostSummary | No | Boolean | default true | Push one extra repost_summary row per profile. |
proxyConfiguration | No | Object | editor: proxy | Apify Proxy configuration. No proxy is used by default; the Actor automatically escalates connection method if a request doesn't return the expected content. |
{"profileUrls": ["https://www.tiktok.com/@mrbeast"],"searchQuery": "","searchType": "keyword","maxResults": 100,"includeVideos": true,"includeReposts": true,"repostAnalyticsEnabled": true,"includeRepostSummary": true,"proxyConfiguration": { "useApifyProxy": true }}
⚠️ Common pitfall: leaving profileUrls/startUrls and searchQuery both empty does not start an empty, harmless run — the Actor pushes one uncharged type: "error" row and fails the run outright. Supply at least one of the two before starting.
🔽 Output sample
Output is typed, normalized JSON written to the Actor's default dataset, one row at a time as data is collected. Export it as JSON, CSV, Excel, or XML from the Apify Console, or pull it with the Apify API/apify_client.
{"type": "profile_repost","username": "mrbeast","repost": {"id": "7234567890123456789","text": "caption text","createTime": 1746100800,"createTimeISO": "2026-05-01T12:00:00Z","webVideoUrl": "https://www.tiktok.com/@mrbeast/video/7234567890123456789","authorMeta": {"id": "6829267831662658","name": "mrbeast","nickname": "MrBeast","avatar": "https://p16-sign.tiktokcdn.com/...","signature": "SUBSCRIBE FOR A COOKIE","verified": true,"fans": 105000000,"heart": 15200000000},"videoMeta": {"duration": 58,"width": 1080,"height": 1920,"cover": "https://p16-sign.tiktokcdn.com/...","originCover": "https://p16-sign.tiktokcdn.com/...","dynamicCover": "https://p16-sign.tiktokcdn.com/...","playAddr": "https://v16.tiktokcdn.com/...","downloadAddr": "https://v16.tiktokcdn.com/..."},"musicMeta": {"musicId": "7234500000000000000","musicName": "original sound","musicAuthor": "mrbeast","musicOriginal": true},"diggCount": 500000,"shareCount": 12000,"playCount": 9000000,"commentCount": 8000,"collectCount": 30000,"repostAnalytics": {"engagementRate": 0.058,"likeViewRatio": 0.0556,"aboveProfileAverage": true}},"repostId": "7234567890123456789","repostText": "caption text","repostUrl": "https://www.tiktok.com/@mrbeast/video/7234567890123456789","repostCreatedAt": "2026-05-01T12:00:00Z","repostAuthor": "mrbeast","repostViews": 9000000,"repostLikes": 500000,"success": true,"scrapedAt": "2026-08-15T10:12:03Z"}
The nested item payload's internal shape is not identical between hashtag_search and keyword_search rows — the two modes call different TikTok endpoints and this Actor preserves each one's native field names rather than forcing a single shape. Both still get the same flat itemId/itemText/itemUrl/itemCreatedAt/itemViews/itemLikes/itemComments columns for consistent filtering.
Rows with success: false (a blocked or failed collection attempt) are pushed without the billed row_result event — you are not charged for failures. Filter the dataset on success == true to see only billed rows.
🎯 How do you filter and target specific videos and reposts?
Two independent targeting modes can run in the same job: profile mode (profileUrls/startUrls) pulls videos and/or reposts for named accounts; search mode (searchQuery + searchType) pulls from TikTok's general-search surface by keyword or hashtag. Both run together if you fill in both fields.
Within profile mode, includeVideos and includeReposts scope which sections run per profile — turn off includeVideos to skip a profile's own uploads and only pay for repost collection, or vice versa. The legacy profileScrapeSections field only ever adds a section on top of the toggles, so it can't be used to silently drop one. There is no rating- or quality-threshold input filter; instead, use the output's repostAnalytics.aboveProfileAverage boolean or repostVsOwnEngagementDelta to filter or sort results after the run.
maxResults (1–1000) is the volume control, and it applies separately to each section and each query — three profiles with includeVideos and includeReposts both on can return up to 3 × maxResults video rows plus 3 × maxResults repost rows. Actual counts can come in lower than maxResults if TikTok stops surfacing new items during scrolling, or if a profile's Reposts tab isn't reachable for that run.
{ "profileUrls": ["https://www.tiktok.com/@nike", "https://www.tiktok.com/@adidas"], "includeVideos": true, "includeReposts": false, "maxResults": 50 }
{ "profileUrls": ["https://www.tiktok.com/@nike"], "includeVideos": false, "includeReposts": true, "repostAnalyticsEnabled": true, "includeRepostSummary": true }
{ "searchQuery": "sustainable fashion", "searchType": "hashtag", "maxResults": 200 }
▶️ Want to try other TikTok scrapers?
| Scraper | What it extracts |
|---|---|
| Instagram-Post-Details-Scraper | Instagram post details from public profiles |
| Snapchat-Popular-Accounts-Scraper | Popular Snapchat account listings |
| Snapchat-Spotlight-Scraper | Snapchat Spotlight video data |
| Snapchat-User-Spotlight-Scraper | Per-user Snapchat Spotlight content |
| Reddit-Scraper | Reddit posts and thread data |
| youtube-video-subtitles-scraper | YouTube video subtitle/transcript text |
💻 How to extract TikTok data programmatically
This Actor runs as a standard Apify Actor: one API call starts a run, results land in a dataset you can page through as JSON.
Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<YOUR_USERNAME>/tiktok-scraper-with-repost-insights-data").call(run_input={"profileUrls": ["https://www.tiktok.com/@mrbeast"],"includeReposts": True,"repostAnalyticsEnabled": True,"maxResults": 100,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("type") == "profile_repost" and item.get("success"):analytics = item["repost"]["repostAnalytics"]print(item["repostId"], analytics["engagementRate"], analytics["aboveProfileAverage"])
Export to spreadsheets or CRM
Use the Apify Console's dataset export (CSV/Excel) or the API's ?format=csv option to map flat columns — videoViews, repostAvgEngagementRate, repostVsOwnEngagementDelta, scrapedAt, and so on — directly to spreadsheet columns or CRM custom fields without touching the nested video/repost/item objects.
⚖️ Is it legal to scrape TikTok?
Yes — this Actor reads only what TikTok already serves to a logged-out visitor on a public profile or public search page; it does not access private accounts or bypass any login wall. That said, the data includes personal data about individual creators — usernames, nicknames, avatars, bios, and engagement counts tied to an identifiable account — so GDPR (if you're in or process data from the EU/UK) and CCPA (California) can apply to how you store and use it, not just how you collect it. TikTok's Terms of Service also govern automated access to the platform and should be reviewed before any commercial use. Consult legal counsel for commercial applications involving bulk storage of personal data.
❓ FAQ
├── What happens to a video that's been deleted or made private since it was posted?
The Actor doesn't retroactively detect deletion — it only reports what a request returns at scrape time. If a profile or video page fails to load the expected content (removed, private, or blocked), that row is pushed with success: false and an error value instead of a fabricated result.
├── Can I get repost data along with a profile's own videos in the same run?
Yes — includeVideos and includeReposts both default to true, so a single run against profileUrls returns both profile_video and profile_repost rows, and (with includeRepostSummary on) one repost_summary row per profile comparing the two.
├── How accurate is the engagement data?
The Actor returns diggCount/playCount/commentCount/shareCount exactly as TikTok's page reports them at request time. repostAnalytics and repost_summary are computed locally from that same data, so their accuracy tracks TikTok's own counters, not a separate source.
├── How many records can I get per run?
maxResults caps each section and each search at 1–1000, applied per profile and per query independently — so the total row count scales with how many profiles/sections/searches you request, not a single global cap. There's no separate limit on the number of profileUrls you can submit in one run.
├── ⚠️ What if a profile's Reposts tab isn't visible or reachable?
The Actor logs a warning and returns zero repost rows for that profile — it does not push a success: false error row for this case, since an absent tab isn't treated as a failed request. Check the run log for "no repost rows will be captured" if a profile you expect reposts from returns none.
├── Does this work with Claude, ChatGPT, and AI agent frameworks?
There's no dedicated MCP server documented for this Actor. It's callable as a standard Apify Actor run via the Apify API/apify_client from any agent framework that can make an HTTP request and poll a dataset.
└── Can I use this without a TikTok API key or developer account?
Yes. No TikTok login, API key, cookie, or developer account is required — only an Apify account to run the Actor.
Conclusion
TikTok Scraper With Repost Insights Data turns TikTok's public profile, repost, and search pages into structured JSON, with a repost-analytics layer computed on every run that most TikTok scrapers don't offer at all. It's built for social analysts, agencies, and researchers who need repost cadence and repost-vs-own-video engagement, not just raw video counts. Add a profile or a search term, run it from the Apify Console or API, and the dataset fills in live as results are collected.