This workflow corresponds to n8n.io template #3121 — we link there as the canonical source.
This workflow follows the Discord → HTTP Request recipe pattern — see all workflows that pair these two integrations.
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": "KY0vB3hifSrA24k2",
"meta": {
"templateId": "3121"
},
"name": "AI-Powered Short-Form Video Generator with OpenAI, Flux, Kling, and ElevenLabs and upload to all social networks",
"tags": [],
"nodes": [
{
"id": "e5095169-dc78-4d90-9662-04cfc82c38d9",
"name": "Get image",
"type": "n8n-nodes-base.httpRequest",
"position": [
1160,
480
],
"parameters": {
"url": "=https://api.piapi.ai/api/v1/task/{{ $json.data.task_id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-API-Key",
"value": "={{ $('Set API Keys').item.json['PiAPI Key'] }}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "f477250a-fc8e-407e-a632-cffc0e564596",
"name": "Generate Image",
"type": "n8n-nodes-base.httpRequest",
"position": [
880,
480
],
"parameters": {
"url": "https://api.piapi.ai/api/v1/task",
"body": "={\n \"model\": \"Qubico/flux1-dev\",\n \"task_type\": \"txt2img\",\n \"input\": {\n \"prompt\": \"{{ $('Generate Image Prompts').item.json.choices[0].message.content }} realistic and casual as if taken by an iphone camera by a TikTok influencer\",\n \"negative_prompt\": \"taking a photo of a room, recording a video of a room, photos app, video recorder, illegible text, blurry text, low quality text, DSLR, unnatural\",\n \"width\": 540,\n \"height\": 960\n }\n}",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "raw",
"sendHeaders": true,
"rawContentType": "application/json",
"headerParameters": {
"parameters": [
{
"name": "X-API-Key",
"value": "={{ $('Set API Keys').item.json['PiAPI Key'] }}"
}
]
}
},
"retryOnFail": false,
"typeVersion": 4.2
},
{
"id": "622ce9f5-ad58-485b-a3c6-1265700b04da",
"name": "Image-to-Video",
"type": "n8n-nodes-base.httpRequest",
"position": [
520,
1000
],
"parameters": {
"url": "https://api.piapi.ai/api/v1/task",
"body": "={\n \"model\": \"kling\",\n \"task_type\": \"video_generation\",\n \"input\": {\n \"prompt\": \"{{ $json.data.input.prompt }}\",\n \"negative_prompt\": \"blurry motion, distorted faces, unnatural lighting, over produced, bad quality\",\n \"cfg_scale\": 0.5,\n \"duration\": 5,\n \"mode\": \"pro\",\n \"image_url\": \"{{ $json.data.output.image_url }}\",\n \"version\": \"1.6\",\n \"camera_control\": {\n \"type\": \"simple\",\n \"config\": {\n \"horizontal\": 0,\n \"vertical\": 0,\n \"pan\": 0,\n \"tilt\": 0,\n \"roll\": 0,\n \"zoom\": 5\n }\n }\n },\n \"config\": {}\n}",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "raw",
"sendHeaders": true,
"rawContentType": "application/json",
"headerParameters": {
"parameters": [
{
"name": "X-API-Key",
"value": "={{ $('Set API Keys').item.json['PiAPI Key'] }}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "ed14eac3-1d63-481d-871c-a04c52977fc6",
"name": "Get Video",
"type": "n8n-nodes-base.httpRequest",
"position": [
780,
1000
],
"parameters": {
"url": "=https://api.piapi.ai/api/v1/task/{{ $json.data.task_id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-API-Key",
"value": "={{ $('Set API Keys').item.json['PiAPI Key'] }}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "8b68100c-8a5a-405c-825e-d9e8a898f235",
"name": "List Elements",
"type": "n8n-nodes-base.code",
"position": [
1400,
1040
],
"parameters": {
"jsCode": "return [\n {\n scene_titles: items.map(item => item.json.response.text),\n video_urls: items.map(item => item.json.data.output.video_url),\n input_tokens: $('Calculate Token Usage').first().json.total_prompt_tokens,\n output_tokens: $('Calculate Token Usage').first().json.total_completion_tokens,\n model: $('Generate Image Prompts').first().json.model\n }\n];"
},
"typeVersion": 2
},
{
"id": "f8780885-508e-4dc9-b146-f367297d7b68",
"name": "Wait 10min",
"type": "n8n-nodes-base.wait",
"position": [
660,
1000
],
"parameters": {
"unit": "minutes",
"amount": 10
},
"typeVersion": 1.1
},
{
"id": "6290bc91-0eb9-4053-bd93-961cb9e917c0",
"name": "Wait 3min",
"type": "n8n-nodes-base.wait",
"position": [
1020,
480
],
"parameters": {
"unit": "minutes",
"amount": 3
},
"typeVersion": 1.1
},
{
"id": "818a66ef-b9fa-4efc-85d1-b295300cbed8",
"name": "Wait 5min",
"type": "n8n-nodes-base.wait",
"position": [
1480,
400
],
"parameters": {
"unit": "minutes"
},
"typeVersion": 1.1
},
{
"id": "afd66320-dfe0-4872-a09d-d53fe08152ce",
"name": "Generate voice",
"type": "n8n-nodes-base.httpRequest",
"position": [
880,
1460
],
"parameters": {
"url": "https://api.elevenlabs.io/v1/text-to-speech/onwK4e9ZLuTAKqWW03F9",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"bodyParameters": {
"parameters": [
{
"name": "text",
"value": "={{ $json.choices[0].message.content }}"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "xi-api-key",
"value": "={{ $('Set API Keys').item.json['ElevenLabs API Key'] }}"
}
]
}
},
"retryOnFail": false,
"typeVersion": 4.2
},
{
"id": "916f19e1-7928-4141-a5c5-ca39bd22b0a0",
"name": "List Elements1",
"type": "n8n-nodes-base.code",
"position": [
1400,
1260
],
"parameters": {
"jsCode": "return [\n {\n sound_urls: items.map(item => $('Upload Voice Audio').first().json.webContentLink)\n }\n];"
},
"typeVersion": 2
},
{
"id": "b95fd80c-ec7f-4d50-99ae-f3f544b8a111",
"name": "Fail check",
"type": "n8n-nodes-base.if",
"position": [
920,
1000
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "a920eb54-fc23-4b68-8f56-2eee907a5481",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "failed"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "7e3f5cda-1d49-4a59-956f-f639daf203e0",
"name": "Wait to retry",
"type": "n8n-nodes-base.wait",
"position": [
1060,
960
],
"parameters": {
"unit": "minutes"
},
"typeVersion": 1.1
},
{
"id": "48ec39c9-1802-4860-918d-9c660051f27b",
"name": "Generate Image Prompts",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
400,
560
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "o3-mini",
"cachedResultName": "O3-MINI"
},
"options": {},
"messages": {
"values": [
{
"content": "=You are an advanced, unhinged, hilariously entertaining prompt-generation AI specializing in expanding short POV image prompt ideas into detailed, hyper-realistic prompts optimized for Qubico/flux1-dev. Your task is to take a brief input tied to job seeking, job hunting, or resume building and morph it into a cinematic, immersive prompt locked in a first-person perspective, making the viewer feel they\u2019re living the scene.\n\nNEVER include quotation marks or emojis in your response\u2014flux API will choke on them, and that\u2019s a hard no.\n\nThe topic of this narrative is: {{ $('Load Google Sheet').item.json.idea }}\n\nThe short prompt idea to expand for this image generation is: {{ $json.response.text }}\n\nONLY GENERATE ONE PROMPT PER IDEA\u2014NO COMBINING. In at least one scene, weave in this environment descriptor: {{ $('Load Google Sheet').first().json.environment_prompt }}, but go wild with unhinged, edgy, funny twists elsewhere (skip the cringe or cheesy garbage). Most job hunting happens on laptops or desktops, so prioritize those over phones. If a phone sneaks in, it\u2019s only showing job-related content like email, LinkedIn, a resume, or a job posting\u2014never a photo or video app.\n\nEvery prompt has two parts:\n\nForeground: Kick off with First person view POV GoPro shot of... and show the viewer\u2019s hands, limbs, or feet locked in a job-related action.\n\nBackground: Start with In the background,... and paint the scenery, blending the environment descriptor when required, plus sensory zingers.\n\nTop Rules:\n\nNO quotation marks or emojis\u2014EVER. This is life or death for flux.\nStick to first-person POV\u2014the viewer\u2019s in the driver\u2019s seat, not watching from the sidelines.\nShow a limb (hands, feet) doing something job-focused\u2014typing, holding a resume, adjusting a tie.\nKeep it dynamic, like a GoPro clip, with motion and depth mimicking human vision.\nIf tech\u2019s involved (phone, computer), it\u2019s displaying job-hunting gold\u2014email, job boards, resumes\u2014not random trash.\nNo off-topic actions like recording videos or snapping pics\u2014job hunting only, fam.\nExtra Vibes:\n\nFull-body awareness: Drop hints of physical feels\u2014cramping fingers, racing pulse, slumping shoulders.\nSensory overload: Hit sight, touch, sound, smell, temperature for max realism (coffee whiffs, keyboard clacks).\nWorld grip: Limbs interact with the scene\u2014tapping keys, handing over papers, stepping up.\nKeep it under 1000 characters, one slick sentence, no fluff or formatting.\nMake it entertaining, relatable, with an Andrew Tate viral edge for the down-and-out job hustlers.\nExamples:\n\nInput: Updating a LinkedIn profile after a long day\n\nEnvironment_prompt: Tired, cluttered apartment, laptop glow\n\nOutput: First person view POV GoPro shot of my hands hammering a laptop, cheeto-dusted fingers aching from the grind, the screen flashing my LinkedIn profile with a fresh connection ping; in the background, a trashed apartment lit by the laptop\u2019s ghostly glow, pizza boxes toppling, traffic humming outside, stale takeout stench hitting my nose as my back screams from the hustle.\n\nInput: Handing over a resume at a job fair\n\nEnvironment_prompt: Hopeful, busy convention hall, suits everywhere\n\nOutput: First person view POV GoPro shot of my hand thrusting out a crisp resume, fingers twitching with nerves as it brushes another palm; in the background, a buzzing convention hall packed with suits, coffee fumes and shoe polish in the air, chatter drowning my pounding heart as I lock eyes with the recruiter.\n\nNO QUOTATION MARKS. NO EMOJIS. EVER."
}
]
},
"simplify": false
},
"typeVersion": 1.8
},
{
"id": "5c1b8dc8-4eb3-49fe-81c7-c811d73fac0d",
"name": "Calculate Token Usage",
"type": "n8n-nodes-base.code",
"position": [
700,
560
],
"parameters": {
"jsCode": "// Get all input items (the 5 LLM responses)\nconst items = $input.all();\n\n// Calculate total prompt tokens and total completion tokens\nconst totalPromptTokens = items.reduce((sum, item) => sum + item.json.usage.prompt_tokens, 0);\nconst totalCompletionTokens = items.reduce((sum, item) => sum + item.json.usage.completion_tokens, 0);\n\n// Create new items with original data plus the totals\nconst outputItems = items.map(item => ({\n json: {\n ...item.json, // Spread the original item data\n total_prompt_tokens: totalPromptTokens, // Add total prompt tokens\n total_completion_tokens: totalCompletionTokens // Add total completion tokens\n }\n}));\n\n// Return the modified items\nreturn outputItems;"
},
"typeVersion": 2
},
{
"id": "efc3d0dd-70dc-4fba-b040-22c773ed5602",
"name": "Check for failures",
"type": "n8n-nodes-base.if",
"position": [
1300,
480
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "567d1fc9-0638-4a44-b5f5-30a9a6683794",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "failed"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "3161c993-5696-4419-9299-fde51719dfc7",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
380,
240
],
"parameters": {
"color": 5,
"width": 1260,
"height": 460,
"content": "## 2. \ud83d\uddbc\ufe0fFlux\ub97c \uc0ac\uc6a9\ud558\uc5ec [PiAPI](https://piapi.ai/?via=n8n)\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uae30 \n### (\ucd1d \ube44\uc6a9: $0.0948 \uc57d\ub3c4, 3/9/25 \uae30\uc900) \n1. OpenAI\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc0dd\uc131\ub41c 5\uac1c\uc758 \ucea1\uc158\uc744 \uae30\ubc18\uc73c\ub85c 5\uac1c\uc758 Flux \uc774\ubbf8\uc9c0 \ud504\ub86c\ud504\ud2b8\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc774 \ub178\ub4dc\ub97c \ud3b8\uc9d1\ud558\uc5ec \ud504\ub86c\ud504\ud2b8 \uc9c0\uc2dc\uc0ac\ud56d\uc744 \ubcf4\uac70\ub098 \ud3b8\uc9d1\ud558\uc138\uc694. \n2. \ub2e4\uc74c\uc73c\ub85c, \uc0ac\uc6a9\uc790 \uc815\uc758 JavaScript\ub97c \uc0ac\uc6a9\ud558\uc5ec \uac01 5\ud68c \uc0dd\uc131\uc5d0 \uc0ac\uc6a9\ub41c \ud1a0\ud070 \uc218\ub97c \ud569\uc0b0\ud558\uc5ec \ub098\uc911\uc5d0 \ube44\uc6a9\uc744 \ucd94\uc801\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \n3. \uadf8\ub7f0 \ub2e4\uc74c [PiAPI \uc11c\ube44\uc2a4](https://piapi.ai/?via=n8n)\ub97c \uc0ac\uc6a9\ud558\uc5ec Flux\ub85c \uc774\ubbf8\uc9c0\ub97c \uc0dd\uc131\ud558\uba70, \uc2e4\ud328\ub97c \ud655\uc778\ud558\uace0 \uc2e4\ud328 \uc2dc \uc7ac\uc2dc\ub3c4\ud569\ub2c8\ub2e4. \n\n\uc774\ubbf8\uc9c0 \ubaa8\ub378\uc744 \ubcc0\uacbd\ud558\ub824\uba74 Generate Image \ub178\ub4dc API \ud638\ucd9c\uc744 \ud3b8\uc9d1\ud558\uc138\uc694. \nFlux \ubaa8\ub378 \ubaa9\ub85d (3/9/25 \uae30\uc900): \n- Qubico/flux1-dev ($0.015) - \ud604\uc7ac \uc124\uc815\ub428 \n- Qubico/flux1-schnell ($0.0015) \n- Qubico/flux1-advanced ($0.02) \n\nAPI \uc124\uc815\uc758 \uc804\uccb4 \ubaa9\ub85d\uc740 [Flux API \ubb38\uc11c](https://piapi.ai/docs/flux-api/text-to-image?via=n8n)\ub97c \ucc38\uc870\ud558\uc138\uc694."
},
"typeVersion": 1
},
{
"id": "e5cdec7e-cb75-4200-a8e3-615621d20150",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
480,
720
],
"parameters": {
"color": 6,
"width": 1040,
"height": 500,
"content": "## 3. \ud83c\udfacKling\uc744 \uc0ac\uc6a9\ud558\uc5ec [PiAPI](https://piapi.ai/?via=n8n)\ub85c \ube44\ub514\uc624 \uc0dd\uc131\n\n### (\ucd1d \ube44\uc6a9: $2.30 \uc57d\ub3c4 3/9/25 \uae30\uc900)\n\n1. [PiAPI](https://piapi.ai/?via=n8n)\ub97c \uc0ac\uc6a9\ud558\uc5ec Kling\uc758 \uc774\ubbf8\uc9c0-\ube44\ub514\uc624 \uae30\ub2a5\uc744 \uc774\uc6a9\ud574 \uac01 \uc774\ubbf8\uc9c0\uc5d0\uc11c \ube44\ub514\uc624\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.\n\n2. \uadf8\ub7f0 \ub2e4\uc74c \uc2e4\ud328\ub97c \ud655\uc778\ud558\uae30 \uc704\ud574 \uae30\ub2e4\ub9ac\uace0, \uc2e4\ud328\ud55c \uacbd\uc6b0 \uc0dd\uc131\uc744 \ubc18\ubcf5\ud569\ub2c8\ub2e4.\n\nImage-to-Video \ub178\ub4dc\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \ube44\ub514\uc624 \ubaa8\ub378\uc744 \ud3b8\uc9d1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud14c\uc2a4\ud2b8\ub97c \uc704\ud574, \ub354 \ub0ae\uc740 \ud488\uc9c8\uacfc \ub354 \uc800\ub834\ud55c \uac00\uaca9\uc744 \uc704\ud574 pro\uc5d0\uc11c std\ub85c \uc804\ud658\ud558\ub294 \uac83\uc744 \ucd94\ucc9c\ud569\ub2c8\ub2e4.\n\n\uc0ac\uc6a9 \uac00\ub2a5\ud55c Kling \ubaa8\ub378 (3/9/25 \uae30\uc900):\n\n- std (\ud45c\uc900) 5\ucd08 \ube44\ub514\uc624\ub2f9 $0.26\n\n- pro (\uc804\ubb38) 5\ucd08 \ube44\ub514\uc624\ub2f9 $0.46 - \ud604\uc7ac \uc124\uc815\ub428\n\nAPI \uc124\uc815\uc758 \uc804\uccb4 \ubaa9\ub85d\uc740 [Kling API Documentation](https://piapi.ai/docs/kling-api/create-task?via=n8n)\uc744 \ucc38\uc870\ud558\uc138\uc694."
},
"typeVersion": 1
},
{
"id": "8404a390-a402-4703-8cb5-4a54490dc7bd",
"name": "Generate Video Captions",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
-40,
1220
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "GPT-4O-MINI"
},
"options": {},
"messages": {
"values": [
{
"role": "system",
"content": "DO NOT include any quotation marks in your response. Do not put a quote at the beginning or the end of your response.\n\nYou are a prompt-generation AI specializing in crafting unhinged, entertaining TikTok captions for a \"day in the life\" POV story about job hunting or resume writing. Generate five concise, action-driven captions (5-10 words each) that follow a Problem > Action > Reward structure. The first caption should be a shocking or funny hook, and the last should conclude with a satisfying reward. Use emojis sparingly\u2014only one per caption at most, and only when they add impact; skip them if they don\u2019t enhance the message.\n\nGuidelines:\n\nPerspective: Always first-person POV, immersing the viewer in the story.\nTone: Channel Andrew Tate mixed with Charlie Sheen\u2014cursing and sexual innuendos are fair game.\nContent: Focus on job seeking, hunting, or resume building, spotlighting AI as the game-changer.\nNarrative: Start with the grind of unemployment or a shitty job, pivot to using AI for resumes and cover letters, and end with scoring the dream gig.\nScenes: Highlight raw, emotional moments\u2014skip the boring stuff.\nYour captions should be wild and entertaining, not polished or professional. The first caption is the hook\u2014make it shocking, hilarious, or ballsy, something Andrew Tate would growl. Use emojis sparingly\u2014max one per caption, only if it hits harder with it.\n\nYour response should be a list of 5 items separated by \"\\n\" (for example: \"item1\\nitem2\\nitem3\\nitem4\\nitem5\")"
},
{
"content": "={{ $json.idea }}"
}
]
},
"simplify": false
},
"typeVersion": 1.8
},
{
"id": "f614c784-a3ee-4eb8-aee3-cc0ad3e87556",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
480,
1240
],
"parameters": {
"color": 4,
"width": 1040,
"height": 400,
"content": "## 4. \ud83d\udd09Eleven Labs\ub97c \uc0ac\uc6a9\ud55c \uc74c\uc131 \uc624\ubc84 \uc0dd\uc131 [Eleven Labs](https://try.elevenlabs.io/n8n)\n\n1. OpenAI API\ub97c \uc0ac\uc6a9\ud558\uc5ec \ucea1\uc158\uacfc \uad00\ub828\ub41c \uc7ac\ubbf8\uc788\ub294 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc774 \ub178\ub4dc\ub97c \uc5f4\uc5b4 \ud504\ub86c\ud504\ud2b8 \uc9c0\uc2dc\uc0ac\ud56d\uc744 \ubcf4\uac70\ub098 \ud3b8\uc9d1\ud558\uc138\uc694. \n\n2. \uadf8\ub7f0 \ub2e4\uc74c [Eleven Labs API](https://try.elevenlabs.io/n8n)\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc74c\uc131 \uc624\ubc84\ub97c \uc0dd\uc131\ud558\uace0, \ub2e4\uc74c \ub2e8\uacc4\uc5d0\uc11c \uc811\uadfc\ud560 \uc218 \uc788\ub3c4\ub85d Google Drive\uc5d0 \uc5c5\ub85c\ub4dc\ud569\ub2c8\ub2e4.\n\n\uc74c\uc131\uc744 \uad50\uccb4\ud558\ub824\uba74, [Eleven Labs](https://try.elevenlabs.io/n8n)\uc5d0\uc11c \uc0ac\uc6a9\ud558\uace0 \uc2f6\uc740 \uc74c\uc131\uc758 voice ID\ub97c \ucc3e\uc740 \ud6c4, Generate Voice \ub178\ub4dc\uc758 URL\uc744 https://api.elevenlabs.io/v1/text-to-speech/{voice ID here}\ub85c \ubcc0\uacbd\ud558\uc138\uc694.\n\nAPI \uc124\uc815\uc758 \uc804\uccb4 \ubaa9\ub85d\uc740 [Eleven Labs API Documentation](https://elevenlabs.io/docs/api-reference/text-to-speech/convert)\uc744 \ucc38\uc870\ud558\uc138\uc694."
},
"typeVersion": 1
},
{
"id": "e59306c1-8efe-4d98-9391-10c68c17787b",
"name": "Match captions with videos",
"type": "n8n-nodes-base.merge",
"position": [
1240,
1040
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3
},
{
"id": "8da7e16e-691b-4335-bfc7-e196c36f982d",
"name": "Generate Script",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
520,
1460
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "GPT-4O-MINI"
},
"options": {},
"messages": {
"values": [
{
"role": "system",
"content": "=You are an unhinged and hilarious TikTok influencer who's like a mix of Andrew Tate and Charlie Sheen. The user is going to provide you with a topic, and then 5 different parts of a story. Your task is to narrate the story as this hilarious character, who isn't afraid to be edgy or curse or use sexual innuendos. However keep each of the 5 talking points brief, as you only have about 5 seconds to speak during each. The entire length of your narration should be around 15 seconds.\n\nEach line item of the users message represents 1 5 second clip, so your response needs to be able to quickly and easily be spoken in those time constraints. Don't say extra things you don't need to. Just quickly tell the story, in order, and make it unhinged, funny, entertaining, and potentially controversially viral. Don't worry about offendeding anyone. Andrew Tate style it.\n\nDo not include any emojis, as your response will be converted from text to speech, so anything but text and punctuation isn't neccesary. Also, don't make your jokes overly corny, speak in a witty, edgy, funny way, but no corny dad jokes or anything cringe."
},
{
"content": "={{ $('Generate Video Captions').item.json.choices[0].message.content }}"
}
]
},
"simplify": false
},
"executeOnce": true,
"typeVersion": 1.8
},
{
"id": "ad87317d-3ed0-4fdf-aea5-7b2fa60fb59f",
"name": "Upload Voice Audio",
"type": "n8n-nodes-base.googleDrive",
"position": [
1080,
1460
],
"parameters": {
"name": "={{ $('Load Google Sheet').item.json.id }}-voiceover.mp3",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1w1EQ8xyth6w7AbX2wpDI3vInfYeRy8vH",
"cachedResultUrl": "https://drive.google.com/drive/folders/1w1EQ8xyth6w7AbX2wpDI3vInfYeRy8vH",
"cachedResultName": "Resume Studio"
}
},
"typeVersion": 3
},
{
"id": "eec529e9-2601-4f7b-b415-63d2ebba1574",
"name": "Set Access Permissions",
"type": "n8n-nodes-base.googleDrive",
"position": [
1260,
1460
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "share",
"permissionsUi": {
"permissionsValues": {
"role": "writer",
"type": "anyone",
"allowFileDiscovery": true
}
}
},
"typeVersion": 3
},
{
"id": "63e72d56-140e-47d8-9f72-b58c764deed9",
"name": "Pair Videos with Audio",
"type": "n8n-nodes-base.merge",
"position": [
1620,
1140
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3
},
{
"id": "60a80c6f-0385-48e6-9b71-c23a74cbc15c",
"name": "Render Final Video",
"type": "n8n-nodes-base.httpRequest",
"position": [
1800,
1140
],
"parameters": {
"url": "https://api.creatomate.com/v1/renders",
"body": "={\n \"template_id\": \"{{ $('Set API Keys').item.json['Creatomate Template ID'] }}\",\n \"modifications\": {\n \n \"Video-1.source\": \"{{ $json.video_urls[0] }}\",\n \"Video-2.source\": \"{{ $json.video_urls[1] }}\",\n \"Video-3.source\": \"{{ $json.video_urls[2] }}\",\n \"Video-4.source\": \"{{ $json.video_urls[3] }}\",\n \"Video-5.source\": \"{{ $json.video_urls[4] }}\",\n\n \"Audio-1.source\": \"{{ $json.sound_urls[0] }}\",\n\n \"Text-1.text\": \"{{ $json.scene_titles[0] }}\",\n \"Text-2.text\": \"{{ $json.scene_titles[1] }}\",\n \"Text-3.text\": \"{{ $json.scene_titles[2] }}\",\n \"Text-4.text\": \"{{ $json.scene_titles[3] }}\",\n \"Text-5.text\": \"{{ $json.scene_titles[4] }}\"\n }\n}",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "raw",
"sendHeaders": true,
"rawContentType": "application/json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{ $('Set API Keys').item.json['Creatomate API Key'] }}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"executeOnce": true,
"typeVersion": 4.2
},
{
"id": "89c0e958-7690-4f3d-af49-3e9776f2c979",
"name": "Notify me on Discord",
"type": "n8n-nodes-base.discord",
"position": [
2780,
1140
],
"parameters": {
"content": "=A new Resume Studio POV video has been created: {{ $json.final_output }}",
"options": {},
"authentication": "webhook"
},
"typeVersion": 2
},
{
"id": "14a09794-5e02-4880-b33d-139a91726dda",
"name": "Once Per Day",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-600,
1220
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 7
}
]
}
},
"typeVersion": 1.2
},
{
"id": "4de1f1c7-52ad-4e00-ad22-b4c3c0f718d8",
"name": "Load Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
-180,
1220
],
"parameters": {
"options": {
"returnFirstMatch": true
},
"filtersUI": {
"values": [
{
"lookupValue": "for production",
"lookupColumn": "production"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1cjd8p_yx-M-3gWLEd5TargtoB35cW-3y66AOTNMQrrM/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1cjd8p_yx-M-3gWLEd5TargtoB35cW-3y66AOTNMQrrM",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1cjd8p_yx-M-3gWLEd5TargtoB35cW-3y66AOTNMQrrM/edit?usp=drivesdk",
"cachedResultName": "Sheet Template"
}
},
"typeVersion": 4.5,
"alwaysOutputData": true
},
{
"id": "e5c83690-1696-43aa-a0db-164ca128dd67",
"name": "Create List",
"type": "n8n-nodes-base.code",
"position": [
280,
1140
],
"parameters": {
"jsCode": "// Get the text directly from the OpenAI response\nconst text = $input.first().json.choices[0].message.content;\n\n// Split the text on literal '\\\\n', trim, and filter empty lines\nconst lines = text.split('\\\\n').map(line => line.trim()).filter(line => line !== '');\n\n// Create an array of items for n8n\nconst items = lines.map(line => ({\n json: {\n response: { text: line }\n }\n}));\n\n// Return the array of items\nreturn items;"
},
"typeVersion": 2
},
{
"id": "ed99df67-2068-4c8b-a6ba-e67d234f03c4",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1560,
920
],
"parameters": {
"color": 3,
"width": 1360,
"height": 380,
"content": "## 5. \ud83d\udce5[Creatomate](https://creatomate.com/)\uc73c\ub85c \ube44\ub514\uc624 \uc644\uc131 \n### (\ucd1d \ube44\uc6a9: Essential \ud50c\ub79c \ud06c\ub808\ub527\uc73c\ub85c \uc57d $0.38 | \ubb34\ub8cc \uccb4\ud5d8 \ud06c\ub808\ub527 \uc81c\uacf5) \n1. \uba3c\uc800, \ube44\ub514\uc624/\ucea1\uc158 \ubaa9\ub85d\uc744 \uc0dd\uc131\ub41c \uc74c\uc131 \uc624\ubc84\uc640 \uacb0\ud569\ud558\uc5ec \ubaa8\ub4e0 3 \uc694\uc18c\ub97c \ud3ec\ud568\ud558\ub294 \ub2e8\uc77c \ud56d\ubaa9\uc73c\ub85c \ub9cc\ub4ed\ub2c8\ub2e4. \n2. \uadf8\ub7f0 \ub2e4\uc74c, \uc9c0\uc815\ud55c Creatomate \ud15c\ud50c\ub9bf ID\ub85c \uc804\ub2ec\ub418\uc5b4 \ud15c\ud50c\ub9bf\uc758 \ucea1\uc158/\ube44\ub514\uc624/\uc624\ub514\uc624\ub97c \uc0dd\uc131\ub41c \uac83\uc73c\ub85c \uad50\uccb4\ud569\ub2c8\ub2e4. \n3. \ube44\ub514\uc624 \ub80c\ub354\ub9c1\uc774 \uc644\ub8cc\ub418\uba74 Google Drive\uc5d0 \uc5c5\ub85c\ub4dc\ub418\uace0 \ub9c1\ud06c\ub85c \uc811\uadfc\ud560 \uc218 \uc788\ub3c4\ub85d \uad8c\ud55c\uc774 \uc124\uc815\ub429\ub2c8\ub2e4. \n4. \uadf8\ub7f0 \ub2e4\uc74c, \uc6d0\ub798 Google Sheet \ud15c\ud50c\ub9bf\uc744 \uc6b0\ub9ac\uc758 \uc0dd\uc131 \uc815\ubcf4\ub85c \uc5c5\ub370\uc774\ud2b8\ud558\uba70, \ube44\uc6a9 \uacc4\uc0b0\uc744 \uc704\ud55c \ud1a0\ud070\uc744 \ud3ec\ud568\ud558\uace0 \uc774 \uc544\uc774\ub514\uc5b4\ub97c \uc644\ub8cc\ub41c \uac83\uc73c\ub85c \ud45c\uc2dc\ud569\ub2c8\ub2e4. \n5. \ub9c8\uc9c0\ub9c9\uc73c\ub85c, \ube44\ub514\uc624\uac00 \ub2e4\uc6b4\ub85c\ub4dc \ubc0f \uc0ac\uc6a9 \uc900\ube44\uac00 \ub418\uba74 [Discord \uc11c\ubc84 \uc6f9\ud6c5](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks)\uc744 \ud1b5\ud574 \uc54c\ub9bc\uc744 \ubcf4\ub0c5\ub2c8\ub2e4!"
},
"typeVersion": 1
},
{
"id": "e7064a56-c500-4f9f-a54a-c4352c263b56",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
280
],
"parameters": {
"width": 620,
"height": 420,
"content": "# \ud83e\udd16 OpenAI, Flux, Kling \ubc0f ElevenLabs\ub97c \uc0ac\uc6a9\ud55c AI \uae30\ubc18 \ub2e8\ud3b8 \ube44\ub514\uc624 \uc0dd\uc131\uae30\n\n## \ud83d\udcc3\uc2dc\uc791\ud558\uae30 \uc804\uc5d0, \ub2e4\uc74c\uc774 \ud544\uc694\ud569\ub2c8\ub2e4:\n- [n8n \uc124\uce58](https://n8n.partnerlinks.io/n8nTTVideoGenTemplate) (\ubc84\uc804 1.81.4\uc5d0\uc11c \ud14c\uc2a4\ud2b8\ub428)\n- [OpenAI API \ud0a4](https://platform.openai.com/api-keys) (\ubb34\ub8cc \uccb4\ud5d8 \ud06c\ub808\ub527 \uc81c\uacf5)\n- [PiAPI](https://piapi.ai/?via=n8n) (\ubb34\ub8cc \uccb4\ud5d8 \ud06c\ub808\ub527 \uc81c\uacf5)\n- [Eleven Labs](https://try.elevenlabs.io/n8n) (\ubb34\ub8cc \uacc4\uc815)\n- [Creatomate API \ud0a4](https://creatomate.com/) (\ubb34\ub8cc \uccb4\ud5d8 \ud06c\ub808\ub527 \uc81c\uacf5)\n- Google Sheets API\ub97c [Google Cloud Console](https://console.cloud.google.com/apis/api/sheets.googleapis.com/overview)\uc5d0\uc11c \ud65c\uc131\ud654\n- Google Drive API\ub97c [Google Cloud Console](https://console.cloud.google.com/apis/api/drive.googleapis.com/overview)\uc5d0\uc11c \ud65c\uc131\ud654\n- [Google Cloud Console \uc790\uaca9\uc99d\uba85](https://console.cloud.google.com/apis/credentials)\uc5d0\uc11c OAuth 2.0 \ud074\ub77c\uc774\uc5b8\ud2b8 ID \ubc0f \ud074\ub77c\uc774\uc5b8\ud2b8 \uc2dc\ud06c\ub9bf"
},
"typeVersion": 1
},
{
"id": "4ddb7249-9785-4f51-b35c-b9a0c6a66e3b",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-480,
780
],
"parameters": {
"color": 7,
"width": 920,
"height": 700,
"content": "## 1. \ud83d\udde8\ufe0fGoogle \uc2dc\ud2b8\uc758 \uc544\uc774\ub514\uc5b4\uc5d0\uc11c \ube44\ub514\uc624 \ucea1\uc158\uc744 \uc0dd\uc131\ud558\uae30\n\n1. [PiAPI](https://piapi.ai/?via=n8n), [Eleven Labs](https://try.elevenlabs.io/n8n), [Creatomate](https://creatomate.com/)\uc758 API \ud0a4\ub97c \uc124\uc815\ud558\uc138\uc694.\n- Creatomate \uacc4\uc815\uc5d0 \ub85c\uadf8\uc778\ud55c \ud6c4, \uc0c8 \ube44\ub514\uc624 \ud15c\ud50c\ub9bf\uc744 \ub9cc\ub4e4\uace0 \uc624\ub978\ucabd \uc0c1\ub2e8\uc758 \"source code\"\ub97c \ud074\ub9ad\ud558\uc138\uc694. [\uc774 JSON \ucf54\ub4dc](https://pastebin.com/c7aMTeLK)\ub97c \ubd99\uc5ec\ub123\uc73c\uc138\uc694. \uc774\ub294 \uc774 \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc758 \uc608\uc2dc \ud15c\ud50c\ub9bf\uc774 \ub429\ub2c8\ub2e4.\n- Creatomate \ud15c\ud50c\ub9bf\uc5d0\uc11c \uc624\ub978\ucabd \uc0c1\ub2e8\uc758 \"Use Template\" \ubc84\ud2bc\uc744 \ud074\ub9ad\ud55c \ud6c4 \"API Integration\"\uc744 \ud074\ub9ad\ud558\uba74 template_id\ub97c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uac12\uc744 Set API Keys \ub178\ub4dc\uc758 Creatomate Template ID\ub85c \uc124\uc815\ud558\uc138\uc694.\n\n2. \ub2e4\uc74c \ub178\ub4dc\ub294 Google \uc2dc\ud2b8\ub97c \ubd88\ub7ec\uc635\ub2c8\ub2e4. [Google \uc2dc\ud2b8 \ud15c\ud50c\ub9bf](https://docs.google.com/spreadsheets/d/1cjd8p_yx-M-3gWLEd5TargtoB35cW-3y66AOTNMQrrM/edit?usp=sharing)\uc744 \ubcf5\uc0ac\ud558\uc138\uc694. File > Make a copy\ub97c \uc120\ud0dd\ud558\uc138\uc694. \uadf8\ub7f0 \ub2e4\uc74c Google Sheets \ub178\ub4dc\uc5d0\uc11c \ubcf5\uc0ac\ud55c \uc2dc\ud2b8 \ud15c\ud50c\ub9bf\uc5d0 \uc5f0\uacb0\ud558\uc138\uc694.\n\n3. \ub2e4\uc74c\uc73c\ub85c, OpenAI\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ub514\uc624 \uc544\uc774\ub514\uc5b4\uc5d0 \ub300\ud574 5\uac1c\uc758 \ucea1\uc158\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc774 \ub178\ub4dc\ub97c \ud3b8\uc9d1\ud558\uc5ec \ud504\ub86c\ud504\ud2b8\ub97c \ud655\uc778\ud558\uace0 \ud544\uc694\uc5d0 \ub530\ub77c \ubcc0\uacbd\ud558\uc138\uc694.\n\n4. \ub9c8\uc9c0\ub9c9 \ub450 \ub178\ub4dc\uc5d0\uc11c, \uc0ac\uc6a9\uc790 \uc815\uc758 JavaScript \ucf54\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec OpenAI \uc751\ub2f5\uc744 \ubaa9\ub85d\uc73c\ub85c \ubcc0\ud658\ud569\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c, \ubaa9\ub85d\uc774 \uc62c\ubc14\ub974\uac8c \ud615\uc131\ub418\uc5c8\ub294\uc9c0 \uac80\uc99d\ud569\ub2c8\ub2e4(OpenAI\uac00 \uc9c0\uc2dc\ub97c \ub530\ub974\uc9c0 \ubabb\ud55c \uacbd\uc6b0\ub97c \ub300\ube44\ud558\uc5ec)."
},
"typeVersion": 1
},
{
"id": "57ee2f8f-5371-4dab-b661-c58b25c7dd55",
"name": "Wait1",
"type": "n8n-nodes-base.wait",
"position": [
1920,
1140
],
"parameters": {
"unit": "minutes",
"amount": 3
},
"typeVersion": 1.1
},
{
"id": "33781e51-ef30-437b-8499-94e39bfb38fa",
"name": "Get Final Video",
"type": "n8n-nodes-base.httpRequest",
"position": [
2040,
1140
],
"parameters": {
"url": "=https://api.creatomate.com/v1/renders/{{ $('Render Final Video').item.json.id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{ $('Set API Keys').item.json['Creatomate API Key'] }}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"executeOnce": true,
"typeVersion": 4.2
},
{
"id": "b0d0fe6f-39c2-4da6-9fcf-b0151ed2c351",
"name": "Upload Final Video",
"type": "n8n-nodes-base.googleDrive",
"position": [
2300,
1140
],
"parameters": {
"name": "=POV-{{ $('Render Final Video').item.json.id }}.mp4",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1w1EQ8xyth6w7AbX2wpDI3vInfYeRy8vH",
"cachedResultUrl": "https://drive.google.com/drive/folders/1w1EQ8xyth6w7AbX2wpDI3vInfYeRy8vH",
"cachedResultName": "Resume Studio"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "3893d1de-7464-48ad-91a3-14b867c2a516",
"name": "Get Raw File",
"type": "n8n-nodes-base.httpRequest",
"position": [
2160,
1140
],
"parameters": {
"url": "={{ $json.url }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"typeVersion": 4.2
},
{
"id": "74de5f28-f081-4ec5-a47e-681eb845f701",
"name": "Set Permissions",
"type": "n8n-nodes-base.googleDrive",
"position": [
2440,
1140
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "share",
"permissionsUi": {
"permissionsValues": {
"role": "writer",
"type": "anyone",
"allowFileDiscovery": true
}
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "a2c07158-e949-4b5b-a92e-f4b021742831",
"name": "Update Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
2600,
1140
],
"parameters": {
"columns": {
"value": {
"id": "={{ $('Load Google Sheet').first().json.id }}",
"width": "={{ $('Get Raw File').item.json.width }}",
"height": "={{ $('Get Raw File').item.json.height }}",
"model1": "={{ $('Generate Video Captions').item.json.model }}",
"model2": "={{ $('Pair Videos with Audio').item.json.model }}",
"model3": "={{ $('Generate Script').item.json.model }}",
"duration": "={{ $('Get Raw File').item.json.duration }}",
"fluxCost": "0.075",
"frameRate": "={{ $('Get Raw File').item.json.frame_rate }}",
"klingCost": "2.3",
"production": "done",
"publishing": "for publishing",
"final_output": "={{ $('Upload Final Video').item.json.webContentLink }}",
"prompt1 input tokens": "={{ $('Generate Video Captions').item.json.usage.prompt_tokens }}",
"prompt2 input tokens": "={{ $('Pair Videos with Audio').item.json.input_tokens }}",
"prompt3 input tokens": "={{ $('Generate Script').item.json.usage.prompt_tokens }}",
"prompt1 output tokens": "={{ $('Generate Video Captions').item.json.usage.completion_tokens }}",
"prompt2 output tokens": "={{ $('Pair Videos with Audio').item.json.output_tokens }}",
"prompt3 output tokens": "={{ $('Generate Script').item.json.usage.completion_tokens }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "id",
"defaultMatch": true,
"canBeUsedToMatch": true
},
{
"id": "idea",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "idea",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "caption",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "caption",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "production",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "production",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "environment_prompt",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "environment_prompt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "publishing",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "publishing",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "final_output",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "final_output",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "width",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "width",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "height",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "height",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "duration",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "duration",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "frameRate",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "frameRate",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "model1",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "model1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "prompt1 input tokens",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "prompt1 input tokens",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "prompt1 output tokens",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "prompt1 output tokens",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "model1 cost",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "model1 cost",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "model2",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "model2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "prompt2 input tokens",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "prompt2 input tokens",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "prompt2 output tokens",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "prompt2 output tokens",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "model2 cost",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "model2 cost",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "model3",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "model3",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "prompt3 input tokens",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "prompt3 input tokens",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "prompt3 output tokens",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "prompt3 output tokens",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "model3 cost",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "model3 cost",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "cmCost",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "cmCost",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "upgradeCmCost",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "upgradeCmCost",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "fluxCost",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "fluxCost",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "klingCost",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "klingCost",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "totalCost",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "totalCost",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "datePosted",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "datePosted",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1cjd8p_yx-M-3gWLEd5TargtoB35cW-3y66AOTNMQrrM/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1cjd8p_yx-M-3gWLEd5TargtoB35cW-3y66AOTNMQrrM",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1cjd8p_yx-M-3gWLEd5TargtoB35cW-3y66AOTNMQrrM/edit?usp=drivesdk",
"cachedResultName": "Sheet Template"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "62423325-f9da-4cdf-8864-c011fb4fa14f",
"name": "Set API Keys",
"type": "n8n-nodes-base.set",
"notes": "SET BEFORE STARTING",
"position": [
-380,
1220
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "35659353-d8e2-4677-876b-401b549605a0",
"name": "PiAPI Key",
"type": "string",
"value": ""
},
{
"id": "c4927dd6-c597-48fe-b7c1-bbffcf5ff02f",
"name": "ElevenLabs API Key",
"type": "string",
"value": ""
},
{
"id": "f5e90c05-dd24-4918-9005-4c87a4fb344d",
"name": "Creatomate API Key",
"type": "string",
"value": ""
},
{
"id": "d0ebba50-5a99-4090-adcb-d18aa0b21be2",
"name": "Creatomate Template ID",
"type": "string",
"value": ""
}
]
}
},
"notesInFlow": true,
"typeVersion": 3.4
},
{
"id": "4252d793-5f16-4d5e-bb78-9b155aef5d3e",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-440,
1160
],
"parameters": {
"color": 3,
"width": 220,
"height": 220,
"content": "\uc774\uac83\uc744 \uba3c\uc800 \ud558\uc138\uc694"
},
"typeVersion": 1
},
{
"id": "845d5b4a-8a3f-4d0d-afce-39aa4e349a7b",
"name": "Validate list formatting",
"type": "n8n-nodes-base.if",
"position": [
280,
1280
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2681c0e9-aa45-4f0f-8933-6e6de324c7aa",
"operator": {
"type": "array",
"operation": "lengthGt",
"rightType": "number"
},
"leftValue": "={{$input.all()}}",
"rightValue": 1
}
]
}
},
"typeVersion": 2.2
},
{
"id": "98a3761e-544a-473c-aa7f-cc14390750d8",
"name": "Get Audio from Video",
"type": "@n8n/n8n-nodes-langchain.openAi",
"notes": "Extract the audio from video for generate the description",
"position": [
3820,
1360
],
"parameters": {
"options": {},
"resource": "audio",
"operation": "transcribe"
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 5000
},
{
"id": "ec498643-1ef1-42e5-90ee-ec49d0e2b63b",
"name": "Generate Description for Videos in Tiktok and Instagram",
"type": "@n8n/n8n-nodes-langchain.openAi",
"notes": "Request to OpenAi for generate description with the audio extracted from the video",
"position": [
4060,
1360
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "GPT-4O"
},
"options": {},
"messages": {
"values": [
{
"role": "system",
"content": "You are an expert assistant in creating engaging social media video titles."
},
{
"content": "=I'm going to upload a video to social media. Here are some examples of descriptions that have worked well on Instagram:\n\nFollow and save for later. Discover InfluencersDe, the AI tool that automates TikTok creation and publishing to drive traffic to your website. Perfect for entrepreneurs and brands.\n#digitalmarketing #ugc #tiktok #ai #influencersde #contentcreation\n\nDiscover the video marketing revolution with InfluencersDe!\n.\n.\n.\n#socialmedia #videomarketing #ai #tiktok #influencersde #growthhacking\n\nDon't miss InfluencersDe, the tool that transforms your marketing strategy with just one click!\n.\n.\n.\n#ugc #ai #tiktok #digitalmarketing #influencersde #branding\n\nCan you create another title for the Instagram post based on this recognized audio from the video?\n\nAudio: {{ $('Get Audio from Video').item.json.text }}\n\nIMPORTANT: Reply only with the description, don't add anything else."
}
]
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"retryOnFail": true,
"typeVersion": 1.4,
"waitBetweenTries": 5000
},
{
"id": "2f9f753d-86f3-4489-9dd2-a691f2da80ba",
"name": "Upload Video and Description to Tiktok",
"type": "n8n-nodes-base.httpRequest",
"notes": "Generate in upload-post.com the token and add to the credentials in the header-> Authorization: Apikey (token here)",
"position": [
4880,
940
],
"parameters": {
"url": "https://api.upload-post.com/api/upload",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "multipart-form-data",
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "title",
"value": "={{ $('Generate Description for Videos in Tiktok and Instagram').item.json.message.content.replaceAll(\"\\\"\", \"\") }}"
},
{
"name": "platform[]",
"value": "tiktok"
},
{
"name": "video",
"parameterType": "formBinaryData",
"inputDataFieldName": "data"
},
{
"name": "user",
"value": "Add user generated in upload-post"
}
]
},
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 4.2
},
{
"id": "4f007ef7-3f0a-4b4d-8dca-96028f29dd0c",
"name": "Upload Video and Description to Instagram",
"type": "n8n-nodes-base.httpRequest",
"notes": "Generate in upload-post.com the token and add to the credentials in the header-> Authorization: Apikey (token here)",
"position": [
4880,
1140
],
"parameters": {
"url": "https://api.upload-post.com/api/upload",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "multipart-form-data",
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "title",
"value": "={{ $('Generate Description for Videos in Tiktok and Instagram').item.json.message.content.replaceAll(\"\\\"\", \"\") }}"
},
{
"name": "platform[]",
"value": "instagram"
},
{
"name": "video",
"parameterType": "formBinaryData",
"inputDataFieldName": "data"
},
{
"name": "user",
"value": "Add user generated in upload-post"
}
]
},
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 4.2
},
{
"id": "3805750b-65c4-4f28-b811-967681eda0ff",
"name": "Upload Video and Description to Youtube",
"type": "n8n-nodes-base.httpRequest",
"notes": "Generate in upload-post.com the token and add to the credentials in the header-> Authorization: Apikey (token here)",
"position": [
4880,
1360
],
"parameters": {
"ur
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleDriveOAuth2ApigoogleSheetsOAuth2ApihttpHeaderAuthopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
AI-Powered Short-Form Video Generator with OpenAI, Flux, Kling, and ElevenLabs and upload to all social networks. Uses httpRequest, openAi, googleDrive, discord. Scheduled trigger; 51 nodes.
Source: https://github.com/n8nKOR/n8n-shared-workflow/blob/62a671327e906c22a40d290b339ff6d2373f8d75/workflows/n8nworkflows/ai/3442.json — 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 comprehensive n8n automation template orchestrates a complete end-to-end workflow for generating engaging short-form Point-of-View (POV) style videos using multiple AI services and automatically
23-fully-automated-ai-video-generation-&-multi-platform-publishing. Uses httpRequest, openAi, googleDrive, discord. Scheduled trigger; 51 nodes.
YouTube Automation Pipeline - Notion + Gemini + CometAPI + JSON2Video. Uses notion, httpRequest, googleDrive, writeBinaryFile. Scheduled trigger; 43 nodes.
The Problem That it Solves
This workflow runs every two minutes to sync a Google Sheets file queue with an OpenAI Vector Store by deleting outdated entries, downloading new files from Google Drive, AWS S3, or a URL, uploading t