AutomationFlowsSocial Media › Create Daily AI News Youtube Shorts with Groq, Voicerss, Pexels and Shotstack

Create Daily AI News Youtube Shorts with Groq, Voicerss, Pexels and Shotstack

ByKanishka Shrivastava @kanishka-shrivastava on n8n.io

This workflow runs daily to turn the latest Artificial Intelligence News RSS headline into a YouTube Shorts video by generating a script with Groq, creating voiceover with VoiceRSS, selecting stock footage from Pexels, rendering with Shotstack, and uploading the finished MP4 to…

Cron / scheduled trigger★★★★☆ complexityAI-powered23 nodesRSS Feed ReadHTTP RequestGroq ChatYouTubeChain Llm
Social Media Trigger: Cron / scheduled Nodes: 23 Complexity: ★★★★☆ AI nodes: yes Added:
Create Daily AI News Youtube Shorts with Groq, Voicerss, Pexels and Shotstack — n8n workflow card showing RSS Feed Read, HTTP Request, Groq Chat integration

This workflow corresponds to n8n.io template #16201 — we link there as the canonical source.

This workflow follows the Chainllm → 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 →

Download .json
{
  "id": "NIGMMSF0t7r5U6RG",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Zyntelliq post",
  "tags": [],
  "nodes": [
    {
      "id": "b2c92aa1-15a0-48dc-a38e-cf2305b196f8",
      "name": "Fetch AI News (RSS)",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        -1952,
        6304
      ],
      "parameters": {
        "url": "https://www.artificialintelligence-news.com/feed/",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "81163e30-4fc1-49bf-9bd5-3bb49785c0ef",
      "name": "Extract Top Story",
      "type": "n8n-nodes-base.set",
      "position": [
        -1744,
        6304
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "title",
              "value": "={{ $json.title }}"
            },
            {
              "name": "summary",
              "value": "={{ $json.contentSnippet || $json.content || $json.summary || '' }}"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "id": "4eb943a3-eae6-47ed-bd76-cbef1446d5b2",
      "name": "Parse Script & Keyword",
      "type": "n8n-nodes-base.set",
      "position": [
        -1216,
        6304
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "script",
              "value": "={{ $json.text }}"
            },
            {
              "name": "keyword",
              "value": "={{ $('Extract Top Story').item.json.title.split(' ').slice(0,2).join(' ') }}"
            },
            {
              "name": "title",
              "value": "={{ $('Extract Top Story').item.json.title }}"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "id": "4858e595-65d2-4589-8af3-dc7e56842175",
      "name": "Merge Audio + Video URLs",
      "type": "n8n-nodes-base.code",
      "position": [
        -464,
        6304
      ],
      "parameters": {
        "jsCode": "const ttsItem = $('Voice RSS').first();\nconst pexItem = $('Pexels').first();\n\nconst videos = pexItem.json.videos || [];\nif (!videos.length) throw new Error('No Pexels videos found.');\n\nconst videoFiles = videos[0].video_files || [];\nconst portrait = videoFiles.find(f => f.width === 1080 && f.height === 1920)\n  || videoFiles.find(f => f.height > f.width)\n  || videoFiles[0];\n\nconst videoUrl = portrait.link;\nconst title = $('Parse Script & Keyword').first().json.title;\n\nreturn [{\n  json: {\n    videoUrl,\n    title: title.slice(0, 80),\n    keyword: 'artificial intelligence technology',\n    description: 'AI news in 45 seconds. Follow @Zyntelliq for daily AI updates.\\n\\n#AINews #Shorts #ArtificialIntelligence #Tech #Zyntelliq'\n  },\n  binary: {\n    audioData: ttsItem.binary.data\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "94261182-d64e-46fe-abc7-d90eea84a6f2",
      "name": "Shotstack \u2013 Start Render",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Free sandbox key from shotstack.io \u2014 200 renders/month.\nReplace YOUR_SHOTSTACK_SANDBOX_KEY.\nReturns a render ID. Next node polls until done.",
      "position": [
        -224,
        6304
      ],
      "parameters": {
        "url": "https://api.shotstack.io/edit/v1/render",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"timeline\": {\n    \"background\": \"#000000\",\n    \"tracks\": [\n      {\n        \"clips\": [{\n          \"asset\": {\n            \"type\": \"video\",\n            \"src\": \"{{ $json.videoUrl }}\",\n            \"volume\": 0\n          },\n          \"start\": 0,\n          \"length\": 60,\n          \"fit\": \"crop\"\n        }]\n      },\n      {\n        \"clips\": [{\n          \"asset\": {\n            \"type\": \"text-to-speech\",\n            \"text\": \"{{ $('Parse Script & Keyword').item.json.script.replace(/\\\"/g, '').replace(/\\n/g, ' ').slice(0,500) }}\",\n            \"voice\": \"Brian\",\n            \"language\": \"en-GB\"\n          },\n          \"start\": 0,\n          \"length\": 60\n        }]\n      }\n    ]\n  },\n  \"output\": {\n    \"format\": \"mp4\",\n    \"resolution\": \"mobile\",\n    \"aspectRatio\": \"9:16\",\n    \"fps\": 30\n  }\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "E0M9QeRYmPey5pKpjjplTYABi2jCtTvnEivK9V81"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4
    },
    {
      "id": "b0cde846-045d-4471-b602-f041e8ddc643",
      "name": "Save Render ID",
      "type": "n8n-nodes-base.set",
      "position": [
        16,
        6304
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "renderId",
              "value": "={{ $json.response.id }}"
            },
            {
              "name": "title",
              "value": "={{ $('Merge Audio + Video URLs').item.json.title }}"
            },
            {
              "name": "description",
              "value": "={{ $('Merge Audio + Video URLs').item.json.description }}"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "id": "f415a769-04d7-4463-b4a4-28ce0bcbe4b3",
      "name": "Wait 30s for Render",
      "type": "n8n-nodes-base.wait",
      "notes": "Shotstack typically takes 20-60s to render. Increase to 60s for longer videos.",
      "position": [
        224,
        6304
      ],
      "parameters": {
        "unit": "seconds",
        "amount": 30
      },
      "typeVersion": 1
    },
    {
      "id": "2710ff5b-d86b-440e-8579-51a50efcc78b",
      "name": "Shotstack \u2013 Get Render URL",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Polls for the final MP4 URL.\nResponse: response.url contains the download link when status is 'done'.",
      "position": [
        448,
        6304
      ],
      "parameters": {
        "url": "=https://api.shotstack.io/edit/v1/render/{{ $json.renderId }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "E0M9QeRYmPey5pKpjjplTYABi2jCtTvnEivK9V81"
            }
          ]
        }
      },
      "typeVersion": 4
    },
    {
      "id": "4e8a7be2-3992-42b2-a3ee-4d4f9b0bfb67",
      "name": "Prepare Upload Data",
      "type": "n8n-nodes-base.set",
      "position": [
        688,
        6304
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "mp4Url",
              "value": "={{ $json.response.url }}"
            },
            {
              "name": "title",
              "value": "={{ $('Save Render ID').item.json.title }}"
            },
            {
              "name": "description",
              "value": "={{ $('Save Render ID').item.json.description }}"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "id": "5eca5492-5fb3-4a67-9de1-3b634333ad58",
      "name": "Groq Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        -1520,
        6528
      ],
      "parameters": {
        "model": "llama-3.1-8b-instant",
        "options": {}
      },
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "28d88a97-805b-4791-bea0-8781d93a1178",
      "name": "Voice RSS",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "No API key needed. Returns MP3 binary.\nVoice options: Brian, Amy, Emma, Geraint, Russell, Nicole, Joey, Justin, Matthew\nMax 500 chars \u2014 script is trimmed automatically.\nOutput is binary data in $binary.data",
      "position": [
        -832,
        6224
      ],
      "parameters": {
        "url": "=https://api.voicerss.org/?key=6907a3c008b14c25960bd57c7346dc1c&hl=en-us&v=Linda&src={{ encodeURIComponent($json.script.slice(0,500)) }}&c=MP3&f=44khz_16bit_stereo",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4
    },
    {
      "id": "a8617c86-8c5b-48c5-9a38-c4b2e2e8bb0a",
      "name": "Pexels",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Free API key from pixabay.com/api/docs\nReplace YOUR_PIXABAY_KEY with your actual key.\nReturns vertical video URLs.",
      "position": [
        -832,
        6464
      ],
      "parameters": {
        "url": "=https://api.pexels.com/videos/search?query={{ encodeURIComponent($json.keyword) }}&orientation=portrait&per_page=5",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "lrV7QgIMXOsvaeNa9e2Ivp1gGcqZqk33JXjQUPsRFteo7jLNiqpbDMU9"
            }
          ]
        }
      },
      "typeVersion": 4
    },
    {
      "id": "80b75ee9-f0d4-4dac-8847-1353d00e962a",
      "name": "Upload a video",
      "type": "n8n-nodes-base.youTube",
      "position": [
        1168,
        6304
      ],
      "parameters": {
        "title": "={{ $json.title }}",
        "options": {
          "description": "={{ $json.description }}",
          "privacyStatus": "public"
        },
        "resource": "video",
        "operation": "upload",
        "categoryId": "28",
        "regionCode": "IN",
        "binaryProperty": "=data"
      },
      "credentials": {
        "youTubeOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c7049c79-ea34-4aed-b137-531163cf67d2",
      "name": "Download MP4",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        896,
        6304
      ],
      "parameters": {
        "url": "={{ $json.mp4Url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "1d5549c2-b9ba-4ae8-b4de-815cc6246782",
      "name": "Generate Script",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -1520,
        6304
      ],
      "parameters": {
        "text": "=You are a YouTube Shorts scriptwriter for Zyntelliq, a dark futuristic AI tech channel.\n\nWrite a punchy 45-second voiceover script (max 120 words) about:\n\nTitle: {{ $json.title }}\nSummary: {{ $json.summary }}\n\nRules:\n- Hook in the first 3 words\n- No filler words\n- No stage directions, no parentheses, no visual cues\n- Plain spoken words only\n- End with exactly: Follow Zyntelliq for more",
        "promptType": "define"
      },
      "typeVersion": 1.4
    },
    {
      "id": "bc5c45c4-dfc7-40fe-948e-8d63d8f66df9",
      "name": "Daily Schedule",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -2176,
        6304
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 24
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2d15f135-461f-4249-9c3f-4229c5842708",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3120,
        5856
      ],
      "parameters": {
        "width": 736,
        "height": 480,
        "content": "\ud83e\udd16 AUTO AI NEWS YOUTUBE SHORTS PIPELINE\n\nThis workflow runs daily and fully automates a YouTube Shorts channel.\n\nWHAT IT DOES:\n1. Fetches the latest AI news headline from RSS\n2. Generates a 45-second voiceover script using Groq (Llama 3)\n3. Converts the script to speech via VoiceRSS\n4. Finds a matching portrait video on Pexels\n5. Renders the final 9:16 MP4 using Shotstack (cloud-based)\n6. Downloads the rendered video\n7. Uploads it directly to YouTube\n\n\u26a0\ufe0f BEFORE YOU START \u2014 set your API keys in the \u2699\ufe0f Configure Here node.\n\nREQUIRED KEYS:\n- Groq API key (free) \u2192 console.groq.com\n- VoiceRSS API key (free) \u2192 voicerss.org\n- Pexels API key (free) \u2192 pexels.com/api\n- Shotstack API key (free sandbox) \u2192 shotstack.io\n- YouTube OAuth2 credentials \u2192 Google Cloud Console"
      },
      "typeVersion": 1
    },
    {
      "id": "eda7902e-f438-4691-a533-f49492e2b35b",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2224,
        6016
      ],
      "parameters": {
        "width": 560,
        "height": 208,
        "content": "\u2699\ufe0f SET YOUR API KEYS HERE\n\nReplace these 4 values before activating:\n- YOUR_GROQ_API_KEY\n- YOUR_VOICERSS_API_KEY\n- YOUR_PEXELS_API_KEY\n- YOUR_SHOTSTACK_API_KEY\n\nAlso connect your YouTube account in the Upload node credentials."
      },
      "typeVersion": 1
    },
    {
      "id": "bca75529-edbd-4315-92cd-b041025d699a",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1568,
        6016
      ],
      "parameters": {
        "width": 464,
        "height": 224,
        "content": "\u270d\ufe0f SCRIPT GENERATION\n\nUses Groq (Llama 3) to write a 45-second spoken voiceover.\nRules enforced in the prompt:\n- Hook in the first 3 words\n- No stage directions or visual cues\n- Plain spoken words only\n- Max 120 words\n\n\ud83d\udca1 Edit the prompt to match your channel name and tone."
      },
      "typeVersion": 1
    },
    {
      "id": "f8fc74e5-c39e-4eb3-a196-6b1253978727",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1024,
        6016
      ],
      "parameters": {
        "width": 480,
        "height": 192,
        "content": "\ud83c\udf99\ufe0f TEXT-TO-SPEECH\n\nConverts the script to MP3 using VoiceRSS (free tier).\nScript is auto-trimmed to 500 characters.\n\nAvailable voices: Linda, Amy, Emma, Brian, Joey, Matthew, Geraint, Russell, Nicole, Justin\n\nChange the &v= parameter to switch voices.\nGet your free key at: voicerss.org"
      },
      "typeVersion": 1
    },
    {
      "id": "48280114-4f5b-4784-8b98-e08f263a6e53",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -944,
        6608
      ],
      "parameters": {
        "width": 368,
        "height": 240,
        "content": "\ud83c\udfac STOCK VIDEO SEARCH\n\nSearches Pexels for portrait-orientation videos matching the news keyword.\nAutomatically picks 1080x1920 resolution where available.\n\n\ud83d\udca1 The keyword is auto-extracted from the headline (first 2 words).\nYou can override it in the Parse Script & Keyword node.\n\nGet your free API key at: pexels.com/api"
      },
      "typeVersion": 1
    },
    {
      "id": "1663a267-95b8-40b1-adb0-e8abba897c3e",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        6080
      ],
      "parameters": {
        "width": 816,
        "height": 176,
        "content": "\ud83c\udf9e\ufe0f CLOUD VIDEO RENDERING\n\nShotstack combines the stock video + TTS audio into a 9:16 MP4 in the cloud.\nNo FFmpeg. No local processing. Fully serverless.\n\nFree sandbox = 200 renders/month \u2192 shotstack.io\nThe workflow waits 30 seconds then polls for the finished URL.\n\n\ud83d\udca1 Increase the Wait node to 60s if your videos are longer or rendering times out."
      },
      "typeVersion": 1
    },
    {
      "id": "c971220a-71df-4671-af8d-827cc1c93b1c",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        992,
        6016
      ],
      "parameters": {
        "width": 464,
        "height": 256,
        "content": "\ud83d\udce4 YOUTUBE UPLOAD\n\nUploads the final MP4 directly to your YouTube channel.\n\nDefault settings:\n- Category: Science & Technology (ID 28)\n- Privacy: public\n- Region: IN\n\n\ud83d\udca1 Change privacyStatus to \"private\" if you want to review before publishing.\nConnect your YouTube account via Google OAuth2 credentials."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "callerPolicy": "workflowsFromSameOwner",
    "timeSavedMode": "fixed",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "2998f708-427d-4798-bc6c-20ce427cb726",
  "connections": {
    "Pexels": {
      "main": [
        [
          {
            "node": "Merge Audio + Video URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Voice RSS": {
      "main": [
        [
          {
            "node": "Merge Audio + Video URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download MP4": {
      "main": [
        [
          {
            "node": "Upload a video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily Schedule": {
      "main": [
        [
          {
            "node": "Fetch AI News (RSS)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Render ID": {
      "main": [
        [
          {
            "node": "Wait 30s for Render",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Script": {
      "main": [
        [
          {
            "node": "Parse Script & Keyword",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Script",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Extract Top Story": {
      "main": [
        [
          {
            "node": "Generate Script",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch AI News (RSS)": {
      "main": [
        [
          {
            "node": "Extract Top Story",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Upload Data": {
      "main": [
        [
          {
            "node": "Download MP4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 30s for Render": {
      "main": [
        [
          {
            "node": "Shotstack \u2013 Get Render URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Script & Keyword": {
      "main": [
        [
          {
            "node": "Voice RSS",
            "type": "main",
            "index": 0
          },
          {
            "node": "Pexels",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Audio + Video URLs": {
      "main": [
        [
          {
            "node": "Shotstack \u2013 Start Render",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shotstack \u2013 Start Render": {
      "main": [
        [
          {
            "node": "Save Render ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shotstack \u2013 Get Render URL": {
      "main": [
        [
          {
            "node": "Prepare Upload Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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.

Pro

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

About this workflow

This workflow runs daily to turn the latest Artificial Intelligence News RSS headline into a YouTube Shorts video by generating a script with Groq, creating voiceover with VoiceRSS, selecting stock footage from Pexels, rendering with Shotstack, and uploading the finished MP4 to…

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

More Social Media workflows → · Browse all categories →

Related workflows

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

Social Media

This workflow demonstrates how to combine trend harvesting, channel intelligence, and AI scoring to select the best daily content ideas for short-form videos (YouTube Shorts / TikTok).

YouTube, OpenRouter Chat, RSS Feed Read +4
Social Media

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

HTTP Request, Google Sheets, RSS Feed Read +3
Social Media

Multi Platform Content Generator from YouTube using AI & RSS. Uses httpRequest, googleSheets, rssFeedRead, lmChatOpenRouter. Scheduled trigger; 37 nodes.

HTTP Request, Google Sheets, RSS Feed Read +3
Social Media

Multi Platform Content Generator from YouTube using AI & RSS. Uses httpRequest, googleSheets, rssFeedRead, lmChatOpenRouter. Scheduled trigger; 37 nodes.

HTTP Request, Google Sheets, RSS Feed Read +3
Social Media

Blogdan UGC (blogger). Uses googleSheets, httpRequest, facebookGraphApi, openAi. Scheduled trigger; 34 nodes.

Google Sheets, HTTP Request, Facebook Graph Api +4