Quick Overview
This workflow accepts a direct MP4 URL via webhook or manual test, transcribes the opening with ElevenLabs Scribe, uses OpenRouter to pick highlight ranges, and builds Zvid projects to render captioned 1080x1920 Shorts (or save editor drafts) before returning clip links in the webhook response.
How it works
- Receives a direct video URL (and optional title/layout) via a POST webhook, or runs manually with a built-in sample video.
- Downloads a byte-range sample of the source video and sends it to ElevenLabs Speech-to-Text (Scribe) to get word-level timestamps.
- Formats the transcript into an indexed prompt and asks OpenRouter (Gemini model) to select non-overlapping highlight ranges and short on-screen titles.
- Converts the chosen word ranges into exact start/end timestamps, trims clips to the configured min/max duration, and prepares per-clip caption timing.
- Generates a Zvid render project JSON for each clip (vertical layout, captions, branding, and progress bar) and validates it with Zvid’s render validator.
- If dryRun is enabled, saves each clip as a Zvid editor draft and returns a summary with credit estimates and editor links.
- If dryRun is disabled, submits each clip to Zvid for rendering, polls until completion (with safe retry behavior on capacity limits), and responds with the final rendered clip URLs.
Setup
- Install the community node package
@zvid/n8n-nodes-zvid and create a Zvid API credential (API key, base URL https://api.zvid.io) for all Zvid nodes.
- Add an ElevenLabs Header Auth credential (xi-api-key) with Speech-to-Text access for the transcription request.
- Add an OpenRouter API credential and confirm the selected model in the configuration (default
google/gemini-2.5-flash) is available to your account.
- Set your branding and behavior in the Config node (for example handle, colors, clipCount, clipSeconds, dryRun, pollSeconds, and timeoutMinutes).
- If using the webhook trigger, copy the production webhook URL and configure your source system to POST JSON like
{ "videoUrl": "https://...mp4", "title": "...", "layout": "fit|fill" } using a directly downloadable MP4 URL.