# Kwai Scraper - Videos, Profiles, Comments & Search (`unfenced-group/kwai-scraper`) Actor

Scrape Kwai videos, creator profiles, comments and keyword search into clean structured data. No login, no API key. 40+ fields per video including engagement counts, video URLs, music and creator details. Pay per result.

- **URL**: https://apify.com/unfenced-group/kwai-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Social media, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Kwai Scraper

![Kwai Scraper](https://api.apify.com/v2/key-value-stores/8Ob7PBCFaGnRziOnq/records/banner.png)

Scrape Kwai (kwai.com) into clean, structured data. Pull full video detail, creator profiles, comment threads, and keyword search results in a single run. No login, no cookies, no API key. You pay only for the results you get.

### Why this scraper

Most Kwai and Kuaishou scrapers either return a thin field set or run on residential proxies and charge accordingly. This one extracts the full public payload Kwai's own website ships, including engagement counts, every video stream variant, music metadata, cover images, dimensions, and creator branding. Because it runs on plain HTTP, the price is among the lowest on the platform.

It targets kwai.com, the international app used across Latin America, the Middle East, and Asia. Handles like `@jadebelchior905` work directly; you do not need internal numeric IDs.

### What you can scrape

- **Search** any keyword and get matching videos with full engagement metrics.
- **Video detail** from a URL or ID: the complete record for a single video.
- **Profiles** from a creator URL.
- **Comments** on any video, with content, like counts, and timestamps.

### Input

| Field | Type | Description |
|---|---|---|
| `searchTerms` | array | Keywords to search. Each returns matching videos. |
| `startUrls` | array | Video URLs return full detail. Profile URLs return the creator record. |
| `profileHandles` | array | Creator handles without the full URL, e.g. `jadebelchior905`. |
| `videoIds` | array | Raw numeric video IDs (photo_id). Alternative to full URLs. |
| `maxItems` | integer | Max videos per search term. 0 for no limit. Default 50. |
| `includeComments` | boolean | Also scrape comments per video. Billed separately. Default false. |
| `maxCommentsPerVideo` | integer | Cap on comments per video. Default 50. |

### Output

Every record has a `recordType` of `video`, `profile`, or `comment`.

#### Video fields

| Field | Description |
|---|---|
| `recordType` | Always `video`. |
| `videoId` | Kwai video ID as a string (precision-safe). |
| `url` | Canonical video URL. |
| `caption` | Video caption. |
| `hashtags` | Hashtags parsed from the caption. |
| `transcript` | Transcript when Kwai provides one, else null. |
| `createTime` | Upload time, ISO 8601. |
| `duration` | Length in seconds. |
| `width`, `height` | Video dimensions. |
| `viewCount` | View count. |
| `likeCount` | Like count. |
| `commentCount` | Comment count. |
| `shareCount` | Share / forward count. |
| `videoUrl` | Playable MP4 URL. |
| `videoUrlVariants` | All available stream URLs. |
| `coverUrl` | Cover thumbnail. |
| `firstFrameUrl` | First-frame image. |
| `musicName` | Track name. |
| `musicArtist` | Track artist. |
| `musicId` | Track ID. |
| `musicUrl` | Audio URL. |
| `authorId` | Creator ID. |
| `authorName` | Creator handle. |
| `authorDisplayName` | Creator display name (detail mode). |
| `authorKwaiId` | Creator's Kwai ID. |
| `authorBio` | Creator bio. |
| `authorAvatar` | Creator avatar URL. |
| `authorVerified` | Verification flag. |
| `authorFollowers` | Follower count (detail mode). |
| `authorFollowerLikes` | Total likes across the creator's videos (detail mode). |
| `authorUrl` | Creator profile URL. |
| `tags` | Content tags. |
| `sourceKeyword` | The search term that produced the row (search mode). |

#### Comment fields

| Field | Description |
|---|---|
| `recordType` | Always `comment`. |
| `videoId` | The video the comment belongs to. |
| `commentId` | Comment ID. |
| `content` | Comment text. |
| `likeCount` | Like count on the comment. |
| `replyCount` | Number of replies. |
| `createTime` | Comment time, ISO 8601. |

Comment author identities are intentionally omitted for privacy.

#### Profile fields

| Field | Description |
|---|---|
| `recordType` | Always `profile`. |
| `handle` | Creator handle. |
| `url` | Profile URL. |
| `profileId` | Creator ID. |
| `displayName` | Creator display name. |
| `bio` | Creator bio. |
| `avatar` | Avatar URL. |
| `followers` | Follower count. |
| `totalLikes` | Total likes across all the creator's videos. |
| `videoCount` | Number of videos posted. |

#### Example record

```json
{
  "recordType": "video",
  "videoId": "5226577472377672739",
  "url": "https://www.kwai.com/@jadebelchior905/video/5226577472377672739",
  "caption": "# tatuagem",
  "hashtags": ["tatuagem"],
  "createTime": "2024-07-31T07:24:42.000Z",
  "duration": 21,
  "width": 720,
  "height": 1280,
  "viewCount": 1284903,
  "likeCount": 41017,
  "commentCount": 94,
  "shareCount": 2640,
  "videoUrl": "https://ak-br-cdn.kwai.net/upic/.../video.mp4",
  "musicName": "Áudio original",
  "authorName": "jadebelchior905",
  "authorVerified": false
}
````

### Examples

**Search for videos**

```json
{ "searchTerms": ["dance", "receita"], "maxItems": 100 }
```

**Full detail for specific videos**

```json
{ "startUrls": [{ "url": "https://www.kwai.com/@jadebelchior905/video/5213629630362183094" }] }
```

**A creator's profile**

```json
{ "profileHandles": ["jadebelchior905"] }
```

**Videos plus their comments**

```json
{ "searchTerms": ["comedy"], "maxItems": 20, "includeComments": true, "maxCommentsPerVideo": 100 }
```

**Scheduled daily run:**

```json
{
  "searchTerms": [
    "dance"
  ],
  "maxItems": 300
}
```

Schedule this input in the Apify Scheduler (for example daily at 07:00) to keep an always-fresh dataset.

### Pricing

You pay per result. Compute and any proxy cost are absorbed by us.

| Event | Price (per 1,000) |
|---|---|
| List / search result | from $1.49 |
| Video detail result | from $4.49 |
| Comment result | from $1.49 |

Higher volume tiers reduce these rates automatically.

### Performance

Runs on plain HTTP, so it is fast and light. A typical run uses well under 100 MB of memory. Search and comment endpoints are paginated; the scraper stops at your `maxItems` and `maxCommentsPerVideo` caps.

### Limitations

- `transcript` is only present when Kwai itself provides one.
- Search returns videos, not users.
- Comment author identities are omitted by design.

### Technical details

The scraper reads the server-rendered data Kwai embeds in its own pages and the public web endpoints its site calls. Video IDs are returned as strings to avoid the precision loss that affects large numeric IDs in JSON.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on Kwai. Each returns matching videos with full engagement metrics. Supports English, Portuguese, Spanish, Arabic, and other languages.

## `startUrls` (type: `array`):

Kwai video URLs (https://www.kwai.com/@handle/video/123...) return full video detail. Profile URLs (https://www.kwai.com/@handle) return the creator's profile and videos.

## `profileHandles` (type: `array`):

Creator handles without the full URL, e.g. jadebelchior905 or @jadebelchior905. An alternative to pasting profile URLs.

## `videoIds` (type: `array`):

Raw numeric Kwai video IDs (photo\_id). Each returns full video detail. An alternative to pasting full URLs.

## `maxItems` (type: `integer`):

Maximum videos returned per search term. Set to 0 for no limit.

## `includeComments` (type: `boolean`):

If enabled, also extract comments for each video. Comments are billed separately.

## `maxCommentsPerVideo` (type: `integer`):

Maximum comments fetched per video. Ignored when Scrape comments is off.

## Actor input object example

```json
{
  "searchTerms": [
    "dance"
  ],
  "maxItems": 100,
  "includeComments": false,
  "maxCommentsPerVideo": 50
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "dance"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/kwai-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["dance"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/kwai-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "dance"
  ],
  "maxItems": 100
}' |
apify call unfenced-group/kwai-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=unfenced-group/kwai-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Kwai Scraper - Videos, Profiles, Comments & Search",
        "description": "Scrape Kwai videos, creator profiles, comments and keyword search into clean structured data. No login, no API key. 40+ fields per video including engagement counts, video URLs, music and creator details. Pay per result.",
        "version": "1.0",
        "x-build-id": "zNZjzst5mbITmtnbU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/unfenced-group~kwai-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-unfenced-group-kwai-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/unfenced-group~kwai-scraper/runs": {
            "post": {
                "operationId": "runs-sync-unfenced-group-kwai-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/unfenced-group~kwai-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-unfenced-group-kwai-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Keywords to search on Kwai. Each returns matching videos with full engagement metrics. Supports English, Portuguese, Spanish, Arabic, and other languages.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Video or profile URLs",
                        "type": "array",
                        "description": "Kwai video URLs (https://www.kwai.com/@handle/video/123...) return full video detail. Profile URLs (https://www.kwai.com/@handle) return the creator's profile and videos.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "profileHandles": {
                        "title": "Profile handles",
                        "type": "array",
                        "description": "Creator handles without the full URL, e.g. jadebelchior905 or @jadebelchior905. An alternative to pasting profile URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "videoIds": {
                        "title": "Video IDs",
                        "type": "array",
                        "description": "Raw numeric Kwai video IDs (photo_id). Each returns full video detail. An alternative to pasting full URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max videos per search term",
                        "minimum": 0,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum videos returned per search term. Set to 0 for no limit.",
                        "default": 100
                    },
                    "includeComments": {
                        "title": "Scrape comments",
                        "type": "boolean",
                        "description": "If enabled, also extract comments for each video. Comments are billed separately.",
                        "default": false
                    },
                    "maxCommentsPerVideo": {
                        "title": "Max comments per video",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum comments fetched per video. Ignored when Scrape comments is off.",
                        "default": 50
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
