TikTok Explore Video Scraper
Pricing
from $2.99 / 1,000 explore videos
TikTok Explore Video Scraper
Fetch the public TikTok Explore page and return source-backed page snapshots, structured entities, links, images, metadata, and access diagnostics.
Pricing
from $2.99 / 1,000 explore videos
Rating
0.0
(0)
Developer
w3crawler
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
TikTok Explore Video Scraper reads the public TikTok Explore page and returns a bounded sample of source-backed video cards exposed by that page. It preserves public titles or captions, creator identity, hashtags, visible metrics, thumbnails, canonical video URLs, and observed position. It does not log in, access private accounts, or turn a blocked page into an empty successful result.
Get started
- Open the Actor Store page and select Try for free or open the Input tab.
- Set
limitto the number of public video cards you want, up to 20. - Keep the default limits for the first run. Enable
includeDiagnosticsonly if you want a single minimal row when the page is blocked or empty. - Start the Actor, open the dataset, and export records as JSON, CSV, or Excel. Open Run summary (
OUTPUT_SUMMARY) to see the access outcome and transport.
Input
All fields are optional; the defaults below are ready to use. Unsupported fields and out-of-range values are rejected before requests start.
| Field | Type | Required? | Default | Meaning |
|---|---|---|---|---|
limit | integer | Optional | 10 | Maximum distinct public video records to emit, from 1 to 20. |
includeDiagnostics | boolean | Optional | false | Emit one minimal {url,error,errorCode,scrapedAt} row when the public page is blocked or empty. |
requestTimeoutSecs | integer | Optional | 20 | Bounded timeout for the public page request, from 10 to 120 seconds. |
maxRequestRetries | integer | Optional | 1 | Bounded retry count for the direct public page request, from 0 to 2. |
proxyConfiguration | object | Optional | Not supplied | Optional Apify Proxy or custom HTTP(S) proxy. Proxy use does not bypass access controls. |
fixturePath | string | Optional | Not supplied | QA-only relative path below test/fixtures, up to 240 characters. Fixture mode is explicit and is never used as a live fallback. |
Full default input, excluding the optional proxy object:
{"limit": 10,"includeDiagnostics": false,"requestTimeoutSecs": 20,"maxRequestRetries": 1}
The Actor requests the public Explore URL once and parses only the video cards present in that response. It does not scroll, paginate, sign in, or use a personalized recommendation endpoint.
Output
The dataset contains one row per source-backed video card, or one minimal diagnostic row when includeDiagnostics is enabled and the page is blocked or empty. In the saved 2026-10-25 local run, TikTok returned an access challenge and includeDiagnostics was false, so no rows were written. The saved dataset is an empty array:
[]
The fields below describe the row shape when public data is available; none was observed in that run. Optional values are omitted when the page does not expose them, and no placeholder rows are written.
| Field | Type | Availability | Meaning |
|---|---|---|---|
videoId | string | When published | Public TikTok video identifier. |
videoUrl | string | When published | Public TikTok video URL. |
videoTitle | string | When published | Public title or caption shown for the video. |
creatorName | string | When published | Public creator display name or handle. |
creatorUrl | string | When published | Public creator profile URL. |
description | string | When published | Public video description or caption. |
hashtags | string array | When published | Hashtags visible in the public caption or structured card data. |
durationSeconds | integer | When published | Public duration in seconds when exposed. |
durationText | string | When published | Public duration text when exposed. |
playCount | integer | When published | Public play or view count when exposed. |
likeCount | integer | When published | Public like count when exposed. |
commentCount | integer | When published | Public comment count when exposed. |
shareCount | integer | When published | Public share count when exposed. |
metricText | string | When published | Source metric text when it cannot be safely converted to an integer. |
thumbnailUrl | string | When published | Public video thumbnail URL. |
source | string | When published | Provenance source label. |
sourceUrl | string | When published | Public Explore URL that produced the record. |
pageNum | integer | When published | Observed source page number; Explore is a single bounded page. |
position | integer | When published | Position in the observed Explore batch. |
scrapedAt | string | When published | UTC record timestamp. |
url | string | In a diagnostic row | Requested URL in a minimal diagnostic row. |
error | string | In a diagnostic row | Bounded diagnostic message. |
errorCode | string | In a diagnostic row | Stable diagnostic code, such as ACCESS_BLOCK. |
A diagnostic row contains only url, error, errorCode, and scrapedAt. It is written only when includeDiagnostics is true; the saved run kept the default false, which is why the dataset is empty.
Run summary
Run summary is stored separately from the dataset in the run's key-value store under OUTPUT_SUMMARY. It records the access outcome, transport, response format, and retry attempts even when no dataset row is written.
| Field | Meaning |
|---|---|
source | Source label recorded for the run, tiktok.com. |
sourceUrl | Public Explore URL requested. |
status | Run outcome: success, blocked, empty, or failed. |
normalCount | Number of video records saved. |
diagnosticCount | Number of diagnostic dataset rows saved; zero unless includeDiagnostics is enabled. |
responseFormat | Detected page format, such as embed_state_json, html, or unknown. |
transport | Transport used for the request, such as direct_http, proxy, or apify_proxy. |
readerFallback | Whether a reader fallback was used. |
responseStatus | HTTP status of the last response, when one was received. |
responseBytes | Size of the last response body in bytes, when reported. |
contentType | Content type of the last response, when reported. |
accessSignal | Access-challenge signal detected in the response, when present. |
attempts | Array of route attempts with status, transport, size, and outcome. |
completedAt | Time the summary was written, in ISO UTC. |
Optional response fields appear only when the route reports them; the saved run did not expose responseStatus, responseBytes, contentType, or accessSignal.
| Status | Meaning |
|---|---|
success | Public video cards were saved without an extraction problem. |
blocked | TikTok returned an access challenge or denial, so no video cards were saved. |
empty | The page loaded without an access challenge but exposed no usable public video cards. |
failed | A request or parse failure occurred before any usable record was saved. |
Example OUTPUT_SUMMARY from the saved 2026-10-25 run:
{"source": "tiktok.com","sourceUrl": "https://www.tiktok.com/explore","status": "blocked","normalCount": 0,"diagnosticCount": 0,"responseFormat": "unknown","transport": "apify_proxy","readerFallback": false,"attempts": [{"route": "direct_public_page","transport": "apify_proxy","statusCode": 200,"responseBytes": 369235,"contentType": "text/html; charset=utf-8","outcome": "blocked","error": "HTTP 200 (captcha)"}],"completedAt": "2026-10-25T21:32:40.650Z"}
Coverage and limitations
Explore is a single public page, not a complete or personalized feed. The Actor captures only the cards present in the response it receives, up to limit; it does not scroll, paginate, or follow creator profiles. Position is the order observed in that response and can change between requests.
TikTok can respond with a CAPTCHA, login wall, empty shell, or generic error. Those outcomes stop the run and are recorded in OUTPUT_SUMMARY; when includeDiagnostics is enabled, the same outcome is also written as one minimal dataset row with url, error, errorCode, and scrapedAt. A blocked response is never converted into a successful empty result. fixturePath exists only for offline QA and is never used as a live fallback. Proxy use does not bypass access controls.
Usage and support
Cost depends on Apify compute, request time, dataset size, and any proxy traffic. Keep limit small, start with the default single request, and inspect OUTPUT_SUMMARY before scheduling repeated runs. See the Actor's Pricing tab for current account rates.
Use the Actor Issues page to report a problem. Include the run ID, the input used, and the run summary; do not include tokens, cookies, or private data. This Actor is not affiliated with, endorsed by, or sponsored by TikTok. Use it only for public data and in accordance with the source's terms, robots guidance, and applicable law. Public pages can contain personal information; use the output only for lawful purposes.