Kwai Scraper — Videos, Profiles & Keyword Discovery
Pricing
from $1.00 / 1,000 public video results
Kwai Scraper — Videos, Profiles & Keyword Discovery
Export public international Kwai videos from direct URLs and creator feeds with available pagination, plus first-response keyword discovery snapshots. Get captions, authors and engagement via efficient HTTP.
Pricing
from $1.00 / 1,000 public video results
Rating
0.0
(0)
Developer
Coor Yu
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Kwai Scraper — Public Videos, Creator Feeds & Keyword Discovery
HTTP-only scraper for public international kwai.com videos. Supports direct video URLs, creator public feeds with available public cursors, and first-response keyword discovery snapshots (not full/paginated live search). No login, cookies, paid external API, downstream Actor, browser, Chinese kuaishou.com, hashtag feed or media file download.
Quick start
{"videoUrls": ["https://www.kwai.com/@jacyvieira33/video/5205185379965043809"],"maxItems": 1,"maxConcurrency": 4}
Targets are public at implementation test time and can become unavailable. Zero saved rows always mean FAILED. Mixed runs with valid rows normally succeed with warnings in RUN_SUMMARY; failOnPartialFailure: true makes an empty/failed input fail the whole run. Saved rows remain available and billable if a later error fails the run.
Supported inputs
videoUrls: directhttps://www.kwai.com/@handle/video/IDURLs. Exact ID only; recommendations are excluded.profiles: public creator handles or/@handleURLs. Initial public HTML and source-supplied profile cursors only. Count/page/time/access limits apply; complete history is not promised.searchKeywords: keyword-related public discovery. One API response, up to 20 items, or a small embedded HTML fallback. Ranking, relevance and counts are source-dependent; no search pagination.startUrls: mixed supported routes:/@handle,/@handle/video/ID,/search/keyword/video/ID,/discover/keyword. HTTPS kwai.com/www.kwai.com only. No short links or arbitrary web URLs.
Creator and keyword example
{"profiles": ["jacyvieira33"],"searchKeywords": ["cooking"],"resultsPerInput": 30,"maxItems": 50,"maxPagesPerInput": 5,"maxConcurrency": 3}
The profile may supply fewer than30 videos. The keyword still supplies at most20 videos from one discovery response, not30. Duplicate IDs across inputs are stored once; whichever input finishes first claims the row's attribution. No new HTTP request, redirect or retry starts after the shared output/charge stop condition is reached. A concurrent request-budget stop does not discard a valid response already fetched by another worker.
Input controls
All limits are hard upper bounds, not promises of availability. Up to100 unique targets per run; each target array may contain at most100 entries. Profile handles are limited to100 characters; keywords to120 characters. Invalid/unsupported nonempty inputs fail validation before crawling rather than silently being billed as results.
| Field | Default | Accepted range / meaning |
|---|---|---|
resultsPerInput | 20 | 1–1,000 valid video candidates per creator; keyword snapshot cap20; direct URLs request1. |
maxItems | 100 | 1–10,000 globally saved unique videos; plan/platform/event budgets can lower it. |
maxConcurrency | 4 | 1–12 independent inputs. Each profile cursor remains sequential. |
requestTimeoutSecs | 20 | 5–60 seconds per logical HTTP attempt, including redirects and body streaming. |
maxRetries | 1 | 0–3 retries only for HTTP429/5xx; bounded backoff. No retry of login/private blocks,408 or transport errors. |
maxPagesPerInput | 10 | 1–50 public profile pages, including initial HTML. Does not enable keyword pagination. |
maxRequests | 200 | 1–1,000 total HTTP calls, including redirects/retries/fallback. |
maxRunTimeSecs | 180 | 10–1,800 seconds, additionally shortened before the platform deadline. |
maxResponseBytes | 1,048,576 | 65,536–2,097,152 decoded HTML/JSON bytes per response. |
maxTotalResponseBytes | 33,554,432 | 65,536–134,217,728 decoded response bytes across the run. |
failOnPartialFailure | false | Fail when an input is empty/failed, even if other rows were saved. |
proxy | disabled | Optional explicit Apify/custom HTTP(S) proxy; no automatic paid upgrade. |
Output
One deduplicated public video per dataset row: platform: "kwai", videoId, webVideoUrl, text, createTimeISO (UTC or null), duration (seconds or null), author, optional music, stats, statsPrecision, statsPrecisionByField, hashtags, sourceType, sourceInput, scrapedAt, and provenance (first-party URL, source kind and fetch time).
Missing engagement values are null, never invented zero. Explicit source zeros remain zero. exact means an unrounded integer provided by Kwai, not independently verified accuracy. rounded marks abbreviated public values; check per-field precision. Author metadata is only populated when supplied; no fabricated followers/verification.
Optional coverUrl and videoDownloadUrl are first-party publicly exposed media/playback URLs, not stored media. They can be signed/expiring, region restricted or later unavailable. No image/video files are fetched, probed, stored or charged as extra result rows. An exposed playback URL does not grant copyright or permission to download/reuse it.
Pricing
$0.001 per saved video ($1 per 1,000), no startup fee. The Apify Pricing tab is authoritative. The result event is the synthetic apify-default-dataset-item, automatically billed by Apify dataset writes. Duplicates, errors, empty inputs and RUN_SUMMARY do not create billable video rows.
An event-charge / maximum-spend limit is not a cap on separate Apify platform usage. The Actor stops new result writes at the remaining event/item capacity, but compute, transfer, storage or explicitly selected proxy traffic can still incur charges, including on an empty or failed run. Use the run's memory/timeout and the Actor's request/byte/time limits to bound those costs.
The running user separately pays Apify platform usage (compute, transfer, storage and any explicitly selected proxy traffic). No paid external API or downstream Actor is used. There is no automatic residential-proxy purchase. Confirmed Apify Free-plan runs (APIFY_IS_AT_HOME=1 and APIFY_USER_IS_PAYING=0) have a developer-imposed cap of 50 saved videos per run. Paid/unknown-plan runs have no such 50-row cap. maxItems, remaining event-charge budget, and ACTOR_MAX_PAID_DATASET_ITEMS (when supplied) are honored for all runs.
Sources, reliability and status
- Direct video: parse first-party HTML embedded Nuxt state, with JSON-LD fallback. The requested video ID must match exactly; recommendations do not substitute for missing posts. A native unavailable flag blocks stale SEO data for the same ID.
- Creator feed: first resolve the public profile HTML, anchor its stable author ID, and consume only matching creator videos. Continue via the same public web profile cursor API. Missing/repeated cursors, empty/duplicate-only pages and safety budgets stop pagination.
- Keyword discovery: one anonymous first-party web discovery API response (up to20); on a non-budget API failure, one allowed HTML fallback can return a small snapshot, also capped20. No hidden browser, crawler-identity spoofing, signature generation or authenticated endpoint is used.
Private, deleted, age-restricted, region-restricted, empty or anonymous-access-blocked targets can return no rows. Zero results are not proof of deletion. Source fields, ranking and public accessibility can change without notice.
RUN_SUMMARY in the run's Key-Value Store contains saved/duplicate counts, per-input status/pages/warnings/errors, requests, received bytes, elapsed time and stop reason. It is not a billable video row. A normal status is SUCCEEDED; partial coverage uses SUCCEEDED_WITH_WARNINGS in the summary while the Apify run succeeds. Any zero-row run, strict partial failure or storage failure is FAILED. Dataset contents remain authoritative and existing rows remain billable if a later failure occurs.
Local negative test at implementation time: nonexistent profile kwai_actor_nonexistent_849205731 and direct ID 9999999999999999999 returned0 rows and whole-run FAILED. The current known-public quick-start URL returned its exact video. Live availability is not guaranteed forever.
Safety and limits
Default bounds: resultsPerInput20, maxItems100, concurrency4, timeout20s, retries1, profile pages10, HTTP requests200, wall-time180s, 1 MiB per decoded response and 32 MiB total response bytes. Input/schema maximums are hard bounds; retries and redirects count against requests. Only HTTP429/5xx retries use bounded backoff. Public routes/hosts and every redirect are allowlisted; private network destinations are rejected. Login, private, deleted or restricted content is not bypassed.
Direct HTTP is default. proxy is optional and explicitly user-configured; its traffic can cost extra. Custom HTTP(S) proxies must be publicly reachable. No user headers, Kwai credentials, cookies or browser fallback are accepted.
The parser never evaluates downloaded JavaScript: a data-only AST allowlist, pre-AST token/nesting bounds, total array-allocation budget and response-byte limits protect against executable or oversized embedded state.
Node22 ESM, Apify SDK, no browser dependencies. Default512MB; 256MB is available for small runs. Local developer tests: npm ci && npm test; live anonymous smoke: npm run smoke.
FAQ
Is this for Chinese Kuaishou? No. It supports international kwai.com, not kuaishou.com or unrelated lookalike domains.
Does a creator input return every video ever posted? No. It follows only the available anonymous public profile feed/cursor and stops at availability, count, page, request, byte, time or payment limits. Every profile row must match the profile's stable author ID and handle.
Is keyword discovery a full search engine? No. It is a first-response public discovery snapshot of up to20 videos. Source ranking/relevance and regional access vary. Search pagination is intentionally unsupported; hashtags in output are extracted from captions, not collected from a hashtag feed.
Are counters exact and complete? Only source-supplied unrounded integers are labelled exact; this is provenance, not an independent audit. Abbreviations are rounded, unavailable fields are null, and explicit source zero is retained. Check statsPrecisionByField.
Are media files downloaded? No. Optional coverUrl / videoDownloadUrl are public first-party source URLs only. They may expire or be unavailable in another region. No download permission or copyright license is implied.
Do I need Kwai login, an external API key or residential proxy? No. There is no Kwai login, downstream Actor or external paid API. Proxy is off by default; only a user-selected proxy is used, and its usage can cost extra.
What happens at a budget cap in strict mode? Intentional item/event/request/time budget stops are recorded as skipped inputs or warnings, not as source failures. failOnPartialFailure still fails genuine empty/failed inputs; any whole run with zero saved videos fails. Saved rows remain available and billable after a later failure.
Does a failed zero-row run have result fees? No video rows means no result-item events, and this Actor has no startup fee. Separate platform usage can still be charged. The event/max-spend budget does not cap that separate usage.
Are duplicates billed? A video ID is saved once within a run, even if found in several inputs. Separate runs create separate snapshots/results.
Collect and use public data lawfully and in accordance with applicable platform terms.