TikTok Scraper API — Video, Profile, Hashtag & Search
Pricing
from $0.40 / 1,000 results
TikTok Scraper API — Video, Profile, Hashtag & Search
Export public TikTok videos from profiles, hashtags, keyword searches and direct URLs. Get captions, author and music metadata, source-labelled engagement counters and optional media downloads.
Pricing
from $0.40 / 1,000 results
Rating
5.0
(1)
Developer
Coor Yu
Maintained by CommunityActor stats
2
Bookmarked
160
Total users
45
Monthly active users
20 hours ago
Last modified
Categories
Share
TikTok Scraper exports public videos from creator profiles, hashtag feeds, keyword searches and direct video URLs into one Apify dataset. Collect captions, author and music metadata, engagement counters, publish timestamps and optional media files for content research or campaign reporting.
The Actor collects public content only: it does not log in, use user cookies, or bypass private, deleted, age-restricted, or permission-gated content. Using the Apify API still requires an Apify token.
Reliability rule: Requests that complete successfully with 0 qualifying rows count as successful inputs, even when the entire run returns 0 rows or
failOnPartialFailureis true. Genuine request/API/processing errors remain failures; see the zero-result policy below.
Free plan limit
- Apify Free plan: up to 50 dataset rows per run across all inputs.
- Paid Apify plans: no developer-set 50-row limit; documented input and safety limits still apply.
- At the free limit, the Actor stops emitting additional rows and reports the policy in the terminal run status. This restriction is set by the Actor developer, not Apify.
- On Free-plan runs, each input array is also restricted to its first 50 entries, and
resultsPerInput: 0becomes a request for at most 50 per source. The separate dataset cap remains global.
Supported inputs and quick start
Provide at least one usable input. Examples are illustrative requests, not proof that a target currently returns data.
{"startUrls": [{ "url": "https://www.tiktok.com/@mrbeast" },{ "url": "https://www.tiktok.com/tag/roblox" },{ "url": "https://www.tiktok.com/search/video?q=skincare%20routine" }],"resultsPerInput": 5,"dataSource": "auto","statsPrecision": "exact","shouldDownloadVideos": false,"shouldDownloadCovers": false,"maxConcurrency": 4}
- Profiles: supply usernames or profile URLs in
profiles. Output is the account's available public videos, not a standalone complete profile report. - Hashtags: supply tag names in
hashtagsto collect videos, not aggregate hashtag totals. - Search: use non-empty
searchKeywords; anonymous results and ranking vary by source, time and region. - Direct posts: supply video/photo URLs or TikTok short-share links in
videoUrls. A photo route is accepted, but a row still needs a numeric public play count; not every photo post qualifies. - Mixed URLs:
startUrlsdetects profile, tag, search with a non-emptyq, video/photo,vm.tiktok.com,vt.tiktok.comand/t/share routes. Unsupported hosts/routes are ignored. Use absolute HTTP(S) URLs in this schema field.
Duplicate seeds are collapsed where identifiable, and video IDs are deduplicated across all inputs before dataset writes. A video found through several sources is saved once, with the first claimed source attribution. Short links resolve at request time. Scheme-less or protocol-relative TikTok links in videoUrls are normalized to HTTPS.
Input fields
| Field | Default | Meaning and limits |
|---|---|---|
startUrls | [] | Array of { "url": "https://..." } mixed TikTok targets. |
profiles | [] | Creator handles or profile URLs. |
hashtags | [] | Hashtag names, preferably without #. |
searchKeywords | [] | Video-search queries. |
videoUrls | [] | Direct video/photo or TikTok short-share URLs. |
resultsPerInput | 50 | Per-profile/tag/query maximum, 0–1000; 0 removes the requested count bound, not safety or availability limits. Direct inputs request one post. |
hashtagPostedAfter | unset | Inclusive lower date/time bound for hashtag videos only. |
hashtagPostedBefore | unset | Exclusive upper bound for hashtag videos only. |
dataSource | auto | auto, tikwm or browser; see source strategy below. |
statsPrecision | exact | exact or fast; strategy selection, not a universal accuracy guarantee. Fast changes direct URLs to native HTML. |
failOnPartialFailure | false | Make any input error fail the batch when true. Successful 0-result inputs remain successful in both modes. |
shouldDownloadVideos / shouldDownloadCovers | false | Attempt MP4/cover storage in the run's Key-Value Store. |
maxConcurrency | 4 | 1–30 HTTP/Fast/download work; browser concurrency is capped separately. |
proxy | US RESIDENTIAL when omitted | Recovery proxy; explicit custom URLs, groups or disabled settings are honored. |
requestTimeoutSecs | 45 | Browser navigation timeout, 10–300 seconds; other request/handler bounds also apply. |
maxAttemptsPerSeed / maxSearchAttempts | 2 / 2 | Bounded browser retry policies, 1–5. |
blockImages / headless | true / true | Browser resource/debug settings. |
fallbackToResidential | false | Deprecated and ignored. |
Source strategy and numeric semantics
auto uses TikWM HTTP for profiles, hashtags, searches and exact-first direct URLs. Recoverable direct failures can use native TikTok HTML, then browser recovery for remaining inputs. TikWM HTTP 401/403 responses can receive a configured-proxy retry. After exhausted browser recovery, one final HTTP attempt can run. browser starts with browser work but can still reach that final HTTP attempt; it is not an exclusively browser-only guarantee.
dataSource: "tikwm" disables browser and proxy recovery. Combine it with statsPrecision: "exact" to stay on the TikWM counter path:
{"profiles": ["mrbeast"],"resultsPerInput": 10,"dataSource": "tikwm","statsPrecision": "exact","shouldDownloadVideos": false,"shouldDownloadCovers": false}
This returns no recovery rows when that source is unavailable. tikwm with statsPrecision: "fast" still uses native HTML for direct URLs, so it is not an exact-only configuration.
| Output field | Interpretation |
|---|---|
statsPrecision: "exact" | TikWM supplied numeric counters without Actor-side rounding. The label records source provenance; it does not independently verify TikTok's totals. |
statsPrecision: "rounded" | Native HTML/browser supplied public web values that may be display-scale approximations. Other counters may also be rounded. |
stats.playCount | Required numeric public value. Missing play counts cause the post to be skipped; an explicit zero is retained. |
Other stats counters | TikWM can omit missing values; native/browser mapping defaults missing likes/comments/shares/saves to 0. Those fallback zeros are not proof of zero activity. |
author.followers / author.verified | Optional source metadata; web fallback can default missing followers to 0 and verification to false. |
createTimeISO / duration | UTC publish time / seconds. Web mapping can infer publish time from the video ID. Missing time can be empty and duration can default to 0. |
Do not infer precision from trailing zeros or assume every numeric field is exact. Counters are time-varying third-party snapshots.
Output and billing unit
One default-dataset row represents one qualifying public post. Core fields are videoId, webVideoUrl, text, createTimeISO, duration, author, music, stats, statsPrecision, hashtags, mentions, sourceType, sourceInput and scrapedAt. Optional videoDownloadUrl and coverUrl depend on source availability. Successful downloads add storedVideoKey or storedCoverKey; missing/failed downloads do not guarantee those keys. Signed media URLs may expire.
Results can be exported as JSON, CSV or Excel from Apify. API clients can read their actual run dataset with GET https://api.apify.com/v2/datasets/{datasetId}/items, replacing the placeholder and using appropriate Apify authentication. RUN_SUMMARY is stored in the Key-Value Store, not a billable video row. At output limits, its counts can reflect records prepared before final write truncation; the saved dataset is authoritative for delivered rows.
Current pricing
Current effective event prices in USD. The Pricing tab is authoritative.
| Apify plan | Result event per saved row | Per 1,000 rows |
|---|---|---|
| FREE | $0.00225 | $2.25 |
| BRONZE | $0.00045 | $0.45 |
| SILVER, GOLD, PLATINUM, DIAMOND | $0.00040 | $0.40 |
The FREE plan is a paid event tier, not zero-priced scraping. apify-actor-start costs $0.0005 per GB of allocated memory, minimum one event per run. Higher-memory starts need more events; startup charges can apply even with no output.
Billing uses apify-default-dataset-item for saved rows, not a custom per-request event. Duplicates, filtered-out rows and empty targets do not create result rows. Apify platform usage is billed separately to the running user, including compute, transfer and storage; residential recovery can add proxy-bandwidth costs. Failed/empty runs can still incur startup and platform usage. Media downloads and retries increase usage. No downstream Apify Actor is invoked by this implementation; its HTTP path depends on the independent TikWM service.
Reliability and limits
resultsPerInputis an upper bound, not a promised count or complete history. HTTP list pagination stops after at most 300 pages per seed; signed browser pagination is bounded to 400 iterations per selected template and by handler timeouts. Empty/stalled feeds, access blocks and run budgets can stop collection earlier.- Exact-source calls are globally spaced by about 2.2 seconds within the run. Browser work is capped at one page below 2,048 MB and at most two at 2,048 MB or more; raising concurrency does not remove these bounds.
- Hashtag dates use UTC midnight for date-only inputs. The lower bound is inclusive and upper exclusive; invalid values warn and disable that bound. With a filter,
resultsPerInputalso bounds candidate scanning. Feeds are not guaranteed chronological. Rare DOM-detail recovery does not reapply the hashtag date window, so validate returned timestamps when strict filtering matters. - No usable seed causes failure. A zero-row run succeeds if there are no input errors; with any unresolved input error it fails. With saved rows, unresolved input errors normally produce
RUN_SUMMARY.status: "SUCCEEDED_WITH_WARNINGS";failOnPartialFailure: trueinstead fails the run. Saved results remain available and billable even if the final run fails. - Private/deleted/missing, empty, region-restricted or anonymous-access-blocked content may yield no data. Do not treat zero results as definitive proof of deletion. No access-control bypass is supported.
FAQs
Does a profile input return full history? No. It paginates the public feed exposed by the selected source, subject to count, page, time, budget and plan limits.
Are all engagement metrics exact? No. Check each row's statsPrecision, source and missing-field behavior. Even exact denotes an unrounded source value, not independently audited accuracy.
Do I need a TikTok login? No TikTok login, user cookie or user-supplied TikWM API key is required. An Apify account/token is needed for Apify runs and authenticated API access.
Zero-result policy
A valid input whose requests finish without error is successful even if it returns 0 qualifying videos, including when filters exclude every video. Successful empty HTTP responses do not trigger browser fallback solely because they are empty. The same rule applies in browser mode and with failOnPartialFailure: true.
HTTP/network/API errors, malformed responses and thrown processing errors remain failures unless recovery succeeds. A run with 0 saved rows and any unresolved input error fails. With saved rows, input errors produce a terminal warning unless failOnPartialFailure: true marks the run failed. Optional asset downloads retain their existing best-effort behavior.
RUN_SUMMARY.zeroResultInputs counts successful empty inputs. These also count toward succeededInputs and inputSuccessRate, not failedInputs. Zero results alone are not evidence that a target was deleted or inaccessible.
Related Actors from funny_ground
- TikTok Hashtag Stats — hashtag-level metadata and aggregate counters.
- TikTok Creator Videos — available video rows from known creator profiles.
- TikTok Comments Scraper — public discussion on known video URLs.
Collect and use public data in accordance with applicable laws and platform terms.