This workflow corresponds to n8n.io template #16014 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "GR3gKQjULRm803j1",
"name": "Research Kuaishou creator published videos from a keyword with JustOneAPI - real response adjusted",
"tags": [],
"nodes": [
{
"id": "776487ec-0365-48cb-8562-257d56dffd6d",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
4656,
2864
],
"parameters": {
"width": 496,
"height": 480,
"content": "## Research Kuaishou creator published videos from a keyword with JustOneAPI - real response adjusted\n\n### How it works\n\n1. Triggers workflow execution manually\n2. Prepares API and research parameters\n3. Searches Kuaishou users by keyword\n4. Extracts user IDs from search results\n5. Fetches video list for each valid user\n6. Builds and outputs final video list\n\n### Setup steps\n\n- - [ ] Configure JustOneAPI credentials in workflow settings\n- - [ ] Set base URL for Kuaishou API endpoints\n- - [ ] Define search keyword parameter\n\n### Customization\n\nThe keyword parameter can be modified to search for different creator topics. Additional fields can be added to the video list output if needed."
},
"typeVersion": 1
},
{
"id": "3d912ccd-8297-4553-8841-cdd60ae60680",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
5216,
2864
],
"parameters": {
"color": 7,
"height": 112,
"content": "## Workflow Trigger\n\nManually initiates the workflow execution"
},
"typeVersion": 1
},
{
"id": "24e493a4-933a-4cad-90c5-4d9836d8101d",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
5600,
2864
],
"parameters": {
"color": 7,
"width": 336,
"height": 112,
"content": "## Prepare Research Inputs\n\nSets up API parameters and research configuration"
},
"typeVersion": 1
},
{
"id": "b58a352f-6ee8-4471-949d-c412264e59cb",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
6064,
2864
],
"parameters": {
"color": 7,
"width": 496,
"height": 112,
"content": "## Search Kuaishou Users\n\nPerforms keyword search and processes initial results"
},
"typeVersion": 1
},
{
"id": "aff4f042-ae7b-4cb7-b4de-e32fda769673",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
6608,
2864
],
"parameters": {
"color": 7,
"width": 496,
"height": 112,
"content": "## Extract User IDs\n\nParses user IDs from search results and validates them"
},
"typeVersion": 1
},
{
"id": "f40ea170-76e7-432a-a0fc-5ac120258478",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
7120,
2864
],
"parameters": {
"color": 7,
"width": 336,
"height": 112,
"content": "## Conditional User ID Check\n\nVerifies existence of user ID before proceeding"
},
"typeVersion": 1
},
{
"id": "ce72bd93-e08c-4686-b94a-964aec2202a1",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
7472,
2864
],
"parameters": {
"color": 7,
"width": 832,
"height": 112,
"content": "## Fetch Creator Videos\n\nRetrieves complete video list for valid users"
},
"typeVersion": 1
},
{
"id": "4e01b67b-4582-43b8-82e5-7b8a15e32866",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"position": [
5264,
3040
],
"parameters": {},
"typeVersion": 1
},
{
"id": "27da40f0-a594-49c5-8e75-d0e57a963509",
"name": "Prepare API and Research Fields",
"type": "n8n-nodes-base.set",
"position": [
5648,
3040
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "{\n \"baseUrl\": \"https://api.justoneapi.com\",\n \"token\": \"YOUR_JUSTONEAPI_TOKEN\",\n \"keyword\": \"YOUR_SEARCH_KEYWORD\",\n \"page\": 1,\n \"maxUsers\": 1,\n \"pcursor\": \"\"\n}"
},
"typeVersion": 3.4
},
{
"id": "63e8781a-a7bc-4e3b-81f0-9443ba2e2641",
"name": "Search Kuaishou Users by Keyword",
"type": "n8n-nodes-base.httpRequest",
"position": [
6112,
3040
],
"parameters": {
"url": "={{$json.baseUrl + '/api/kuaishou/search-user/v2'}}",
"options": {
"redirect": {
"redirect": {}
}
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "token",
"value": "={{$json.token}}"
},
{
"name": "keyword",
"value": "={{$json.keyword}}"
},
{
"name": "page",
"value": "={{$json.page}}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "0d0fd1b6-6006-491b-aedc-5a396570ddca",
"name": "Output Search User Results",
"type": "n8n-nodes-base.set",
"position": [
6432,
3264
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "={{$json}}"
},
"typeVersion": 3.4
},
{
"id": "64800858-8238-43bb-ac70-e006286da09c",
"name": "Extract User IDs from Search Results",
"type": "n8n-nodes-base.code",
"position": [
6656,
3040
],
"parameters": {
"jsCode": "const root = $input.first().json || {};\nconst config = $('Prepare API and Research Fields').first().json || {};\nconst maxUsers = Math.max(1, Number(config.maxUsers || 1));\nconst seen = new Set();\nconst candidates = [];\n\nfunction getApiResponse(value) {\n if (Array.isArray(value)) return value[0] || {};\n return value || {};\n}\n\nfunction pushCandidate(userId, source, item) {\n if (userId === undefined || userId === null || userId === '') return;\n const normalizedUserId = String(userId).trim();\n if (!normalizedUserId || seen.has(normalizedUserId)) return;\n seen.add(normalizedUserId);\n candidates.push({\n userId: normalizedUserId,\n userIdSource: source,\n searchItem: item || null\n });\n}\n\nconst response = getApiResponse(root);\nconst data = response.data || {};\nconst users = Array.isArray(data.users) ? data.users : [];\n\nfor (const user of users) {\n pushCandidate(user.user_id, 'data.users[].user_id', user);\n if (candidates.length >= maxUsers) break;\n}\n\nconst selected = candidates.slice(0, maxUsers);\n\nif (selected.length === 0) {\n return [\n {\n json: {\n error: 'No userId was extracted from data.users[].user_id in the search response.',\n baseUrl: config.baseUrl,\n token: config.token,\n keyword: config.keyword,\n page: config.page,\n pcursor: config.pcursor,\n maxUsers,\n rawSearchResponse: root\n }\n }\n ];\n}\n\nreturn selected.map(candidate => ({\n json: {\n baseUrl: config.baseUrl,\n token: config.token,\n keyword: config.keyword,\n page: config.page,\n pcursor: config.pcursor,\n maxUsers,\n userId: candidate.userId,\n userIdSource: candidate.userIdSource,\n searchItem: candidate.searchItem,\n rawSearchResponse: root\n }\n}));"
},
"typeVersion": 2
},
{
"id": "aa4f60cc-a560-49a9-bef5-d53b92228378",
"name": "Output Extracted User IDs",
"type": "n8n-nodes-base.set",
"position": [
6976,
3264
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "={{$json}}"
},
"typeVersion": 3.4
},
{
"id": "49f32914-dac2-48f9-8782-70daf8717ec4",
"name": "If User ID Exists",
"type": "n8n-nodes-base.if",
"position": [
7200,
3040
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "da82cc96-baae-4a66-b721-eaf453553942",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{$json.userId}}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "06a08f27-bdb8-4134-830f-f91d8aaa1e31",
"name": "Fetch User Video List from Kuaishou",
"type": "n8n-nodes-base.httpRequest",
"position": [
7488,
3040
],
"parameters": {
"url": "={{$json.baseUrl + '/api/kuaishou/get-user-video-list/v2'}}",
"options": {
"redirect": {
"redirect": {}
}
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "token",
"value": "={{$json.token}}"
},
{
"name": "userId",
"value": "={{$json.userId}}"
},
{
"name": "pcursor",
"value": "={{$json.pcursor}}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "92ab55bd-2a44-440e-a02c-7eb4e7a90242",
"name": "Build Creator Video List Structure",
"type": "n8n-nodes-base.code",
"position": [
7824,
3040
],
"parameters": {
"jsCode": "const rows = $input.all();\nconst extractedRows = $('Extract User IDs from Search Results').all();\nconst config = $('Prepare API and Research Fields').first().json || {};\n\nfunction getApiResponse(value) {\n if (Array.isArray(value)) return value[0] || {};\n return value || {};\n}\n\nfunction firstUrl(list) {\n if (!Array.isArray(list) || list.length === 0) return '';\n const first = list[0];\n if (typeof first === 'string') return first;\n if (first && typeof first === 'object') return first.url || '';\n return '';\n}\n\nfunction getRepresentations(feed) {\n const adaptationSet = feed?.streamManifest?.adaptationSet || [];\n const representations = [];\n for (const set of adaptationSet) {\n for (const rep of (set.representation || [])) {\n representations.push(rep);\n }\n }\n return representations;\n}\n\nfunction normalizeSearchUser(searchItem) {\n if (!searchItem || typeof searchItem !== 'object') return {};\n return {\n userId: searchItem.user_id ?? '',\n userName: searchItem.user_name || '',\n kwaiId: searchItem.kwaiId || '',\n userText: searchItem.user_text || '',\n userSex: searchItem.user_sex || '',\n fansCount: searchItem.fansCount ?? '',\n headUrl: searchItem.headurl || firstUrl(searchItem.headurls),\n verified: searchItem.verified ?? '',\n verifiedDescription: searchItem.verifiedDetail?.description || '',\n isBanned: searchItem.isBanned ?? '',\n following: searchItem.following ?? '',\n isFollowed: searchItem.is_followed ?? '',\n isFavorited: searchItem.isFavorited ?? '',\n messageLink: searchItem.messageLink || '',\n privacy: searchItem.privacy ?? '',\n living: searchItem.living || null\n };\n}\n\nfunction normalizeVideoItem(feed) {\n if (!feed || typeof feed !== 'object') return {};\n const representations = getRepresentations(feed);\n const firstRep = representations[0] || {};\n const soundTrack = feed.soundTrack || {};\n\n return {\n photoId: feed.photo_id ?? '',\n streamVideoId: feed.streamManifest?.videoId || '',\n caption: feed.caption || '',\n authorId: feed.user_id ?? '',\n authorName: feed.user_name || '',\n userSex: feed.user_sex || '',\n verified: feed.verified ?? '',\n following: feed.following ?? '',\n publishTime: feed.time || '',\n timestamp: feed.timestamp ?? '',\n durationMs: feed.duration ?? '',\n type: feed.type ?? '',\n sourcePhotoPage: feed.sourcePhotoPage || '',\n likeCount: feed.like_count ?? '',\n commentCount: feed.comment_count ?? '',\n shareCount: feed.share_count ?? '',\n forwardCount: feed.forward_count ?? '',\n viewCount: feed.view_count ?? '',\n collectCount: feed.collect_count ?? '',\n liked: feed.liked ?? '',\n photoStatus: feed.photo_status ?? '',\n coverUrl: firstUrl(feed.cover_thumbnail_urls),\n firstFrameCoverUrl: firstUrl(feed.ff_cover_thumbnail_urls),\n previewVideoUrl: firstUrl(feed.main_mv_urls),\n videoUrl: firstRep.url || '',\n backupVideoUrls: Array.isArray(firstRep.backupUrl) ? firstRep.backupUrl : [],\n mediaWidth: firstRep.width ?? feed.ext_params?.w ?? '',\n mediaHeight: firstRep.height ?? feed.ext_params?.h ?? '',\n frameRate: firstRep.frameRate ?? feed.ext_params?.interval ?? '',\n qualityLabel: firstRep.qualityLabel || '',\n qualityType: firstRep.qualityType || '',\n soundTrack: {\n name: soundTrack.name || '',\n artist: soundTrack.artist || '',\n duration: soundTrack.duration ?? '',\n photoId: soundTrack.photoId ?? '',\n audioUrl: firstUrl(soundTrack.audioUrls),\n imageUrl: firstUrl(soundTrack.imageUrls),\n userId: soundTrack.user?.user_id ?? '',\n userName: soundTrack.user?.user_name || ''\n },\n tags: Array.isArray(feed.tags) ? feed.tags : [],\n recoTags: Array.isArray(feed.recoTags) ? feed.recoTags : []\n };\n}\n\nreturn rows.map((item, index) => {\n const videoListResponse = item.json || {};\n const extracted = extractedRows[index]?.json || extractedRows[0]?.json || {};\n const videoListApiResponse = getApiResponse(videoListResponse);\n const data = videoListApiResponse.data || {};\n const feeds = Array.isArray(data.feeds) ? data.feeds : [];\n const searchResponse = getApiResponse(extracted.rawSearchResponse);\n const searchUsers = Array.isArray(searchResponse.data?.users) ? searchResponse.data.users : [];\n const searchItem = extracted.searchItem || {};\n\n return {\n json: {\n requestedKeyword: config.keyword || extracted.keyword || '',\n page: extracted.page ?? config.page ?? '',\n requestPcursor: extracted.pcursor ?? config.pcursor ?? '',\n userId: extracted.userId || '',\n userIdSource: extracted.userIdSource || '',\n searchUser: normalizeSearchUser(searchItem),\n creatorVideoList: {\n itemCount: feeds.length,\n nextPcursor: data.pcursor || '',\n llsid: data.llsid || '',\n hostName: data['host-name'] || '',\n result: data.result ?? '',\n videos: feeds.map(normalizeVideoItem)\n },\n debug: {\n searchResultCount: searchUsers.length,\n videoListResult: data.result ?? '',\n videoListItemCount: feeds.length,\n nextPcursor: data.pcursor || '',\n videoListApiCode: videoListApiResponse.code ?? '',\n videoListApiMessage: videoListApiResponse.message ?? '',\n videoListRecordTime: videoListApiResponse.recordTime || ''\n },\n raw: {\n selectedSearchItem: searchItem,\n searchResponse: extracted.rawSearchResponse || null,\n videoListData: data,\n videoListResponse\n }\n }\n };\n});"
},
"typeVersion": 2
},
{
"id": "b10a23c9-e096-4738-b06a-5dca679a663b",
"name": "Output Final Creator Video List",
"type": "n8n-nodes-base.set",
"position": [
8144,
3040
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "={{$json}}"
},
"typeVersion": 3.4
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "61622782-448a-4c79-b452-78df91f76957",
"connections": {
"Manual Trigger": {
"main": [
[
{
"node": "Prepare API and Research Fields",
"type": "main",
"index": 0
}
]
]
},
"If User ID Exists": {
"main": [
[
{
"node": "Fetch User Video List from Kuaishou",
"type": "main",
"index": 0
}
]
]
},
"Prepare API and Research Fields": {
"main": [
[
{
"node": "Search Kuaishou Users by Keyword",
"type": "main",
"index": 0
}
]
]
},
"Search Kuaishou Users by Keyword": {
"main": [
[
{
"node": "Output Search User Results",
"type": "main",
"index": 0
},
{
"node": "Extract User IDs from Search Results",
"type": "main",
"index": 0
}
]
]
},
"Build Creator Video List Structure": {
"main": [
[
{
"node": "Output Final Creator Video List",
"type": "main",
"index": 0
}
]
]
},
"Fetch User Video List from Kuaishou": {
"main": [
[
{
"node": "Build Creator Video List Structure",
"type": "main",
"index": 0
}
]
]
},
"Extract User IDs from Search Results": {
"main": [
[
{
"node": "Output Extracted User IDs",
"type": "main",
"index": 0
},
{
"node": "If User ID Exists",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Use this n8n workflow template to search Kuaishou creators by keyword and get their published video list with JustOneAPI.This template is for creator research teams, marketing teams, creator operations teams, analysts, and automation builders who want to turn a Kuaishou keyword…
Source: https://n8n.io/workflows/16014/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow allows you to import any workflow from a file or another n8n instance and map the credentials easily. A multi-form setup guides you through the entire process At the beginning you have t
[n8n] Advanced URL Parsing and Shortening Workflow - Switchy.io Integration. Uses splitInBatches, stickyNote, httpRequest, html. Event-driven trigger; 56 nodes.
[](https://youtu.be/c7yCZhmMjtI)
This automation organizes your n8n workflows files into categorizes (Active, Template, Done, Archived) and uploads them directly to a categorized Google Drive folders. It is designed to help users man
Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest. Event-driven trigger; 51 nodes.