{
  "schemaVersion": "1.0",
  "item": {
    "slug": "short-video-creator",
    "name": "Short-Form Video Creator for Social Media",
    "source": "tencent",
    "type": "skill",
    "category": "内容创作",
    "sourceUrl": "https://clawhub.ai/g4dr/short-video-creator",
    "canonicalUrl": "https://clawhub.ai/g4dr/short-video-creator",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/short-video-creator",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=short-video-creator",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/short-video-creator"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/short-video-creator",
    "agentPageUrl": "https://openagent3.xyz/skills/short-video-creator/agent",
    "manifestUrl": "https://openagent3.xyz/skills/short-video-creator/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/short-video-creator/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Overview",
        "body": "This skill enables Claude to transform a text script or idea into a fully produced\nshort-form video — ready to publish as an Instagram Reel, YouTube Short, or TikTok —\nusing the InVideo AI platform and its API.\n\nNo video editing experience required. Just provide a script or topic, and Claude handles the rest.\n\n🔗 Sign up for InVideo here: https://invideo.sjv.io/TBB"
      },
      {
        "title": "What This Skill Does",
        "body": "Convert a raw script into a complete short-form video with visuals and voiceover\nGenerate videos optimized for Instagram Reels, YouTube Shorts, and TikTok\nAutomatically match stock footage, music, and transitions to the script content\nAdd subtitles, captions, and text overlays for better engagement\nProduce videos in the correct 9:16 vertical format for all short-form platforms\nExport in MP4 ready to upload directly to any platform"
      },
      {
        "title": "Step 1 — Get Your InVideo API Access",
        "body": "Go to https://invideo.sjv.io/TBB and create an account\nChoose a plan that includes API access (Business plan or above)\nNavigate to Settings → API or Developer Settings\nCopy your API Key: iv_api_xxxxxxxxxxxxxxxx\nStore it safely:\nexport INVIDEO_API_KEY=iv_api_xxxxxxxxxxxxxxxx\n\nInVideo offers a free trial — sign up at https://invideo.sjv.io/TBB to explore the platform\nbefore committing to a paid plan."
      },
      {
        "title": "Step 2 — Install Dependencies",
        "body": "npm install axios form-data fs-extra"
      },
      {
        "title": "InVideo API — Core Endpoints",
        "body": "Base URL: https://api.invideo.io/v1\n\nAll requests require:\n\nAuthorization: Bearer YOUR_INVIDEO_API_KEY\nContent-Type: application/json"
      },
      {
        "title": "Generate a Video from Script",
        "body": "POST https://api.invideo.io/v1/videos/generate"
      },
      {
        "title": "Get Video Generation Status",
        "body": "GET https://api.invideo.io/v1/videos/{videoId}/status"
      },
      {
        "title": "Download / Export Video",
        "body": "GET https://api.invideo.io/v1/videos/{videoId}/export"
      },
      {
        "title": "Generate a TikTok / Reel from a Script",
        "body": "import axios from 'axios';\n\nconst client = axios.create({\n  baseURL: 'https://api.invideo.io/v1',\n  headers: {\n    'Authorization': `Bearer ${process.env.INVIDEO_API_KEY}`,\n    'Content-Type': 'application/json'\n  }\n});\n\nconst script = `\n  Did you know that 90% of startups fail in their first year?\n  Here are 3 things the successful 10% do differently.\n  Number 1: They talk to customers before building anything.\n  Number 2: They launch ugly and iterate fast.\n  Number 3: They obsess over retention, not acquisition.\n  Follow for more startup insights every day.\n`;\n\nconst response = await client.post('/videos/generate', {\n  script: script,\n  format: \"9:16\",           // vertical for Reels / TikTok / Shorts\n  duration: \"short\",        // 15–60 seconds\n  style: \"dynamic\",         // energetic cuts and transitions\n  voiceover: {\n    enabled: true,\n    voice: \"en-US-male-1\",  // choose from available voices\n    speed: 1.1              // slightly faster for short-form\n  },\n  captions: {\n    enabled: true,\n    style: \"bold-bottom\",   // TikTok-style captions\n    highlight: true         // highlight word as it's spoken\n  },\n  music: {\n    enabled: true,\n    mood: \"upbeat\",\n    volume: 0.3             // background music volume (0–1)\n  },\n  branding: {\n    watermark: false\n  }\n});\n\nconst videoId = response.data.videoId;\nconsole.log(\"Video generation started. ID:\", videoId);"
      },
      {
        "title": "Poll for Completion and Get Download URL",
        "body": "async function waitForVideo(videoId, maxWaitMs = 120000) {\n  const start = Date.now();\n\n  while (Date.now() - start < maxWaitMs) {\n    await new Promise(r => setTimeout(r, 5000)); // poll every 5s\n\n    const status = await client.get(`/videos/${videoId}/status`);\n    const { state, progress, exportUrl } = status.data;\n\n    console.log(`Status: ${state} — ${progress}% complete`);\n\n    if (state === \"completed\") {\n      console.log(\"Video ready:\", exportUrl);\n      return exportUrl;\n    }\n\n    if (state === \"failed\") {\n      throw new Error(\"Video generation failed — check your script and settings\");\n    }\n  }\n\n  throw new Error(\"Timeout — video took too long to generate\");\n}\n\nconst downloadUrl = await waitForVideo(videoId);"
      },
      {
        "title": "Full Pipeline: Script → Video → Download",
        "body": "import axios from 'axios';\nimport { writeFileSync } from 'fs';\n\nasync function scriptToShortVideo(script, outputPath = './output.mp4') {\n  const client = axios.create({\n    baseURL: 'https://api.invideo.io/v1',\n    headers: { Authorization: `Bearer ${process.env.INVIDEO_API_KEY}` }\n  });\n\n  // 1 — Start generation\n  const { data } = await client.post('/videos/generate', {\n    script,\n    format: \"9:16\",\n    duration: \"short\",\n    style: \"dynamic\",\n    voiceover: { enabled: true, voice: \"en-US-female-1\", speed: 1.05 },\n    captions: { enabled: true, style: \"bold-bottom\", highlight: true },\n    music: { enabled: true, mood: \"upbeat\", volume: 0.25 }\n  });\n\n  const videoId = data.videoId;\n  console.log(`Generation started — ID: ${videoId}`);\n\n  // 2 — Wait for completion\n  let exportUrl = null;\n  while (!exportUrl) {\n    await new Promise(r => setTimeout(r, 6000));\n    const status = await client.get(`/videos/${videoId}/status`);\n    if (status.data.state === \"completed\") exportUrl = status.data.exportUrl;\n    if (status.data.state === \"failed\") throw new Error(\"Generation failed\");\n    console.log(`Progress: ${status.data.progress}%`);\n  }\n\n  // 3 — Download the video\n  const videoStream = await axios.get(exportUrl, { responseType: 'arraybuffer' });\n  writeFileSync(outputPath, videoStream.data);\n  console.log(`Video saved to ${outputPath}`);\n\n  return { videoId, exportUrl, localPath: outputPath };\n}\n\n// Usage\nawait scriptToShortVideo(\n  \"3 productivity hacks that changed my life. Number 1: Time blocking...\",\n  \"./my-reel.mp4\"\n);"
      },
      {
        "title": "Batch Generate Multiple Videos",
        "body": "const scripts = [\n  { topic: \"morning routine tips\",     voice: \"en-US-female-1\", mood: \"calm\" },\n  { topic: \"5 foods to boost energy\",  voice: \"en-US-male-1\",   mood: \"upbeat\" },\n  { topic: \"how to learn faster\",      voice: \"en-US-female-2\", mood: \"inspiring\" }\n];\n\nconst jobs = await Promise.all(\n  scripts.map(s =>\n    client.post('/videos/generate', {\n      script: s.topic,\n      format: \"9:16\",\n      duration: \"short\",\n      style: \"dynamic\",\n      voiceover: { enabled: true, voice: s.voice },\n      music: { enabled: true, mood: s.mood, volume: 0.3 },\n      captions: { enabled: true, style: \"bold-bottom\" }\n    })\n  )\n);\n\nconst videoIds = jobs.map(j => j.data.videoId);\nconsole.log(\"All jobs started:\", videoIds);"
      },
      {
        "title": "Video Creation Workflow",
        "body": "When asked to create a short-form video, Claude will:\n\nAnalyze the script or topic provided by the user\nOptimize the script for short-form pacing (hook in first 3 seconds)\nSelect the right style, voice, music mood, and caption style\nCall the InVideo API to generate the video\nPoll the status endpoint until the video is ready\nReturn the download URL or save the MP4 locally\nSuggest platform-specific tweaks (TikTok vs Reels vs Shorts)"
      },
      {
        "title": "Platform-Specific Settings",
        "body": "PlatformFormatDurationCaption StyleMusicTikTok9:1615–60sBold bottom, word highlightUpbeat / trendingInstagram Reels9:1615–90sBold bottom or centeredUpbeat / chillYouTube Shorts9:1615–60sClean bottomOptionalLinkedIn Video16:9 or 1:130–90sProfessional, top-alignedSubtle / none"
      },
      {
        "title": "Script Optimization Tips (Claude Will Apply These)",
        "body": "Hook in 3 seconds — start with a bold claim, question, or shocking stat\nOne idea per video — don't try to cover too much ground\nShort sentences — 8–12 words max per caption line\nCall to action at the end — \"Follow for more\", \"Comment below\", \"Save this\"\nConversational tone — write how people talk, not how they write\nNumbers perform — \"3 tips\", \"5 mistakes\", \"1 rule\" always outperform vague titles"
      },
      {
        "title": "Normalized Output Schema",
        "body": "{\n  \"videoId\": \"iv_7f3k29xm\",\n  \"title\": \"3 Startup Lessons Nobody Tells You\",\n  \"platform\": \"tiktok\",\n  \"format\": \"9:16\",\n  \"durationSeconds\": 42,\n  \"exportUrl\": \"https://cdn.invideo.io/exports/iv_7f3k29xm.mp4\",\n  \"captions\": true,\n  \"voiceover\": \"en-US-male-1\",\n  \"musicMood\": \"upbeat\",\n  \"createdAt\": \"2025-02-25T10:00:00Z\",\n  \"status\": \"completed\"\n}"
      },
      {
        "title": "Best Practices",
        "body": "Always start with a strong hook — the first 2–3 seconds determine if users keep watching\nKeep scripts between 120–200 words for a 30–60 second video\nUse bold captions with word highlighting — it significantly increases watch time\nSet music volume to 0.2–0.3 so it never overpowers the voiceover\nGenerate 3–5 variations of the same script with different styles to A/B test\nFor TikTok, use a slightly faster voiceover speed (1.1x) to match platform energy\nAlways review the video before publishing — AI generations may need minor tweaks"
      },
      {
        "title": "Error Handling",
        "body": "try {\n  const response = await client.post('/videos/generate', payload);\n  return response.data.videoId;\n} catch (error) {\n  if (error.response?.status === 401) throw new Error(\"Invalid InVideo API key\");\n  if (error.response?.status === 429) throw new Error(\"Rate limit hit — wait before retrying\");\n  if (error.response?.status === 400) throw new Error(`Bad request: ${error.response.data.message}`);\n  throw error;\n}"
      },
      {
        "title": "Requirements",
        "body": "An InVideo account → https://invideo.sjv.io/TBB\nA plan with API access enabled (Business plan or above)\nA valid API Key from your InVideo settings\nNode.js 18+ and axios for API calls\nOptional: ffmpeg locally if you need to post-process or compress the exported MP4"
      }
    ],
    "body": "Short-Form Video Creation for Social Media Skill\nOverview\n\nThis skill enables Claude to transform a text script or idea into a fully produced short-form video — ready to publish as an Instagram Reel, YouTube Short, or TikTok — using the InVideo AI platform and its API.\n\nNo video editing experience required. Just provide a script or topic, and Claude handles the rest.\n\n🔗 Sign up for InVideo here: https://invideo.sjv.io/TBB\n\nWhat This Skill Does\nConvert a raw script into a complete short-form video with visuals and voiceover\nGenerate videos optimized for Instagram Reels, YouTube Shorts, and TikTok\nAutomatically match stock footage, music, and transitions to the script content\nAdd subtitles, captions, and text overlays for better engagement\nProduce videos in the correct 9:16 vertical format for all short-form platforms\nExport in MP4 ready to upload directly to any platform\nStep 1 — Get Your InVideo API Access\nGo to https://invideo.sjv.io/TBB and create an account\nChoose a plan that includes API access (Business plan or above)\nNavigate to Settings → API or Developer Settings\nCopy your API Key: iv_api_xxxxxxxxxxxxxxxx\nStore it safely:\nexport INVIDEO_API_KEY=iv_api_xxxxxxxxxxxxxxxx\n\n\nInVideo offers a free trial — sign up at https://invideo.sjv.io/TBB to explore the platform before committing to a paid plan.\n\nStep 2 — Install Dependencies\nnpm install axios form-data fs-extra\n\nInVideo API — Core Endpoints\n\nBase URL: https://api.invideo.io/v1\n\nAll requests require:\n\nAuthorization: Bearer YOUR_INVIDEO_API_KEY\nContent-Type: application/json\n\nGenerate a Video from Script\nPOST https://api.invideo.io/v1/videos/generate\n\nGet Video Generation Status\nGET https://api.invideo.io/v1/videos/{videoId}/status\n\nDownload / Export Video\nGET https://api.invideo.io/v1/videos/{videoId}/export\n\nExamples\nGenerate a TikTok / Reel from a Script\nimport axios from 'axios';\n\nconst client = axios.create({\n  baseURL: 'https://api.invideo.io/v1',\n  headers: {\n    'Authorization': `Bearer ${process.env.INVIDEO_API_KEY}`,\n    'Content-Type': 'application/json'\n  }\n});\n\nconst script = `\n  Did you know that 90% of startups fail in their first year?\n  Here are 3 things the successful 10% do differently.\n  Number 1: They talk to customers before building anything.\n  Number 2: They launch ugly and iterate fast.\n  Number 3: They obsess over retention, not acquisition.\n  Follow for more startup insights every day.\n`;\n\nconst response = await client.post('/videos/generate', {\n  script: script,\n  format: \"9:16\",           // vertical for Reels / TikTok / Shorts\n  duration: \"short\",        // 15–60 seconds\n  style: \"dynamic\",         // energetic cuts and transitions\n  voiceover: {\n    enabled: true,\n    voice: \"en-US-male-1\",  // choose from available voices\n    speed: 1.1              // slightly faster for short-form\n  },\n  captions: {\n    enabled: true,\n    style: \"bold-bottom\",   // TikTok-style captions\n    highlight: true         // highlight word as it's spoken\n  },\n  music: {\n    enabled: true,\n    mood: \"upbeat\",\n    volume: 0.3             // background music volume (0–1)\n  },\n  branding: {\n    watermark: false\n  }\n});\n\nconst videoId = response.data.videoId;\nconsole.log(\"Video generation started. ID:\", videoId);\n\nPoll for Completion and Get Download URL\nasync function waitForVideo(videoId, maxWaitMs = 120000) {\n  const start = Date.now();\n\n  while (Date.now() - start < maxWaitMs) {\n    await new Promise(r => setTimeout(r, 5000)); // poll every 5s\n\n    const status = await client.get(`/videos/${videoId}/status`);\n    const { state, progress, exportUrl } = status.data;\n\n    console.log(`Status: ${state} — ${progress}% complete`);\n\n    if (state === \"completed\") {\n      console.log(\"Video ready:\", exportUrl);\n      return exportUrl;\n    }\n\n    if (state === \"failed\") {\n      throw new Error(\"Video generation failed — check your script and settings\");\n    }\n  }\n\n  throw new Error(\"Timeout — video took too long to generate\");\n}\n\nconst downloadUrl = await waitForVideo(videoId);\n\nFull Pipeline: Script → Video → Download\nimport axios from 'axios';\nimport { writeFileSync } from 'fs';\n\nasync function scriptToShortVideo(script, outputPath = './output.mp4') {\n  const client = axios.create({\n    baseURL: 'https://api.invideo.io/v1',\n    headers: { Authorization: `Bearer ${process.env.INVIDEO_API_KEY}` }\n  });\n\n  // 1 — Start generation\n  const { data } = await client.post('/videos/generate', {\n    script,\n    format: \"9:16\",\n    duration: \"short\",\n    style: \"dynamic\",\n    voiceover: { enabled: true, voice: \"en-US-female-1\", speed: 1.05 },\n    captions: { enabled: true, style: \"bold-bottom\", highlight: true },\n    music: { enabled: true, mood: \"upbeat\", volume: 0.25 }\n  });\n\n  const videoId = data.videoId;\n  console.log(`Generation started — ID: ${videoId}`);\n\n  // 2 — Wait for completion\n  let exportUrl = null;\n  while (!exportUrl) {\n    await new Promise(r => setTimeout(r, 6000));\n    const status = await client.get(`/videos/${videoId}/status`);\n    if (status.data.state === \"completed\") exportUrl = status.data.exportUrl;\n    if (status.data.state === \"failed\") throw new Error(\"Generation failed\");\n    console.log(`Progress: ${status.data.progress}%`);\n  }\n\n  // 3 — Download the video\n  const videoStream = await axios.get(exportUrl, { responseType: 'arraybuffer' });\n  writeFileSync(outputPath, videoStream.data);\n  console.log(`Video saved to ${outputPath}`);\n\n  return { videoId, exportUrl, localPath: outputPath };\n}\n\n// Usage\nawait scriptToShortVideo(\n  \"3 productivity hacks that changed my life. Number 1: Time blocking...\",\n  \"./my-reel.mp4\"\n);\n\nBatch Generate Multiple Videos\nconst scripts = [\n  { topic: \"morning routine tips\",     voice: \"en-US-female-1\", mood: \"calm\" },\n  { topic: \"5 foods to boost energy\",  voice: \"en-US-male-1\",   mood: \"upbeat\" },\n  { topic: \"how to learn faster\",      voice: \"en-US-female-2\", mood: \"inspiring\" }\n];\n\nconst jobs = await Promise.all(\n  scripts.map(s =>\n    client.post('/videos/generate', {\n      script: s.topic,\n      format: \"9:16\",\n      duration: \"short\",\n      style: \"dynamic\",\n      voiceover: { enabled: true, voice: s.voice },\n      music: { enabled: true, mood: s.mood, volume: 0.3 },\n      captions: { enabled: true, style: \"bold-bottom\" }\n    })\n  )\n);\n\nconst videoIds = jobs.map(j => j.data.videoId);\nconsole.log(\"All jobs started:\", videoIds);\n\nVideo Creation Workflow\n\nWhen asked to create a short-form video, Claude will:\n\nAnalyze the script or topic provided by the user\nOptimize the script for short-form pacing (hook in first 3 seconds)\nSelect the right style, voice, music mood, and caption style\nCall the InVideo API to generate the video\nPoll the status endpoint until the video is ready\nReturn the download URL or save the MP4 locally\nSuggest platform-specific tweaks (TikTok vs Reels vs Shorts)\nPlatform-Specific Settings\nPlatform\tFormat\tDuration\tCaption Style\tMusic\nTikTok\t9:16\t15–60s\tBold bottom, word highlight\tUpbeat / trending\nInstagram Reels\t9:16\t15–90s\tBold bottom or centered\tUpbeat / chill\nYouTube Shorts\t9:16\t15–60s\tClean bottom\tOptional\nLinkedIn Video\t16:9 or 1:1\t30–90s\tProfessional, top-aligned\tSubtle / none\nScript Optimization Tips (Claude Will Apply These)\nHook in 3 seconds — start with a bold claim, question, or shocking stat\nOne idea per video — don't try to cover too much ground\nShort sentences — 8–12 words max per caption line\nCall to action at the end — \"Follow for more\", \"Comment below\", \"Save this\"\nConversational tone — write how people talk, not how they write\nNumbers perform — \"3 tips\", \"5 mistakes\", \"1 rule\" always outperform vague titles\nNormalized Output Schema\n{\n  \"videoId\": \"iv_7f3k29xm\",\n  \"title\": \"3 Startup Lessons Nobody Tells You\",\n  \"platform\": \"tiktok\",\n  \"format\": \"9:16\",\n  \"durationSeconds\": 42,\n  \"exportUrl\": \"https://cdn.invideo.io/exports/iv_7f3k29xm.mp4\",\n  \"captions\": true,\n  \"voiceover\": \"en-US-male-1\",\n  \"musicMood\": \"upbeat\",\n  \"createdAt\": \"2025-02-25T10:00:00Z\",\n  \"status\": \"completed\"\n}\n\nBest Practices\nAlways start with a strong hook — the first 2–3 seconds determine if users keep watching\nKeep scripts between 120–200 words for a 30–60 second video\nUse bold captions with word highlighting — it significantly increases watch time\nSet music volume to 0.2–0.3 so it never overpowers the voiceover\nGenerate 3–5 variations of the same script with different styles to A/B test\nFor TikTok, use a slightly faster voiceover speed (1.1x) to match platform energy\nAlways review the video before publishing — AI generations may need minor tweaks\nError Handling\ntry {\n  const response = await client.post('/videos/generate', payload);\n  return response.data.videoId;\n} catch (error) {\n  if (error.response?.status === 401) throw new Error(\"Invalid InVideo API key\");\n  if (error.response?.status === 429) throw new Error(\"Rate limit hit — wait before retrying\");\n  if (error.response?.status === 400) throw new Error(`Bad request: ${error.response.data.message}`);\n  throw error;\n}\n\nRequirements\nAn InVideo account → https://invideo.sjv.io/TBB\nA plan with API access enabled (Business plan or above)\nA valid API Key from your InVideo settings\nNode.js 18+ and axios for API calls\nOptional: ffmpeg locally if you need to post-process or compress the exported MP4"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/g4dr/short-video-creator",
    "publisherUrl": "https://clawhub.ai/g4dr/short-video-creator",
    "owner": "g4dr",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/short-video-creator",
    "downloadUrl": "https://openagent3.xyz/downloads/short-video-creator",
    "agentUrl": "https://openagent3.xyz/skills/short-video-creator/agent",
    "manifestUrl": "https://openagent3.xyz/skills/short-video-creator/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/short-video-creator/agent.md"
  }
}