AutomationFlowsWeb Scraping › Search Douyin Videos by Keyword and Get the First Video Detail with Justoneapi

Search Douyin Videos by Keyword and Get the First Video Detail with Justoneapi

Byapisub001 @apisub001 on n8n.io

Use this n8n workflow to search Douyin videos by keyword and get the first video detail with JustOneAPI.

Event trigger★★★★☆ complexity17 nodesHTTP Request
Web Scraping Trigger: Event Nodes: 17 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #15878 — 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 →

Download .json
{
  "id": "0YWrJG43vyJBIF5H",
  "name": "Search Douyin videos and get first video detail with JustOneAPI - Real Response v1",
  "tags": [],
  "nodes": [
    {
      "id": "ef1eeb18-3c6a-4970-9115-662320c5c83f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3616,
        272
      ],
      "parameters": {
        "width": 496,
        "height": 544,
        "content": "## Search Douyin videos and get first video detail with JustOneAPI - Real Response v1\n\n### How it works\n\n1. Triggers workflow execution manually.\n2. Prepares API and search inputs for Douyin video search.\n3. Searches Douyin videos by keyword and retrieves results.\n4. Extracts video IDs from search results.\n5. Fetches details for the first video ID found.\n6. Builds clean output with video details.\n7. Stores final cleaned video detail data.\n\n### Setup steps\n\n- - [ ] Configure JustOneAPI credentials in n8n credentials store\n- [ ] Set base URL for JustOneAPI in workflow variables\n- [ ] Define search keyword parameter in 'Prepare API and Search Inputs' node\n\n### Customization\n\nThe search keyword can be modified in the 'Prepare API and Search Inputs' node. The output format can be adjusted in the 'Build Clean Video Detail Output' node."
      },
      "typeVersion": 1
    },
    {
      "id": "51363fb8-e1c9-4e9e-98bb-a1afd3c7abbc",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4176,
        272
      ],
      "parameters": {
        "color": 7,
        "height": 112,
        "content": "## Workflow Trigger\n\nManually initiates the workflow execution."
      },
      "typeVersion": 1
    },
    {
      "id": "965ae64d-e18a-4713-880e-4435dfb39185",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4464,
        272
      ],
      "parameters": {
        "color": 7,
        "height": 144,
        "content": "## Prepare Search Parameters\n\nConfigures API parameters and prepares search inputs."
      },
      "typeVersion": 1
    },
    {
      "id": "d6b60af4-bd51-4c2d-bda2-d5c5aa069749",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4736,
        272
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 96,
        "content": "## Search Douyin Videos\n\nPerforms API call to search Douyin videos by keyword."
      },
      "typeVersion": 1
    },
    {
      "id": "bd70b639-e1a5-4e66-b25c-ec742052570b",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5424,
        272
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 96,
        "content": "## Process Search Results\n\nExtracts video IDs from search results and stores them."
      },
      "typeVersion": 1
    },
    {
      "id": "b75a6fe2-2c54-4524-bc82-4cd41328a011",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5984,
        272
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 96,
        "content": "## Fetch Video Details\n\nRetrieves detailed information for the first video ID found."
      },
      "typeVersion": 1
    },
    {
      "id": "f181fc75-6b48-447d-8f44-2a02b4fecc4a",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6272,
        272
      ],
      "parameters": {
        "color": 7,
        "height": 96,
        "content": "## Format Video Data\n\nBuilds clean output structure with video details."
      },
      "typeVersion": 1
    },
    {
      "id": "42e07125-f63a-4d4a-8507-2c225dac8187",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6720,
        272
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 96,
        "content": "## Store Final Data\n\nPersists the cleaned video detail data."
      },
      "typeVersion": 1
    },
    {
      "id": "92aba693-9fa5-4f04-a8c9-903b13c066f2",
      "name": "Start Workflow Manually",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        4224,
        464
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "fd3bf89d-0857-4ae2-9c4e-6a9a5ed157e3",
      "name": "Set API and Search Parameters",
      "type": "n8n-nodes-base.set",
      "position": [
        4512,
        464
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "{\n  \"baseUrl\": \"https://api.justoneapi.com\",\n  \"token\": \"YOUR_JUSTONEAPI_TOKEN\",\n  \"keyword\": \"YOUR_SEARCH_KEYWORD\",\n  \"sortType\": \"_0\",\n  \"publishTime\": \"_0\",\n  \"duration\": \"_0\",\n  \"page\": 1,\n  \"searchId\": \"\",\n  \"maxVideos\": 1\n}"
      },
      "typeVersion": 3.4
    },
    {
      "id": "76a3cb20-0034-4bf0-9b04-ac2269375318",
      "name": "Fetch Douyin Video Search Results",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4784,
        464
      ],
      "parameters": {
        "url": "={{$json.baseUrl + '/api/douyin/search-video/v4'}}",
        "options": {
          "redirect": {
            "redirect": {}
          }
        },
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "token",
              "value": "={{$json.token}}"
            },
            {
              "name": "keyword",
              "value": "={{$json.keyword}}"
            },
            {
              "name": "sortType",
              "value": "={{$json.sortType}}"
            },
            {
              "name": "publishTime",
              "value": "={{$json.publishTime}}"
            },
            {
              "name": "duration",
              "value": "={{$json.duration}}"
            },
            {
              "name": "page",
              "value": "={{$json.page}}"
            },
            {
              "name": "searchId",
              "value": "={{$json.searchId}}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "5281e2af-1375-4f62-aeec-ee148e637f39",
      "name": "Store Raw Search Results",
      "type": "n8n-nodes-base.set",
      "position": [
        5136,
        688
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={{$json}}"
      },
      "typeVersion": 3.4
    },
    {
      "id": "15f5ad7c-ff2f-47e4-9747-5006f19b6963",
      "name": "Extract Video IDs from Search",
      "type": "n8n-nodes-base.code",
      "position": [
        5472,
        464
      ],
      "parameters": {
        "jsCode": "const cfg = $('Set API and Search Parameters').first().json;\nconst maxVideos = Math.max(1, Number(cfg.maxVideos || 1));\nconst token = cfg.token;\nconst baseUrl = cfg.baseUrl;\nconst keyword = cfg.keyword;\n\nfunction firstUrl(value) {\n  if (value && Array.isArray(value.url_list) && value.url_list.length > 0) {\n    return value.url_list[0];\n  }\n  return '';\n}\n\nfunction getSearchRoot(input) {\n  if (Array.isArray(input)) return input[0] || {};\n  return input || {};\n}\n\nconst rawSearchResponse = getSearchRoot($input.first().json);\nconst searchData = rawSearchResponse.data || {};\nconst businessData = Array.isArray(searchData.business_data) ? searchData.business_data : [];\n\nconst candidates = [];\n\nfor (const entry of businessData) {\n  const aweme = entry?.data?.aweme_info;\n  if (!aweme || !aweme.aweme_id) continue;\n\n  candidates.push({\n    videoId: String(aweme.aweme_id),\n    dataId: entry.data_id ?? '',\n    providerDocIdStr: entry?.data?.provider_doc_id_str ? String(entry.data.provider_doc_id_str) : '',\n    searchId: entry?.log?.search_id || entry?.data?.log_data?.search_id || '',\n    desc: aweme.desc || '',\n    itemTitle: aweme.item_title || '',\n    caption: aweme.caption || '',\n    createTime: aweme.create_time || null,\n    shareUrl: aweme.share_url || aweme.share_info?.share_url || '',\n    author: {\n      uid: aweme.author?.uid ? String(aweme.author.uid) : '',\n      secUid: aweme.author?.sec_uid || '',\n      nickname: aweme.author?.nickname || '',\n      uniqueId: aweme.author?.unique_id || '',\n      signature: aweme.author?.signature || '',\n      followerCount: aweme.author?.follower_count ?? null,\n      avatarUrl: firstUrl(aweme.author?.avatar_thumb)\n    },\n    statistics: {\n      diggCount: aweme.statistics?.digg_count ?? null,\n      commentCount: aweme.statistics?.comment_count ?? null,\n      shareCount: aweme.statistics?.share_count ?? null,\n      collectCount: aweme.statistics?.collect_count ?? null,\n      downloadCount: aweme.statistics?.download_count ?? null,\n      playCount: aweme.statistics?.play_count ?? null\n    },\n    video: {\n      durationMs: aweme.video?.duration ?? aweme.duration ?? null,\n      coverUrl: firstUrl(aweme.video?.cover),\n      playUrl: firstUrl(aweme.video?.play_addr),\n      downloadUrl: firstUrl(aweme.video?.download_addr)\n    },\n    hashtags: Array.isArray(aweme.text_extra)\n      ? aweme.text_extra.map(tag => ({\n          hashtagName: tag.hashtag_name || '',\n          hashtagId: tag.hashtag_id ? String(tag.hashtag_id) : ''\n        })).filter(tag => tag.hashtagName || tag.hashtagId)\n      : []\n  });\n}\n\nconst selected = candidates.slice(0, maxVideos);\n\nif (selected.length === 0) {\n  return [{\n    json: {\n      baseUrl,\n      token,\n      keyword,\n      videoId: '',\n      videoRank: null,\n      selectedBy: 'data.business_data[].data.aweme_info.aweme_id',\n      error: 'No video ID found in data.business_data[].data.aweme_info.aweme_id.',\n      searchSummary: {\n        keyword: searchData.business_config?.keyword || keyword,\n        hasMore: searchData.business_config?.has_more ?? null,\n        cardCount: searchData.business_config?.card_count ?? null,\n        nextPage: searchData.business_config?.next_page || null,\n        searchId: searchData.business_config?.next_page?.search_id || searchData.log?.search_id || ''\n      },\n      searchCandidates: [],\n      rawSearchResponse\n    }\n  }];\n}\n\nreturn selected.map((candidate, index) => ({\n  json: {\n    baseUrl,\n    token,\n    keyword,\n    videoId: candidate.videoId,\n    videoRank: index + 1,\n    selectedBy: 'data.business_data[].data.aweme_info.aweme_id',\n    selectedSearchVideo: candidate,\n    searchSummary: {\n      keyword: searchData.business_config?.keyword || keyword,\n      hasMore: searchData.business_config?.has_more ?? null,\n      cardCount: searchData.business_config?.card_count ?? null,\n      nextPage: searchData.business_config?.next_page || null,\n      searchId: searchData.business_config?.next_page?.search_id || searchData.log?.search_id || candidate.searchId || ''\n    },\n    searchCandidates: candidates,\n    rawSearchResponse\n  }\n}));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "5c2a0bcb-ea79-4f1c-888d-e84718426a45",
      "name": "Store Extracted Video IDs",
      "type": "n8n-nodes-base.set",
      "position": [
        5808,
        688
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={{$json}}"
      },
      "typeVersion": 3.4
    },
    {
      "id": "3f806da9-0111-48ac-8c36-5ebcd7e7128f",
      "name": "Fetch First Video Details",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        6032,
        464
      ],
      "parameters": {
        "url": "={{$json.baseUrl + '/api/douyin/get-video-detail/v2'}}",
        "options": {
          "redirect": {
            "redirect": {}
          }
        },
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "token",
              "value": "={{$json.token}}"
            },
            {
              "name": "videoId",
              "value": "={{$json.videoId}}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "d74f54a6-d3bd-4578-8d73-4f5f5028b214",
      "name": "Build Clean Video Detail",
      "type": "n8n-nodes-base.code",
      "position": [
        6320,
        464
      ],
      "parameters": {
        "jsCode": "function firstUrl(value) {\n  if (value && Array.isArray(value.url_list) && value.url_list.length > 0) {\n    return value.url_list[0];\n  }\n  return '';\n}\n\nfunction safeParseJson(value) {\n  if (typeof value !== 'string' || value.trim() === '') return null;\n  try {\n    return JSON.parse(value);\n  } catch (error) {\n    return value;\n  }\n}\n\nfunction cleanHashtags(textExtra) {\n  if (!Array.isArray(textExtra)) return [];\n  return textExtra\n    .map(tag => ({\n      hashtagName: tag.hashtag_name || '',\n      hashtagId: tag.hashtag_id ? String(tag.hashtag_id) : '',\n      type: tag.type ?? null\n    }))\n    .filter(tag => tag.hashtagName || tag.hashtagId);\n}\n\nfunction cleanChallenges(chaList) {\n  if (!Array.isArray(chaList)) return [];\n  return chaList\n    .map(challenge => ({\n      challengeId: challenge.cid ? String(challenge.cid) : '',\n      challengeName: challenge.cha_name || '',\n      schema: challenge.schema || '',\n      shareUrl: challenge.share_info?.share_url || ''\n    }))\n    .filter(challenge => challenge.challengeName || challenge.challengeId);\n}\n\nfunction cleanVideoTags(videoTags) {\n  if (!Array.isArray(videoTags)) return [];\n  return videoTags.map(tag => ({\n    tagId: tag.tag_id ?? null,\n    tagName: tag.tag_name || '',\n    level: tag.level ?? null\n  }));\n}\n\nfunction cleanDetail(rawDetailResponse, extracted) {\n  const detailData = rawDetailResponse.data || {};\n  const aweme = detailData.aweme_detail || {};\n\n  return {\n    videoId: aweme.aweme_id ? String(aweme.aweme_id) : extracted.videoId || '',\n    groupId: aweme.group_id ? String(aweme.group_id) : '',\n    secItemId: aweme.sec_item_id || '',\n    desc: aweme.desc || '',\n    itemTitle: aweme.item_title || '',\n    caption: aweme.caption || '',\n    previewTitle: aweme.preview_title || '',\n    createTime: aweme.create_time || null,\n    durationMs: aweme.duration ?? aweme.video?.duration ?? null,\n    shareUrl: aweme.share_url || aweme.share_info?.share_url || '',\n    mediaType: aweme.media_type ?? null,\n    awemeType: aweme.aweme_type ?? null,\n    region: aweme.region || '',\n    city: aweme.city || '',\n    author: {\n      uid: aweme.author?.uid ? String(aweme.author.uid) : '',\n      secUid: aweme.author?.sec_uid || '',\n      shortId: aweme.author?.short_id || '',\n      uniqueId: aweme.author?.unique_id || '',\n      nickname: aweme.author?.nickname || '',\n      signature: aweme.author?.signature || '',\n      gender: aweme.author?.gender ?? null,\n      isVerified: aweme.author?.is_verified ?? null,\n      followerCount: aweme.author?.follower_count ?? null,\n      followingCount: aweme.author?.following_count ?? null,\n      awemeCount: aweme.author?.aweme_count ?? null,\n      totalFavorited: aweme.author?.total_favorited ?? null,\n      avatarThumbUrl: firstUrl(aweme.author?.avatar_thumb),\n      avatarMediumUrl: firstUrl(aweme.author?.avatar_medium),\n      avatarLargerUrl: firstUrl(aweme.author?.avatar_larger)\n    },\n    statistics: {\n      awemeId: aweme.statistics?.aweme_id ? String(aweme.statistics.aweme_id) : '',\n      diggCount: aweme.statistics?.digg_count ?? null,\n      commentCount: aweme.statistics?.comment_count ?? null,\n      shareCount: aweme.statistics?.share_count ?? null,\n      collectCount: aweme.statistics?.collect_count ?? null,\n      downloadCount: aweme.statistics?.download_count ?? null,\n      playCount: aweme.statistics?.play_count ?? null,\n      forwardCount: aweme.statistics?.forward_count ?? null\n    },\n    status: {\n      statusCode: detailData.status_code ?? null,\n      isDelete: aweme.status?.is_delete ?? null,\n      isPrivate: aweme.status?.is_private ?? null,\n      allowShare: aweme.status?.allow_share ?? null,\n      allowComment: aweme.status?.allow_comment ?? null,\n      downloadStatus: aweme.status?.download_status ?? null,\n      reviewed: aweme.status?.reviewed ?? null,\n      listenVideoStatus: aweme.status?.listen_video_status ?? null\n    },\n    videoControl: {\n      allowDownload: aweme.video_control?.allow_download ?? null,\n      allowShare: aweme.video_control?.allow_share ?? null,\n      allowDuet: aweme.video_control?.allow_duet ?? null,\n      allowReact: aweme.video_control?.allow_react ?? null,\n      allowStitch: aweme.video_control?.allow_stitch ?? null,\n      preventDownloadType: aweme.video_control?.prevent_download_type ?? null,\n      downloadFailInfo: aweme.video_control?.download_info?.fail_info || null\n    },\n    video: {\n      coverUrl: firstUrl(aweme.video?.cover),\n      originCoverUrl: firstUrl(aweme.video?.origin_cover),\n      dynamicCoverUrl: firstUrl(aweme.video?.dynamic_cover),\n      playUrl: firstUrl(aweme.video?.play_addr),\n      playH264Url: firstUrl(aweme.video?.play_addr_h264),\n      play265Url: firstUrl(aweme.video?.play_addr_265),\n      downloadUrl: firstUrl(aweme.video?.download_addr),\n      ratio: aweme.video?.ratio || '',\n      format: aweme.video?.format || '',\n      width: aweme.video?.width ?? null,\n      height: aweme.video?.height ?? null,\n      durationMs: aweme.video?.duration ?? null,\n      hasWatermark: aweme.video?.has_watermark ?? null,\n      cdnUrlExpired: aweme.video?.cdn_url_expired ?? null\n    },\n    music: {\n      id: aweme.music?.id_str || (aweme.music?.id ? String(aweme.music.id) : ''),\n      title: aweme.music?.title || '',\n      author: aweme.music?.author || '',\n      ownerId: aweme.music?.owner_id ? String(aweme.music.owner_id) : '',\n      ownerNickname: aweme.music?.owner_nickname || '',\n      duration: aweme.music?.duration ?? null,\n      playUrl: firstUrl(aweme.music?.play_url),\n      coverUrl: firstUrl(aweme.music?.cover_thumb),\n      extra: safeParseJson(aweme.music?.extra)\n    },\n    hashtags: cleanHashtags(aweme.text_extra),\n    challenges: cleanChallenges(aweme.cha_list),\n    videoTags: cleanVideoTags(aweme.video_tag),\n    rawJsonStringFields: {\n      miscInfo: safeParseJson(aweme.misc_info),\n      componentInfoV2: safeParseJson(aweme.component_info_v2),\n      feedCommentCommonFlags: safeParseJson(aweme.feed_comment_config?.common_flags),\n      entertainmentRecommendInfo: safeParseJson(aweme.entertainment_recommend_info),\n      commonBarInfo: safeParseJson(aweme.common_bar_info)\n    }\n  };\n}\n\nconst extracted = $('Extract Video IDs from Search').first().json || {};\nconst rows = $input.all();\n\nreturn rows.map(item => {\n  const rawDetailResponse = item.json || {};\n  const cleanedDetail = cleanDetail(rawDetailResponse, extracted);\n\n  return {\n    json: {\n      workflowStage: 'real-response-mapped-output',\n      requestedKeyword: extracted.keyword || $('Set API and Search Parameters').first().json.keyword || '',\n      requestedVideoId: extracted.videoId || '',\n      selectedVideoRank: extracted.videoRank || 1,\n      main: {\n        videoDetail: cleanedDetail\n      },\n      auxiliary: {\n        selectedSearchVideo: extracted.selectedSearchVideo || null,\n        searchSummary: extracted.searchSummary || null,\n        searchCandidates: extracted.searchCandidates || []\n      },\n      raw: {\n        searchResponse: extracted.rawSearchResponse || {},\n        detailResponse: rawDetailResponse\n      }\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "2bcfe303-748f-4006-adb4-6dc204febb3b",
      "name": "Store Final Video Details",
      "type": "n8n-nodes-base.set",
      "position": [
        6768,
        464
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={{$json}}"
      },
      "typeVersion": 3.4
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "79b9e114-08f5-4b05-9bb0-767b01dd7338",
  "connections": {
    "Start Workflow Manually": {
      "main": [
        [
          {
            "node": "Set API and Search Parameters",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Clean Video Detail": {
      "main": [
        [
          {
            "node": "Store Final Video Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch First Video Details": {
      "main": [
        [
          {
            "node": "Build Clean Video Detail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Video IDs from Search": {
      "main": [
        [
          {
            "node": "Store Extracted Video IDs",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch First Video Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set API and Search Parameters": {
      "main": [
        [
          {
            "node": "Fetch Douyin Video Search Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Douyin Video Search Results": {
      "main": [
        [
          {
            "node": "Store Raw Search Results",
            "type": "main",
            "index": 0
          },
          {
            "node": "Extract Video IDs from Search",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Use this n8n workflow to search Douyin videos by keyword and get the first video detail with JustOneAPI.

Source: https://n8n.io/workflows/15878/ — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

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

Execute Command, Read Write File, HTTP Request +3
Web Scraping

[n8n] Advanced URL Parsing and Shortening Workflow - Switchy.io Integration. Uses splitInBatches, stickyNote, httpRequest, html. Event-driven trigger; 56 nodes.

HTTP Request, GitHub, Stop And Error +1
Web Scraping

[](https://youtu.be/c7yCZhmMjtI)

HTTP Request, GitHub, Stop And Error +1
Web Scraping

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

Google Drive, HTTP Request, Time Saved
Web Scraping

Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest. Event-driven trigger; 51 nodes.

HTTP Request